如何使用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
相关产品推荐
相关产品推荐

