如何基于多个DataFrame绘制带误差范围的Errorbar图
解决方案
首先修正你的代码逻辑,核心问题在于你当前是计算每个DataFrame的全局极值,而不是按索引位置分别计算每个点的偏差范围,同时循环diff_to_mean.items()时处理元组的方式有误。以下是可运行的完整代码:
import numpy as np import pandas as pd import matplotlib.pyplot as plt def minimal(): mean = pd.DataFrame(data={ "Parameter" : [0, -6.535, -1.380, 1.398, -4.875] }) diff_to_mean = { "A": pd.DataFrame(data={ "Parameter": [0, -0.325, -0.100, 0.310, -0.125] }), "B": pd.DataFrame(data={ "Parameter": [0, -0.325, 0.120, 0.310, -0.025] }), "C": pd.DataFrame(data={ "Parameter": [0, 0.155, 0.160, -0.430, -0.225] }), "D": pd.DataFrame(data={ "Parameter": [0, 0.495, -0.180, -0.190, 0.375] }) } # 1. 将所有偏差DataFrame合并为一个,每列对应一个原DataFrame的参数列 diff_combined = pd.concat([df["Parameter"] for df in diff_to_mean.values()], axis=1) # 2. 按索引位置(行)计算每个点的最小偏差和最大偏差 min_diffs = diff_combined.min(axis=1) max_diffs = diff_combined.max(axis=1) # 3. 构造errorbar需要的误差格式:2xN数组,第一行是向下误差,第二行是向上误差 # 向下误差:均值到(均值+最小偏差)的距离 = -min_diffs # 向上误差:(均值+最大偏差)到均值的距离 = max_diffs y_error = np.array([-min_diffs, max_diffs]) # 绘制误差棒曲线 plt.errorbar(mean.index, mean["Parameter"], yerr=y_error, fmt='-o', capsize=5) plt.xlabel("Index") plt.ylabel("Parameter Value") plt.title("Mean Values with Error Bars") plt.show() minimal()
关键步骤说明:
- 合并偏差数据:用
pd.concat把所有diff_to_mean中的DataFrame按列合并,这样每一行就对应同一个索引位置的所有偏差值。 - 计算逐点极值:通过
min(axis=1)和max(axis=1)分别计算每个索引位置的最小、最大偏差,这正是你需要的每个点的误差范围。 - 构造误差参数:Matplotlib的
errorbar要求yerr是一个2×N的数组,第一行是每个点向下的误差长度,第二行是向上的误差长度。这里利用偏差的正负直接转换为误差长度,比如索引1的最小偏差是-0.325,向下误差就是0.325;最大偏差是0.495,向上误差就是0.495,完全符合你要求的误差范围。
内容的提问来源于stack exchange,提问作者Bakira
相关产品推荐
相关产品推荐

