为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据 python/matplotlib 中的 pandas df 列名称/标签名称指定箱形

如何根据 python/matplotlib 中的 pandas df 列名称/标签名称指定箱形

喵喵时光机 2023-07-11 15:08:23
我在子图中有一系列箱形图(见图),但想根据 DUT1 或 DUT2 更改每个单独图的标签颜色。以下是用于制作箱线图的 df 之一的示例。每个图都是使用类似的 df 绘制的,但包括来自各个设定点的测量值。      DUT1 A   DUT1 B   DUT2 A   DUT2 B527  0.92342  0.96342  0.98342  1.00342528  0.92754  0.88754  0.97754  0.97754529  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 轴上文本标签的颜色。
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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


下面使用 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()

//img1.sycdn.imooc.com//64ad002b0001267e09390560.jpg

查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信