Python箱线图仅连接上须帽(caps)的实现问题求助
解决仅连接箱线图上须帽的问题
我懂你的需求——现在你的函数会把上下须帽都连起来,这是因为Matplotlib的boxplot返回的bp['caps']列表是成对排列的:第1、3、5...个元素是下须帽,第2、4、6...个元素是上须帽。只要调整遍历逻辑,只筛选出上须帽的坐标,就能实现仅用粉色线条连接上须帽的效果。
问题根源
原代码里for p in bp['caps']会遍历所有须帽(上下都包含),导致收集的坐标里既有下须帽也有上须帽,最终画出的线会把上下都连起来,不符合你的需求。
修改后的函数代码
import numpy as np import matplotlib.pyplot as plt def set_boxes_lim_max_line(bp, w, c): limit_sup_x = [] limit_sup_y = [] # 遍历须帽,仅保留奇数索引的元素(对应上须帽) for idx, p in enumerate(bp['caps']): if idx % 2 == 1: data = p.get_data() # 须帽是水平短线,取x坐标的平均值作为点的横坐标 x = data[0].mean() # 上须帽是水平的,max/min结果一致,取哪个都可以 y = data[1].max() limit_sup_x.append(x) limit_sup_y.append(y) plt.plot(limit_sup_x, limit_sup_y, color=c, linewidth=w)
关键修改点说明
- 用
enumerate获取每个须帽的索引,通过idx % 2 == 1精准筛选上须帽(Matplotlib的箱线图须帽顺序固定为:下→上→下→上...) - 简化了原代码里冗余的
x=np.max([data[0].mean(),data[0].mean()]),直接取data[0].mean()即可(须帽的x坐标是两个相同值,取平均或max结果一致)
调用示例(和你原代码一致即可)
bp1 = plt.boxplot([sample1[i] for i in posiciones2], positions=(range(1, 3)), widths=0.6) set_box_color(bp1,'red') # 设置箱线图为红色 set_boxes_lim_max_line(bp1,1.2,'hotpink')# 仅连接上须帽的粉色线条 set_boxes_q_min_line(bp1, 1.2, 'tomato') # 箱线上沿(Q3)的连接线 set_boxes_median_line(bp1, 1.2, 'seagreen')# 中位数的连接线 set_boxes_q_max_line(bp1, 1.2, 'darkred')# 箱线下沿(Q1)的连接线
修改后运行代码,就能得到仅用粉色线条连接所有箱线图上须帽的效果了。
内容的提问来源于stack exchange,提问作者Edwin Reyes
相关产品推荐
相关产品推荐

