多子图箱线图颜色设置异常求助
多子图箱线图颜色设置异常求助
嗨,我看到你遇到了箱线图颜色设置不生效的问题——所有箱子都变成了默认的深蓝色,明明你已经定义了想要的颜色列表却没起作用对吧?咱们来看看代码里的问题出在哪:
问题根源
你在每个子图的循环里重复调用了三次axs[i].boxplot(...):第一次绘制了箱线图,后面两次又重新执行了绘制操作,这就直接把你之前设置的颜色样式给覆盖掉了,最后显示的其实是第三次调用boxplot时的默认样式,所以颜色一直是深蓝色。另外,你的颜色列表对应逻辑也有点小问题:每个子图里只有一个箱子,不需要用zip去遍历颜色列表,应该给每个子图的箱子匹配color_list里对应的单个颜色。
修正后的代码
import pandas as pd import matplotlib.pyplot as plt # 加载Excel文件到DataFrame df = pd.read_excel('D:\Omid_TTU\RA\TASK5\selected1daybefore&after\GIS_Standard_format\FID_6_test2.xlsx') # 创建子图网格 fig, axs = plt.subplots(nrows=1, ncols=5, figsize=(20, 5)) # 定义颜色列表,对应5个子图的箱子颜色 color_list = ['red', 'lightyellow', 'green', 'slateblue2', 'steelblue1'] # 循环遍历每个列,绘制对应子图 for i, col in enumerate(['Liq_depth_dim', 'TMP_air_temp', 'VIS_dist_dim', 'WND_dir_ang', 'WND_speed_rate']): data = df[col].dropna() # 只调用一次boxplot,把返回的绘图对象存起来,后续所有样式设置都基于这个对象 box_plot = axs[i].boxplot(data, patch_artist=True, notch=True, vert=False) # 设置当前子图箱子的颜色(对应color_list里的第i个颜色) box_plot['boxes'][0].set_facecolor(color_list[i]) # 设置须的样式 for whisker in box_plot['whiskers']: whisker.set(color='r', linewidth=3, linestyle=':') # 设置帽的样式 for cap in box_plot['caps']: cap.set(color='r', linewidth=2) # 设置中位数线的样式 for median in box_plot['medians']: median.set(color='g', linewidth=3) # 设置异常值点的样式 for flier in box_plot['fliers']: flier.set(marker='D', color='r', alpha=0.5) # 设置子图标题和隐藏y轴刻度标签 axs[i].set_title(col) axs[i].set_yticklabels([]) # 调整子图间距 plt.subplots_adjust(wspace=0.5) plt.show()
关键修改点
- 每个子图只调用一次
boxplot,并将返回的box_plot对象保存下来,所有后续的样式修改都基于这个对象,避免重复绘制覆盖样式。 - 直接通过
box_plot['boxes'][0]获取当前子图的唯一箱子,给它设置color_list中对应的颜色(color_list[i])。
这样修改后,每个子图的箱子就会按照你定义的颜色列表显示啦~
备注:内容来源于stack exchange,提问作者Omid MansouriHanis1




