#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()
В качестве альтернативы, если вы хотите напрямую манипулировать информацией о графике, а не базовыми данными, вы можете получить прямой доступ к именам легенд:
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'}