You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于统计数据在单张图表中绘制多个箱线图

解决多箱线图同图绘制的问题

嘿,我来帮你搞定这个问题!你已经成功用matplotlibbxp()方法画出单个箱线图了,要把DataFrame所有行对应的箱线图整合到同一张图里其实很简单——核心思路就是把每一行的统计数据都转换成bxp()需要的字典格式,然后把这些字典打包成一个列表,一次性传给bxp()

完整实现代码

这里是针对你需求的完整示例代码,我会一步步解释关键部分:

import pandas as pd
import matplotlib.pyplot as plt

# 1. 读取你的数据
data = pd.read_excel("data.xlsx")

# 2. 创建画布和坐标轴,根据箱线图数量调整宽度
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(12, 6), sharey=True)

# 3. 初始化一个空列表,用来存储所有行的箱线图统计数据
stats_collection = []

# 4. 遍历DataFrame的每一行,生成对应箱线图的统计字典
for row_idx, row_data in data.iterrows():
    # 构建单个箱线图的统计字典
    box_stat = {
        "label": f"Row {row_idx + 1}",  # 设置x轴标签,方便区分不同行的箱线图
        "med": row_data["sharpeRatio_med"],  # 中位数
        "q1": row_data["sharpeRatio_q1"],    # 第一四分位数
        "q3": row_data["sharpeRatio_q3"],    # 第三四分位数
        "whislo": row_data["sharpeRatio_min"], # 须下限(最小值)
        "whishi": row_data["sharpeRatio_max"], # 须上限(最大值)
        "fliers": []  # 异常值列表,如果没有异常值就保持空
    }
    # 把当前行的统计字典加入列表
    stats_collection.append(box_stat)

# 5. 一次性绘制所有箱线图
axes.bxp(stats_collection)

# 6. 美化图表(可选但推荐)
axes.set_title("Sharpe Ratio Distribution by Data Rows")
axes.set_xlabel("Data Rows")
axes.set_ylabel("Sharpe Ratio Value")
plt.xticks(rotation=45)  # 如果标签太长,旋转x轴标签避免重叠
plt.tight_layout()

plt.show()

关键细节说明

  • 遍历行数据:用iterrows()遍历DataFrame的每一行,能同时获取行索引和该行的所有数据,方便生成每个箱线图的标识。
  • 自定义标签label字段是x轴上每个箱线图的名称,你可以根据实际需求修改——比如如果你的DataFrame有专门的分组列(比如"Strategy Name"),可以把label改成row_data["Strategy Name"],这样图表可读性更强。
  • 异常值处理:如果你的数据里有异常值,只需要把fliers字段改成对应行的异常值列表(比如row_data["sharpeRatio_fliers"]),同时确保调用bxp()时没有关闭异常值显示(默认showfliers=True)。
  • 图表适配:如果你的DataFrame行数很多,记得调大figsize的宽度(比如figsize=(15,6)),或者旋转x轴标签(plt.xticks(rotation=45)),避免标签重叠。

内容的提问来源于stack exchange,提问作者Faruman

火山引擎 最新活动