如何用Pandas/Matplotlib连接并列箱线图的25、50、75分位数?
用Pandas/Matplotlib实现横向箱线图分位数连线
完全可以实现,直接在箱线图基础上计算分位数并添加连线即可,步骤和完整代码如下:
1. 生成数据并计算分组分位数
先按分组算出每个组的25%、50%(中位数)、75%分位数,得到规整的分位数数据表:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 生成原始数据 group = np.array([np.random.binomial(2, 0.4) for _ in range(100)]) data = [np.random.uniform(0, 5) for _ in range(len(group))] df = pd.DataFrame({'data': data, 'group': group}) # 计算每个分组的三个分位数 quantiles_df = df.groupby('group')['data'].quantile([0.25, 0.5, 0.75]).unstack() # 按分组序号排序,保证绘图顺序正确 quantiles_df = quantiles_df.sort_index()
2. 绘制箱线图+分位数连线
先画出横向箱线图,再在同一个坐标轴上绘制三条分位数连线:
# 绘制横向箱线图,获取坐标轴对象 ax = df.boxplot(by='group', vert=False) # 箱线图的y轴位置是从1开始的整数,对应每个分组的顺序 y_positions = np.arange(1, len(quantiles_df)+1) # 分别绘制三条分位数连线,用不同标记和颜色区分 ax.plot(quantiles_df[0.25], y_positions, marker='o', color='#e74c3c', linestyle='-', label='25%分位数') ax.plot(quantiles_df[0.5], y_positions, marker='s', color='#3498db', linestyle='-', label='中位数') ax.plot(quantiles_df[0.75], y_positions, marker='^', color='#2ecc71', linestyle='-', label='75%分位数') # 添加图例、调整标题 ax.legend() plt.title('横向箱线图与分位数连线') plt.suptitle('') # 移除pandas自动生成的顶部标题 plt.show()
关键说明
- 用
groupby+quantile可快速算出每个分组的分位数,unstack把分位数从行转成列,方便后续按列取数绘图。 - 横向箱线图的y轴位置是连续整数(第一个分组在y=1,第二个在y=2,以此类推),用
np.arange直接生成即可对应。 - 给每条线加上标记点(比如圆形、方形),能更清晰地对应箱线图上的分位数位置。
内容的提问来源于stack exchange,提问作者Tommy Do
相关产品推荐
相关产品推荐

