如何为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()
我再把关键步骤给你拆解下:
- 统计数据准备:用
pandas的quantile方法直接算出每个类别的四分位数,转置后每行对应一个水果类别,和箱线图的顺序完全匹配,后续遍历不会乱序。 - 箱体位置获取:每个箱体是一个矩形patch,通过
box.get_xdata()能拿到它的左右x坐标,算出宽度后,我们画的新矩形就能和原箱体完美对齐,不会歪歪扭扭。 - 分段矩形绘制:分别针对Q1到中位数、中位数到Q3的区间画两个矩形,设置好你要的深浅蓝色,最后把原箱体设为透明,让彩色分段完全显示出来。
这样运行代码后,每个箱体就会从中位数精准分成上下两部分,呈现你想要的颜色效果啦!
备注:内容来源于stack exchange,提问作者Baldy
相关产品推荐
相关产品推荐

