You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ax.bxp()实现箱线图与直方图颜色匹配?

解决箱线图与直方图颜色匹配的问题

可行方案

方案1:绘制完成后逐个修改箱线颜色

先一次性绘制所有箱线,再遍历每个箱线的组件(箱体、须线、帽线、中位数),用Matplotlib默认颜色循环(和直方图一致的配色逻辑)设置对应颜色:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 示例数据
data = pd.DataFrame({
    'q1': [73.992, 73.995, 73.993, 73.999, 73.996],
    'med': [74.000, 74.001, 73.998, 74.005, 74.004],
    'mean': [73.99936, 73.99996, 74.00100, 74.00332, 74.00224],
    'q3': [74.006, 74.007, 74.009, 74.007, 74.009],
    'whishi': [73.982, 73.967, 73.986, 73.985, 73.984],
    'whislo': [74.030, 74.024, 74.021, 74.020, 74.014],
    'label': ['obs1', 'obs2', 'obs3', 'obs4', 'obs5']
})

# 构建bxp所需的字典列表
list_of_dicts = []
for idx, row in data.iterrows():
    box_dict = {
        'q1': row['q1'],
        'med': row['med'],
        'mean': row['mean'],
        'q3': row['q3'],
        'whishi': row['whishi'],
        'whislo': row['whislo'],
        'label': row['label']
    }
    list_of_dicts.append(box_dict)

fig, (ax_box, ax_hist) = plt.subplots(1, 2, figsize=(12, 5))

# 绘制箱线图
box_plot = ax_box.bxp(list_of_dicts, vert=False, showfliers=False)

# 获取Matplotlib默认颜色循环
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']

# 逐个设置箱线各组件颜色
for i, patch in enumerate(box_plot['boxes']):
    # 设置箱体填充色
    patch.set_facecolor(colors[i])
    # 设置须线颜色(每个箱线两条须线,索引为2i和2i+1)
    box_plot['whiskers'][2*i].set_color(colors[i])
    box_plot['whiskers'][2*i+1].set_color(colors[i])
    # 设置帽线颜色
    box_plot['caps'][2*i].set_color(colors[i])
    box_plot['caps'][2*i+1].set_color(colors[i])
    # 中位数用白色突出显示
    box_plot['medians'][i].set_color('white')

# 绘制直方图(模拟原始数据,使用同色系)
for i, label in enumerate(data['label']):
    hist_data = np.random.normal(data['med'][i], 0.005, 1000)
    ax_hist.hist(hist_data, bins=20, alpha=0.7, label=label, color=colors[i])

ax_hist.legend()
plt.tight_layout()
plt.show()

方案2:构建字典时直接指定颜色

在每个箱线的字典中加入color和facecolor参数,让ax.bxp绘制时自动使用指定颜色:

import matplotlib.pyplot as plt
import pandas as pd

# 示例数据同上,省略重复代码
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']

# 构建带颜色参数的字典列表
list_of_dicts = []
for idx, row in data.iterrows():
    box_dict = {
        'q1': row['q1'],
        'med': row['med'],
        'mean': row['mean'],
        'q3': row['q3'],
        'whishi': row['whishi'],
        'whislo': row['whislo'],
        'label': row['label'],
        'color': colors[idx],
        'facecolor': colors[idx]
    }
    list_of_dicts.append(box_dict)

# 直接绘制,颜色自动匹配
ax_box.bxp(list_of_dicts, vert=False, showfliers=False)

关键注意事项

  • 两种方案均复用Matplotlib默认颜色循环,确保和直方图配色逻辑一致;如果需要自定义颜色,直接替换colors变量为自定义列表即可;
  • 方案1中须线和帽线是成对出现的,索引需对应2*i和2*i+1,避免颜色错位。

内容的提问来源于stack exchange,提问作者Python_Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:52:32