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

求助:Matplotlib绘制带误差棒图表时误差棒不显示

问题:Matplotlib绘制误差棒不显示

我尝试绘制带误差棒的数据图表,构建误差数组后,图表始终无法显示误差棒。

以下是我的代码:

import matplotlib.pyplot as plt
import numpy as np
columns = [[]] * 3
with open('output_stat_ffoe1.txt','r') as token:
    for line in token:
        for field, value in enumerate(line.split()):
             columns[field].append(value)
print(columns[0])
lst=columns[0]
import operator
get1 = operator.itemgetter(0, 3, 6, 9, 12, 15, 18, 21, 24 ,27 )
datax = np.array(get1(lst)).astype(float)
get2 = operator.itemgetter(1, 4, 7, 10, 13, 16, 19, 22, 25 ,28 )
datay = np.array(get2(lst)).astype(float)
get3 = operator.itemgetter(2, 5, 8, 11,14, 17,20, 23, 26 ,29 )
errory = get3(lst)
y_error = np.array(errory).astype(float)
print(np.size(y_error))
print(np.size(datay))
print(y_error)
#fig, (ax0, ax1) = plt.subplots(nrows=2, sharex=True)
plt.errorbar(datax, datay, yerr=y_error, capsize=3, fmt="b--o", ecolor = "black")
#plt.errorbar(datax, datay, yerr=errory, fmt="o")
#plt.errorbar(datax, datay, yerr=errory, capsize=3, fmt="r--o", ecolor = "black")

输出的图表中没有误差棒。


解决方法

1. 修复数据读取的致命错误

你这段代码里columns = [[]] * 3是大坑——Python中列表乘法会让三个子列表指向同一个内存对象,也就是说columns[0]、columns[1]、columns[2]其实是同一个列表。循环读取数据时,所有字段都会被堆到同一个列表里,导致后续提取的datax、datay、y_error完全混乱,误差棒自然没法正常显示。

把列表初始化改成这样:

columns = [[], [], []]

2. 核对数据提取逻辑

你现在从columns[0]里按固定索引取x、y、误差值的逻辑很奇怪——正常来说应该是columns[0]存所有x数据,columns[1]存所有y数据,columns[2]存所有误差数据。如果你的文本每行是三个值(x、y、误差),直接从对应列提取即可:

datax = np.array(columns[0]).astype(float)
datay = np.array(columns[1]).astype(float)
y_error = np.array(columns[2]).astype(float)

要是你确实需要每隔3个元素取一个,用步长切片更靠谱:

datax = np.array(columns[0][::3]).astype(float)
datay = np.array(columns[1][::3]).astype(float)
y_error = np.array(columns[2][::3]).astype(float)

3. 补充图表显示语句

你代码最后没加plt.show(),这会导致图表绘制完成后无法显示,赶紧加上。

4. 排查误差值过小的情况

如果以上修改后还是没看到误差棒,大概率是误差值和y轴数据比起来太小,肉眼难以察觉。可以临时把误差值放大测试:

y_error *= 10

要是放大后能看到,说明原始误差确实太小,可以给误差棒加个更粗的线条:

plt.errorbar(datax, datay, yerr=y_error, capsize=3, fmt="b--o", ecolor="black", elinewidth=2)

修正后的完整代码

import matplotlib.pyplot as plt
import numpy as np
from operator import itemgetter

# 正确初始化三个独立的列表
columns = [[], [], []]
with open('output_stat_ffoe1.txt','r') as token:
    for line in token:
        fields = line.split()
        # 跳过格式不对的行,避免索引越界
        if len(fields) != 3:
            continue
        for field, value in enumerate(fields):
             columns[field].append(value)

# 按正确逻辑提取数据
datax = np.array(columns[0]).astype(float)
datay = np.array(columns[1]).astype(float)
y_error = np.array(columns[2]).astype(float)

# 如果你需要隔3个取一个,就用下面这三行替换上面的
# datax = np.array(columns[0][::3]).astype(float)
# datay = np.array(columns[1][::3]).astype(float)
# y_error = np.array(columns[2][::3]).astype(float)

print(np.size(y_error))
print(np.size(datay))
print(y_error)

plt.errorbar(datax, datay, yerr=y_error, capsize=3, fmt="b--o", ecolor="black", elinewidth=2)
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:07:00