Как настроить легенды seaborn.scatterplot?

#seaborn #legend

#seaborn #легенда

Вопрос:

Я построил диаграмму рассеяния с помощью библиотеки seaborn, и я хочу изменить текст легенды, но не знаю, как это сделать.

пример: ниже приведен набор данных iris со столбцами видов, закодированными в 0/1/2 для каждого вида.

 plt.figure(figsize=(8,8))
pl = sns.scatterplot(x='petal_length', y ='petal_width', hue='Species', data=data, s=40,
                palette='Set1', legend='full')
  

введите описание изображения здесь

Я хочу изменить текст легенды с [0, 1, 2] на [‘setosa’, ‘versicolor’, ‘virginica’].
кто-нибудь может помочь.

Ответ №1:

Во-первых, Seaborn (и Matplotlib) обычно выбирают метки для добавления в легенду hue из уникальных значений массива, который вы предоставляете как hue . Итак, в качестве первого шага убедитесь, что столбец Species в вашем фрейме данных действительно содержит значения «setosa», «versicolor», «virginica». Если нет, то одним из решений является временное map присвоение им других значений с целью построения графика:

 legend_map = {0: 'setosa',
              1: 'versicolor',
              2: 'virginica'}

plt.figure(figsize=(8,8))
ax = sns.scatterplot(x=data['petal_length'], y =data['petal_width'], hue=data['species'].map(legend_map), 
                     s=40, palette='Set1', legend='full')
plt.show()
  

диаграмма рассеяния набора данных iris

В качестве альтернативы, если вы хотите напрямую манипулировать информацией о графике, а не базовыми данными, вы можете получить прямой доступ к именам легенд:

 plt.figure(figsize=(8,8))
ax = sns.scatterplot(x='petal_length', y ='petal_width', hue='species', data=data, s=40,
                 palette='Set1', legend='full')
l = ax.legend()
l.get_texts()[0].set_text('Species') # You can also change the legend title
l.get_texts()[1].set_text('Setosa')
l.get_texts()[2].set_text('Versicolor')
l.get_texts()[3].set_text('Virginica')
plt.show()
  

Эта методология позволяет также изменять заголовок легенды, если это необходимо.

Комментарии:

1. Большое спасибо за ваш ответ!! Я пробовал много других вещей раньше, но ничего не получилось.

2. что делать, если я хочу удалить 0-й текст. как это сделать. Я пытался set_text('') , но это оставляет пустую строку, которая мне не нужна.

3. К тому времени местоположения в легенде будут исправлены, поэтому вы не можете просто удалить их. Один из приемов заключается в нанесении каждого «вида» (или категории) на отдельную ось, и когда вы дойдете до того, который хотите опустить в легенде, укажите label='_no_legend_' . В качестве ярлыка вы можете сопоставить этот вид / категорию с именем, начинающимся с understore, и по соглашению оно не будет отображаться в легенде: legend_map = {'setosa': '_setosa', 'versicolor': 'versicolor', 'virginica': 'virginica'}