如何用 4 个图例而不是 2 个更改 python pyplot 图例

Posted

技术标签:

【中文标题】如何用 4 个图例而不是 2 个更改 python pyplot 图例【英文标题】:How to change python pyplot legend with 4 legend instead of 2 【发布时间】:2021-12-29 13:20:18 【问题描述】:

感谢您花时间回答我的问题。

我有 2 个由几列组成的 DataFrame:

df=pd.DataFrame([['A',10, 22], ['A',12, 15], ['A',0, 2], ['A', 20, 25], ['A', 5, 5], ['A',12, 11], ['B', 0 ,0], ['B', 9 ,0], ['B', 8 ,50], ['B', 0 ,0], ['B', 18 ,5], ['B', 7 ,6],['C', 10 ,11], ['C', 9 ,10], ['C', 8 ,2], ['C', 6 ,2], ['C', 8 ,5], ['C', 6 ,8]],
         columns=['Name', 'Value_01','Value_02'])
df_agreement=pd.DataFrame([['A', '<66%', '>80'],['B', '>80%', '>66% & <80%'], ['C', '<66%', '<66%']], columns=['Name', 'Agreement_01', 'Agreement_02'])

我的目标是为此 DataFrame 创建箱线图,其中 ['Value_01', 'Value_02'] 作为值,'Name' 作为 x 值。为此,我使用以下代码执行 sns 箱线图:

fig = plt.figure()
# Change seaborn plot size
fig.set_size_inches(60, 40)
plt.xticks(rotation=70)
plt.yticks(fontsize=40)
df_02=pd.melt(df, id_vars=['Name'],value_vars=['Value_01', 'Value_02'])
bp=sns.boxplot(x='Name',y='value',hue="variable",showfliers=True, data=df_02,showmeans=True,meanprops="marker": "+", 
                       "markeredgecolor": "black", 
                       "markersize": "20")
bp.set_xlabel("Name", fontsize=45)
bp.set_ylabel('Value', fontsize=45)
bp.legend(handles=bp.legend_.legendHandles, labels=['V_01', 'V_02'])

好的,这部分有效,我确实有 6 个箱线图,每个名称两个。

变得棘手的是,我想使用 df_agreement 来更改箱线图的颜色,因为它是否

list_color_1=[]
list_color_2=[]
for i in range(0, len(df_agreement)):
    name=df_agreement.loc[i,'Name']
    if df_agreement.loc[i,'Agreement_01']=="<66%":
        list_color_1.append(i*2)
    if df_agreement.loc[i,'Agreement_02']=="<66%":
        list_color_2.append(i*2+1)
for k in list_color_1:
    mybox = bp.artists[k]
    # Change the appearance of that box
    mybox.set_facecolor("#D1DBE6") #facecolor is the inside color of the boxplot
    mybox.set_edgecolor('black') #edgecolor is the line color of the box
    mybox.set_linewidth(2)
for k in list_color_2:
    mybox = bp.artists[k]
    # Change the appearance of that box
    mybox.set_facecolor("#EFDBD1") #facecolor is the inside color of the boxplot
    mybox.set_edgecolor('black') #edgecolor is the line color of the box
    mybox.set_linewidth(2)

效果很好,我的箱线图在 df_agreement 上的值发生了变化。 但是,不幸的是,我还想用[“V_01”、“V_02”、“V_01 的一致性低于 66%”、“V_02 的一致性低于 66%”] 来更改图例,并且显然在图例中使用相应的颜色.

你有想法来实现吗?

非常感谢! :)

【问题讨论】:

【参考方案1】:

您可以添加自定义图例元素,扩展句柄列表。这是一个例子。

handles, labels = bp.get_legend_handles_labels()
new_handles = handles + [plt.Rectangle((0, 0), 0, 0, facecolor="#D1DBE6", edgecolor='black', linewidth=2),
                         plt.Rectangle((0, 0), 0, 0, facecolor="#EFDBD1", edgecolor='black', linewidth=2)]
bp.legend(handles=new_handles,
          labels=['V_01', 'V_02', "V_01 with less\n than 66% agreement", "V_02 with less\n than 66% agreement"])

【讨论】:

工作得很好非常感谢!

以上是关于如何用 4 个图例而不是 2 个更改 python pyplot 图例的主要内容,如果未能解决你的问题,请参考以下文章

如何用空格填充 QString?

如何用 Python 实现堆和优先队列?

如何用逗号而不是空格分割列表

Python+matplotlib可视化设置图例4个精选案例

Python+matplotlib可视化设置图例4个精选案例

如何用python抓取电话