读取一个matplotlib图中的两个数据集

时间:2015-12-16 08:31:29

标签: python numpy matplotlib

我尝试在一个图中绘制两个数据集,包括错误栏。它对一个数据集非常好。但在这个“解决方案”中:

from __future__ import print_function
from matplotlib import pyplot as plt
import numpy as np

f2 = open('data1.txt', 'r')
lines = f2.readlines()
f2.close()

f3 = open('data2.txt', 'r')
lines2 = f3.readlines()
f3.close()

x1 = []
y1 = []
xerr1 = []
yerr1 = []

x2 = []
y2 = []
xerr2 = []
yerr2 = []


for line in lines:
    p = line.split()
    x1.append(float(p[0]))
    y1.append(float(p[1]))
    xerr1.append(float(p[2]))
    yerr1.append(float(p[3]))

for line2 in lines2:
    k = line2.split()
    x2.append(float(k[0]))
    y2.append(float(k[1]))
    xerr2.append(float(k[2]))
    yerr2.append(float(k[3]))


xv = np.array(x1)
yv = np.array(y1)
xerror = np.array(xerr1)
yerror = np.array(yerr1)

xv2 = np.array(x2)
yv2 = np.array(y2)
xerror2 = np.array(xerr2)
yerror2 = np.array(yerr2)

fig = plt.figure()


ax1 = fig.add_subplot(111)

ax1.set_title("test", fontweight='bold')    
ax1.set_xlabel('test', fontsize=14, fontweight='bold')
ax1.set_ylabel('test', fontsize=16, fontweight='bold')
ax1.grid(True)
plt.ylim(67.2, 70.75) 
plt.xlim(-45, 30) 


plt.errorbar(xv, yv, xerr=xerror, yerr=yerror, fmt='-o', linestyle='None', color='k', marker='.')
plt.errorbar(xv2, yv2, xerr=xerror2, yerr=yerror2, fmt='-o', linestyle='None', color='k', marker='.')

plt.plot(xv, yv, marker='o', markersize='6', markeredgewidth='0', linestyle='None', linewidth=0, color='b')
plt.plot(xv2, yv2, marker='o', markersize='6', markeredgewidth='0', linestyle='None', linewidth=0, color='r')

plt.show()

我只收到错误

exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
File "E:/script.py", line 39, in <module>
        x2.append(float(k[0]))
    IndexError: list index out of range

我没有看到错误,需要一些帮助。有没有人知道这种方式有什么问题?我希望这不容易......

2 个答案:

答案 0 :(得分:1)

for line2 in lines2:中可能有一个空行,因为它为IndexError: list index out of range提供k[0],这意味着在这种情况下k不存在索引0。 确保检查拆分结果是否为空。

例如:

for line2 in lines2:
    k = line2.split()
    if len(k)==0:
       #do something
    else:
       x2.append(float(k[0]))
       y2.append(float(k[1]))
       xerr2.append(float(k[2]))
       yerr2.append(float(k[3]))

第一个for循环也应该这样做。

答案 1 :(得分:1)

你的问题是,某些时候k=line2.split()没有任何元素。例如,如果第二个文件有一个空行(因为它可能在末尾),那么split函数将为您提供一个空列表