如何为Matplotlib箱线图设置交替自定义填充色及中位数线颜色
问题
已通过以下代码生成数据与画布:
import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.DataFrame(np.random.normal(size=(15,4))) # 重命名列 data.set_axis(['Column A', 'Column B', 'Column C', 'Column D'], axis=1, inplace=True) # 创建画布 fig, axs = plt.subplots(2, figsize = (15,15)) # 指定颜色 colors = ['#002072', '#00BDF2']
需在axs[0]子图绘制箱线图,实现箱体按指定十六进制颜色交替填充,同时修改深蓝色箱体的中位数/均值线颜色以提升辨识度。
解决方案
利用matplotlib箱线图返回的组件对象,可直接修改箱体和线条样式,完整代码如下:
# 在axs[0]绘制箱线图,开启patch_artist以支持箱体填充色修改 boxplot = axs[0].boxplot( data.values, patch_artist=True, labels=data.columns, showmeans=True # 可选:显示均值线 ) # 交替设置箱体填充色 for idx, patch in enumerate(boxplot['boxes']): patch.set_facecolor(colors[idx % len(colors)]) # 修改深蓝色箱体的中位数线颜色 # 将十六进制颜色转为matplotlib识别的RGB元组(0-1区间) dark_blue_rgb = tuple(np.array([0, 32, 114])/255) for idx, median_line in enumerate(boxplot['medians']): if boxplot['boxes'][idx].get_facecolor()[0] == dark_blue_rgb: median_line.set_color('#FFFFFF') # 白色与深蓝色形成高对比度 # 可选:修改深蓝色箱体的均值线颜色 for idx, mean_line in enumerate(boxplot['means']): if boxplot['boxes'][idx].get_facecolor()[0] == dark_blue_rgb: mean_line.set_color('#FFFFFF') plt.show()
关键说明
patch_artist=True:这是修改箱体填充色的前提,必须开启该参数,否则箱体无法设置填充色。- 颜色交替逻辑:通过
idx % len(colors)实现循环使用指定的两种颜色,适配任意数量的列。 - 线条颜色匹配:将十六进制深蓝色转为
matplotlib识别的RGB元组,精准匹配对应箱体,再将中位数/均值线改为高对比度的白色。
内容的提问来源于stack exchange,提问作者user603535
相关产品推荐
相关产品推荐

