Python实现带误差棒的可见能量曲线绘制异常问题求助
问题分析与修正方案
我看了你的代码,问题主要出在x轴数据缺失和errorbar参数错误使用上,这直接导致图形完全不符合预期。咱们一步步来修正:
核心问题点
- x轴数据未传入:你循环遍历的
E(光子能量,1到999 GeV)是x轴的核心数据,但绘图时完全没用到它,反而把y轴的values1当成了x轴输入,彻底搞反了坐标逻辑。 - errorbar参数顺序错误:
errorbar的第一个参数是x值,第二个是y值,你现在把y值和误差值的位置搞混了,而且没有正确指定误差范围的格式。 - 误差棒格式不匹配:matplotlib的
errorbar需要明确的上下偏差值,而不是直接传入min/max曲线的完整y值。
修正后的代码
import matplotlib.pyplot as plt from math import sqrt """ Errors Min and Max """ # 先存储x轴的光子能量数据 E_values = list(range(1, 1000)) # 1到999 GeV的光子能量 values1 = [] E1Min = [] E1Max = [] E_error1 = 0.05 E_error2 = 0.04 for E in E_values: # 主曲线:未补偿的可见能量计算 E1 = 0.99 * 0.02 / sqrt(E) + 0.7 * 0.4 / sqrt(E) values1.append(E1) # 误差下限:参数取最小可能值 E1_min = 0.99 * (0.02 - E_error1) / sqrt(E) + 0.7 * (0.4 - E_error2) / sqrt(E) E1Min.append(E1_min) # 误差上限:参数取最大可能值 E1_max = 0.99 * (0.02 + E_error1) / sqrt(E) + 0.7 * (0.4 + E_error2) / sqrt(E) E1Max.append(E1_max) # 计算误差棒的上下偏差(相对于主曲线的差值) yerr = [ [values1[i] - E1Min[i] for i in range(len(values1))], # 下偏差 [E1Max[i] - values1[i] for i in range(len(values1))] # 上偏差 ] my_font = 20 fig, ax1 = plt.subplots(figsize=(10, 6)) plt.tick_params(axis='both', which='major', labelsize=my_font) plt.grid(True, which="both", ls="-", color='0.65') # 设置双对数坐标轴 ax1.set_xscale('log') ax1.set_yscale('log') # 绘制主曲线 ax1.plot(E_values, values1, label='Not compensated', color='Blue', linestyle='-', linewidth=2) # 可选:绘制误差范围的上下限辅助曲线 ax1.plot(E_values, E1Min, label='Minimum', color='Red', linestyle='-', linewidth=1) ax1.plot(E_values, E1Max, label='Maximum', color='Red', linestyle='--', linewidth=1) # 绘制误差棒:仅显示误差线,不重复绘制主曲线散点 ax1.errorbar(E_values, values1, yerr=yerr, fmt='none', ecolor='black', capsize=3, label='Observation Error') # 设置坐标轴标签与标题 plt.ylabel('Visible Energy [GeV]', fontsize=my_font) plt.xlabel('Photon energy [GeV]', fontsize=my_font) plt.title('Visible Energy with/without Compensation', fontsize=my_font) plt.legend(loc='upper right', fontsize=14) plt.tight_layout() # 自动调整布局,避免标签被截断 plt.show()
关键修改说明
- 新增x轴数据
E_values:把循环的光子能量值存为列表,作为绘图的x轴输入,这是最核心的修正,确保坐标对应关系正确。 - 调整误差棒的
yerr格式:计算每个点相对于主曲线的上下偏差,组成二维数组传入errorbar,让matplotlib能正确识别误差范围。 - 修正
errorbar参数顺序:现在errorbar的x是光子能量,y是主曲线的可见能量,完全符合坐标逻辑;用fmt='none'避免重复绘制主曲线的散点,只保留误差棒。 - 优化细节:添加
figsize设置图表大小,tight_layout()防止标签被截断,调整图例字体大小让显示更美观。
这样修改后,图形就能正确展示光子能量与可见能量的关系,误差棒也会准确对应每个点的误差范围啦。
内容的提问来源于stack exchange,提问作者HMM
相关产品推荐
相关产品推荐

