如何自定义 seaborn.scatterplot 图例?
Posted
技术标签:
【中文标题】如何自定义 seaborn.scatterplot 图例?【英文标题】:How to customize seaborn.scatterplot legends? 【发布时间】:2021-01-06 15:02:44 【问题描述】:我用 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()
如果需要,此方法还允许您更改图例标题。
【讨论】:
非常感谢您的回答!!我之前尝试了很多其他方法,但没有成功。 如果我想删除第 0 个文本怎么办。怎么做。我尝试set_text('')
,但它留下了我不想要的空白行。
是的,图例中的位置到那时已固定,因此您不能仅将其删除。一个技巧是在单独的斧头上绘制每个“物种”(或类别),当您到达要在图例中省略的那个时,指定label='_no_legend_'
。作为一种快捷方式,您可以将该物种/类别映射到以 understore 开头的名称,按照惯例,它不会出现在图例中:legend_map = 'setosa': '_setosa', 'versicolor': 'versicolor', 'virginica': 'virginica'
以上是关于如何自定义 seaborn.scatterplot 图例?的主要内容,如果未能解决你的问题,请参考以下文章