You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多子图箱线图颜色设置异常求助

多子图箱线图颜色设置异常求助

嗨,我看到你遇到了箱线图颜色设置不生效的问题——所有箱子都变成了默认的深蓝色,明明你已经定义了想要的颜色列表却没起作用对吧?咱们来看看代码里的问题出在哪:

问题根源

你在每个子图的循环里重复调用了三次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()

关键修改点

  1. 每个子图只调用一次boxplot,并将返回的box_plot对象保存下来,所有后续的样式修改都基于这个对象,避免重复绘制覆盖样式。
  2. 直接通过box_plot['boxes'][0]获取当前子图的唯一箱子,给它设置color_list中对应的颜色(color_list[i])。

这样修改后,每个子图的箱子就会按照你定义的颜色列表显示啦~

备注:内容来源于stack exchange,提问作者Omid MansouriHanis1

火山引擎 最新活动