请求制作自定义箱型图以对比DRCT与DWPT的MAE指标
自定义MAE参数对比图表实现方案
需求说明
手里有个数据集,字段包括Parameter(仅DRCT、DWPT两个取值)、Method、RMSE、MAE、FID。要制作特殊图表:
- 横轴放置DRCT和DWPT两个参数类别
- 不显示纵轴
- 每个参数对应一个方框,方框上下边分别代表该参数下所有方法的MAE最小值与最大值
- 方框内用散点标出各方法的MAE具体数值
实现思路(基于Python Matplotlib)
- 按Parameter分组,计算每组MAE的最大、最小值,确定方框的上下范围
- 给每个参数在横轴分配固定位置,手动绘制方框(避开默认箱型图的冗余元素)
- 在对应方框内用散点标记各方法的MAE数值
代码示例
假设数据以Pandas DataFrame格式存储,替换示例数据即可直接使用:
import matplotlib.pyplot as plt import pandas as pd # 示例数据集,替换为你的真实数据 data = pd.DataFrame({ 'Parameter': ['DRCT', 'DRCT', 'DRCT', 'DWPT', 'DWPT', 'DWPT'], 'Method': ['方法A', '方法B', '方法C', '方法A', '方法B', '方法C'], 'MAE': [0.2, 0.4, 0.3, 0.15, 0.35, 0.25] }) # 按参数分组计算MAE的最小、最大值 param_stats = data.groupby('Parameter')['MAE'].agg(['min', 'max']).reset_index() # 初始化画布 plt.figure(figsize=(8, 4)) # 给两个参数分配横轴位置 x_pos = [0, 1] param_names = param_stats['Parameter'].tolist() # 逐个绘制每个参数的方框与散点 for idx, (param, mae_min, mae_max) in enumerate(param_stats.itertuples(index=False)): # 绘制方框四条边 plt.plot([x_pos[idx]-0.2, x_pos[idx]+0.2], [mae_min, mae_min], 'k-') # 下边 plt.plot([x_pos[idx]-0.2, x_pos[idx]+0.2], [mae_max, mae_max], 'k-') # 上边 plt.plot([x_pos[idx]-0.2, x_pos[idx]-0.2], [mae_min, mae_max], 'k-') # 左边 plt.plot([x_pos[idx]+0.2, x_pos[idx]+0.2], [mae_min, mae_max], 'k-') # 右边 # 绘制当前参数下各方法的MAE散点 current_data = data[data['Parameter'] == param] plt.scatter([x_pos[idx]]*len(current_data), current_data['MAE'], color='#ff4444', zorder=10) # 可选:给散点标注方法名称,提升可读性 for _, row in current_data.iterrows(): plt.text(x_pos[idx]+0.06, row['MAE'], row['Method'], va='center') # 设置横轴标签 plt.xticks(x_pos, param_names) # 隐藏纵轴,符合需求 plt.gca().get_yaxis().set_visible(False) # 调整布局避免元素截断 plt.tight_layout() plt.show()
关键说明
- 手动绘制方框是因为默认箱型图会包含中位数、四分位数等冗余元素,仅保留我们需要的上下边界
zorder参数确保散点显示在方框上方,不会被遮挡- 不需要方法名称时,可删除标注相关代码段
内容的提问来源于stack exchange,提问作者srinivas
相关产品推荐
相关产品推荐

