【问题标题】:How to add labels to sets of seaborn boxplot如何将标签添加到 seaborn 箱线图集
【发布时间】:2022-11-24 07:42:03
【问题描述】:

我有两套箱线图,一套是蓝色的,一套是红色的。我希望图例显示每组箱线图的标签,即

传奇: -蓝框- A, -红框- B

sns.boxplot() 中添加了labels='A'labels='B',但无法使用错误消息“没有找到标签放在图例中的艺术家。请注意,当不带参数调用 legend() 时,标签以下划线开头的艺术家将被忽略”.如何添加标签?

enter image description here

插入图片的代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

x = list(range(1,13))
n = 40
index = [item for item in x for i in range(n)]

np.random.seed(123)

df = pd.DataFrame({'A': np.random.normal(30, 2, len(index)),
                   'B': np.random.normal(10, 2, len(index))},
                   index=index)

red_diamond = dict(markerfacecolor='r', marker='D')
blue_dot = dict(markerfacecolor='b', marker='o')

plt.figure(figsize=[10,5])
ax = plt.gca()
ax1 = sns.boxplot( x=df.index, y=df['A'], width=0.5, color='red', \
    boxprops=dict(alpha=.5), flierprops=red_diamond, labels='A')
ax2 = sns.boxplot( x=df.index, y=df['B'], width=0.5, color='blue', \
    boxprops=dict(alpha=.5), flierprops=blue_dot, labels='B')
plt.ylabel('Something')
plt.legend(loc="center", fontsize=8, frameon=False)

plt.show()

以下是我使用的软件版本:seaborn 版本 0.11.2。 matplotlib 版本 3.5.1。蟒蛇版本 3.10.1

【问题讨论】:

  • 由于我们没有数据来对颜色进行分类,因此我们需要创建图例处理程序和标签。请参考How to manually create a legend
  • 按照本指南进行操作,它适用于以下代码:red_patch = mpatches.Patch(color='red', label='A') blue_patch = mpatches.Patch(color='blue', label='B') plt.legend(handles=[red_patch, blue_patch], loc="center right", fontsize=8, frameon=False)
  • @montvinpeck 您还可以为补丁设置 alpha 和边缘颜色,使它们更类似于箱线图,例如red_patch = mpatches.Patch(facecolor='red', alpha=0.5, edgecolor='black', label='A')

标签: matplotlib seaborn


【解决方案1】:

以下方法通过 boxprops 设置标签,并使用 ax.artists 的一部分创建图例。 (请注意,问题代码的axax1ax2都指向同一个子图,所以这里只使用ax。)

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

x = np.arange(1, 13)
index = np.repeat(x, 40)
np.random.seed(123)
df = pd.DataFrame({'A': np.random.normal(30, 2, len(index)),
                   'B': np.random.normal(10, 2, len(index))},
                  index=index)
red_diamond = dict(markerfacecolor='r', marker='D')
blue_dot = dict(markerfacecolor='b', marker='o')

plt.figure(figsize=[10, 5])
ax = sns.boxplot(data=df, x=df.index, y='A', width=0.5, color='red',
                 boxprops=dict(alpha=.5, label='A'), flierprops=red_diamond)
sns.boxplot(data=df, x=df.index, y='B', width=0.5, color='blue',
            boxprops=dict(alpha=.5, label='B'), flierprops=blue_dot, ax=ax)
ax.set_ylabel('Something')

handles, labels = ax.get_legend_handles_labels()
handles = [h for h, lbl, prev in zip(handles, labels, [None] + labels) if lbl != prev]
ax.legend(handles=handles, loc="center", fontsize=8, frameon=False)

plt.show()

替代方法可以是:

  • pd.melt dataframe 为长格式,所以可以使用hue;这里的一个问题是图例不会考虑boxprops 中的alpha;也不支持设置不同的传单
  • 从自定义句柄创建图例

【讨论】:

  • 出于某种原因,当我在终端上使用您的代码时,图例没有显示。不知道为什么。
  • seaborn 版本 0.11.2。 matplotlib 版本 3.5.1。蟒蛇版本 3.10.1
  • 我更新了代码。现在它也应该适用于您的版本。
  • 有效。干杯。
猜你喜欢
  • 1970-01-01
  • 2021-02-03
  • 2020-06-24
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 2020-09-12
  • 1970-01-01
相关资源
最近更新 更多