【问题标题】:How to specify label colors for box plots based on pandas df column name/label name in python/matplotlib如何根据 python/matplotlib 中的 pandas df 列名称/标签名称为箱形图指定标签颜色
【发布时间】:2020-09-02 17:11:48
【问题描述】:

我在子图中有一系列箱形图(见图),但想根据其 DUT1 或 DUT2 更改每个单独图的标签颜色。

这是用于制作箱线图的 df 样本之一。每个图都是使用类似的 df 绘制的,但包括来自不同设定点的测量值。

      DUT1 A   DUT1 B   DUT2 A   DUT2 B
527  0.92342  0.96342  0.98342  1.00342
528  0.92754  0.88754  0.97754  0.97754
529  0.93655  0.95655  0.99655  0.91655

上面的每个数字都是在指定设定点进行每次测量的 DUT 传感器和参考传感器之间的差异。

这是我如何创建箱形图的每个子图的快照。

fig, axes = plt.subplots(ncols = 4, nrows = 2, sharey = True, figsize = (10,6))
fig.add_subplot(111, frame_on = False)
plt.tick_params(labelcolor = 'none', bottom = False, left = False)
plt.ylabel('Difference from Reference PRT in $^\circ$F', labelpad=20)

boxplot1 = df_setpoint1.boxplot(column = ['DUT1 A','DUT1 B','DUT2 A','DUT2 B'], ax = axes[1,0], rot=45)
boxplot2 = df_setpoint2.boxplot(column = ['DUT1 A','DUT1 B','DUT2 A','DUT2 B'], ax = axes[1,1], rot=45)


axes[1,0].set_title('Set Point -38.5$^\circ$F')
axes[1,1].set_title('Set Point -25$^\circ$F')


fig.suptitle('Temperature Distribution for Temperature Accuracy Testing')
plt.tight_layout()
plt.show()

经过一番搜索,我在弄清楚如何为每个绘图标签指定颜色时遇到问题,因为我不是单独创建每个箱形图,而是从每个数据框中的指定列创建。我遇到了很多自定义的框填充颜色,并添加了自定义颜色的图例,但我只是想控制 x 轴上文本标签的颜色。

【问题讨论】:

  • @Parfait 我编辑了帖子以包含 df 的示例。谢谢。
  • 你的意思是x轴标签颜色吗?为什么不单独为箱线图着色?为了便于阅读,轴应保留相同的颜色,让绘图区域进行比较。无法立即看到调整轴内标题的方法。
  • @Parfait 我想我已经得出了关于可读性和统一颜色的相同结论,所以我对我所拥有的感到满意。感谢您的意见!

标签: python pandas matplotlib


【解决方案1】:

虽然文本标签着色不是很方便,但matplotlib 后端中的箱线图着色是可行的,需要在每个修补的艺术家之间循环。对于每个配对的 DUT1DUT2,对每个艺术家运行 elementwsie zip 循环。

下面运行一个子图,数据由 OP 提供。为避免重复行集成到定义的方法中,并通过它运行每个子图,或添加顶部 for 层以遍历 axes 数组中所有生成的子图。

import matplotlib.patches as mpatches
...

# BOX PLOT LEGEND
blue_patch = mpatches.Patch(color='blue', label='The red data')
green_patch = mpatches.Patch(color='green', label='The blue data')
fig.legend(handles=[blue_patch, green_patch], labels=['A', 'B'], 
           ncol=2, loc='upper center', bbox_to_anchor=(0.5, 0.95))
        
# BOX PLOT      
boxplot1 = df_setpoint1.boxplot(column = ['DUT1 A','DUT1 B','DUT2 A','DUT2 B'],
                                ax=axes[1,0], patch_artist=True, rot=45)

# BOX PLOT COLORING
colors = ['blue', 'blue', 'green', 'green']

for i,(artist, col) in enumerate(zip(axes[1,0].artists, colors)):
    artist.set_edgecolor(col)
    artist.set_facecolor(col) 

    # Each box has 6 associated Line2D objects (to make the whiskers, fliers, etc.)
    # Loop over them here, and use the same colour as above
    for j in range(i*6,i*6+4):
        line = axes[1,0].lines[j]
        line.set_color(col)
        line.set_mfc(col)
        line.set_mec(col)
        line.set_linewidth(0.5)
...

fig.tight_layout(rect=[0, 0.03, 1, 0.90])
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 2012-09-11
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多