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

如何为Matplotlib箱线图按四分位数设置箱体分段颜色

如何为Matplotlib箱线图按四分位数设置箱体分段颜色

我来帮你搞定这个箱线图的分段颜色需求!你想把箱体从中位数分成上下两部分,分别用深浅蓝色填充,这个思路完全没问题——用ax.add_patch()画矩形是个好办法,我一步步给你讲清楚怎么做。

首先,我们得先拿到每个数据列的四分位数(Q1、中位数、Q3),这是我们确定矩形高度的核心依据;然后遍历箱线图的每个箱体,获取它们的位置和宽度,最后对应着统计数据画出两个颜色的矩形就行。

先看修改后的完整代码,我在你原来的代码基础上加了关键的分段颜色逻辑:

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

data = pd.DataFrame({
    "peaches":[1,4,7,5,8,2,5,7], 
    "oranges":[2,7,9,1,9,2,7,3], 
    "tomato":[3,8,5,4,5,6,7,1]
})
labels = ['peaches', 'oranges', 'tomatoes']

fig, ax = plt.subplots()
ax.set_ylabel('fruit weight (g)')

# 生成箱线图,保留patch_artist=True(后面会把原箱体设透明)
bplot = ax.boxplot(
    data,
    patch_artist=True,
    tick_labels=labels
)

# ------------------- 关键的分段颜色逻辑 -------------------
# 1. 计算每个列的Q1、中位数、Q3,转置后每一行对应一个类别
stats = data.quantile([0.25, 0.5, 0.75]).T
stats.columns = ['Q1', 'median', 'Q3']

# 定义你要的深浅蓝色
dark_blue = '#3377ff'  # 下半部分(Q1到中位数)
light_blue = '#a8d1ff' # 上半部分(中位数到Q3)

# 2. 遍历每个箱体和对应的统计数据
for box, (fruit, stats_row) in zip(bplot['boxes'], stats.iterrows()):
    # 获取箱体的x坐标范围和宽度
    x_left, x_right = box.get_xdata()
    box_width = x_right - x_left
    
    # 把原箱体设为透明,避免遮挡我们的彩色矩形
    box.set_facecolor('none')
    
    # 画下半部分的矩形:从Q1到中位数
    lower_rect = plt.Rectangle(
        (x_left, stats_row['Q1']),  # 矩形左下角坐标
        box_width,                  # 矩形宽度
        stats_row['median'] - stats_row['Q1'],  # 矩形高度
        facecolor=dark_blue
    )
    ax.add_patch(lower_rect)
    
    # 画上半部分的矩形:从中位数到Q3
    upper_rect = plt.Rectangle(
        (x_left, stats_row['median']),
        box_width,
        stats_row['Q3'] - stats_row['median'],
        facecolor=light_blue
    )
    ax.add_patch(upper_rect)
# ---------------------------------------------------------

plt.show()

我再把关键步骤给你拆解下:

  1. 统计数据准备:用pandas的quantile方法直接算出每个类别的四分位数,转置后每行对应一个水果类别,和箱线图的顺序完全匹配,后续遍历不会乱序。
  2. 箱体位置获取:每个箱体是一个矩形patch,通过box.get_xdata()能拿到它的左右x坐标,算出宽度后,我们画的新矩形就能和原箱体完美对齐,不会歪歪扭扭。
  3. 分段矩形绘制:分别针对Q1到中位数、中位数到Q3的区间画两个矩形,设置好你要的深浅蓝色,最后把原箱体设为透明,让彩色分段完全显示出来。

这样运行代码后,每个箱体就会从中位数精准分成上下两部分,呈现你想要的颜色效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:43:00