【问题标题】:How to customize seaborn.scatterplot legends?如何自定义 seaborn.scatterplot 图例?
【发布时间】: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']。 谁能帮忙。

【问题讨论】:

    标签: seaborn legend


    【解决方案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'}
    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2018-11-01
    • 2014-10-08
    • 2019-04-13
    • 2014-08-26
    相关资源
    最近更新 更多