如何基于DataFrame遍历列表制作带均值线的分组箱线图?
实现带平均值线的分组箱线图
完全不用手动遍历boxplots列表~用seaborn就能轻松搞定这个需求,而且代码简洁易读。下面是具体的实现思路和完整代码:
步骤1:整理数据为长格式
seaborn的绘图函数更适合处理长格式数据,所以我们先用pd.melt()把需要的列(A、D)和label列转成适合绘图的结构:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 你的原始数据 df = pd.DataFrame(np.random.randint(0,30,size=(100, 4)), columns=list('ABCD')) label = ['A','B','C','D','E','F'] df['label'] = np.random.choice(label, df.shape[0]) boxplots = ['A', 'D'] # 转成长格式:只保留需要的列 melted_df = pd.melt(df, id_vars='label', value_vars=boxplots, var_name='variable', value_name='value')
步骤2:绘制分组箱线图 + 平均值线
用seaborn.boxplot()画出分组箱线图,再叠加seaborn.pointplot()来绘制每组的平均值连线(pointplot默认计算均值,刚好符合需求):
plt.figure(figsize=(10,6)) # 绘制分组箱线图 sns.boxplot(x='label', y='value', hue='variable', data=melted_df, palette='Set2') # 绘制平均值线:用黑色虚线+标记点区分 sns.pointplot(x='label', y='value', hue='variable', data=melted_df, estimator=np.mean, marker='o', linestyle='--', color='black', dodge=0.3, # 和箱线图错开位置,避免重叠 ci=None) # 关闭置信区间,只显示均值 # 调整图例和标题 plt.title('分组箱线图(带平均值线)', fontsize=14) plt.legend(title='指标') plt.show()
关键说明
- 不用遍历
boxplots:通过转长格式,seaborn会自动根据variable列(也就是A和D)分组绘制箱线图 - 平均值线的
dodge=0.3是为了让均值点和对应的箱线图对齐,避免重叠 - 如果不想用pointplot,也可以手动计算每个组的均值,然后用
plt.plot()添加水平线,但pointplot更高效
这样就能得到每个label分组下,A和D两个指标的箱线图,同时每条虚线展示对应组的平均值啦~
内容的提问来源于stack exchange,提问作者user9118870
相关产品推荐
相关产品推荐

