如何自定义 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 图例?的主要内容,如果未能解决你的问题,请参考以下文章

用seaborn绘制散点图

easyUI如何增加自定义的图标

代码调试篇:如何编写 gdb 自定义命令

代码调试篇:如何编写 gdb 自定义命令

如何自定义自己的IP地址

如何自定义Android Dialog的样式?