You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改说明

  1. 新增x轴数据E_values:把循环的光子能量值存为列表,作为绘图的x轴输入,这是最核心的修正,确保坐标对应关系正确。
  2. 调整误差棒的yerr格式:计算每个点相对于主曲线的上下偏差,组成二维数组传入errorbar,让matplotlib能正确识别误差范围。
  3. 修正errorbar参数顺序:现在errorbar的x是光子能量,y是主曲线的可见能量,完全符合坐标逻辑;用fmt='none'避免重复绘制主曲线的散点,只保留误差棒。
  4. 优化细节:添加figsize设置图表大小,tight_layout()防止标签被截断,调整图例字体大小让显示更美观。

这样修改后,图形就能正确展示光子能量与可见能量的关系,误差棒也会准确对应每个点的误差范围啦。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:42:44