求助: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
相关产品推荐
相关产品推荐

