我正在尝试生成一个简单的图,该图读取存储在文件中的x,y值,并为每行使用不同的颜色来绘制它们。以下是我的尝试。
## to run ctrl+shift+b
#print("hello world")
import csv
import itertools
import pylab
import numpy as np
import matplotlib.pyplot as plt
f = open('2016-09-09-22_25_A_initial-Hysteresis.txt', 'r')
f2 = open('2016-09-09-22_25_F_initial-Hysteresis.txt', 'r')
f3 = open('2016-09-09-22_25_K_initial-Hysteresis.txt', 'r')
f4 = open('2016-09-09-22_25_P_initial-Hysteresis.txt', 'r')
f5 = open('2016-09-09-22_25_U_initial-Hysteresis.txt', 'r')
f6 = open('2016-09-09-22_26_A_initial-Hysteresis.txt', 'r')
f7 = open('2016-09-09-22_26_F_initial-Hysteresis.txt', 'r')
f8 = open('2016-09-09-22_26_K_initial-Hysteresis.txt', 'r')
f9 = open('2016-09-09-22_26_P_initial-Hysteresis.txt', 'r')
f10 = open('2016-09-09-22_26_U_initial-Hysteresis.txt', 'r')
x = f.readlines()
x2 = f2.readlines()
x3 = f3.readlines()
x4 = f4.readlines()
x5 = f5.readlines()
x6 = f6.readlines()
x7 = f7.readlines()
x8 = f8.readlines()
x9 = f9.readlines()
x10 = f10.readlines()
vars = [x, x2, x3, x4, x5, x6, x7, x8, x9, x10]
colors = ['b', 'r', 'g', 'c']
cc = itertools.cycle(colors)
datatable = []
i = 0
for content in vars:
for line_num, line_content in enumerate(content):
data = line_content.split()
row = [[], [], [], []]
for index, num in enumerate(data, start = 0):
isappendable = False
try:
data_attempt = float(num)
index = int(index)
row[index] = data_attempt
if(line_num > 15):
isappendable = True
except ValueError:
data_attempt = 0
if(isappendable):
datatable.append(row)
i = i + 1
c = next(cc)
index = []
input = []
output = []
for n,x in enumerate(datatable):
input.append(x[0])
output.append(x[1])
num_str = str(i)
name = "DUT" + num_str
plt.plot(input, output, label = name)
plt.legend(loc='upper left')
plt.show()
这看起来非常接近我想要的(有10条线彼此明显重叠),但是我遇到的问题是,图例中的颜色似乎与图中的颜色不匹配。图例显示了我希望绘图显示的颜色,但是线条都是一样的(即使放大时也是如此)。我该如何解决?谢谢
答案 0 :(得分:0)
我查看了您的代码以尝试找出错误所在,并确定了一些应更改的内容。
您可以使用for循环,而不是手动为每个文件创建变量。
在处理完文件后,使用with
上下文管理器将负责清理。
vars
和input
是Python中的保留关键字,因此虽然您可以使用它们(并且可能会起作用),但最好使用一些东西其他。
您可以像使用其他for循环那样使用enumerate
,而不用使用i
。
您无需指定start = 0
,因为无论如何这都是默认值。
您不需要执行int(index)
,因为索引已经是int
。
不要像使用x
和index
那样混淆并重复变量名,这会使它们更难以跟踪。
我认为您的主要问题是您的datatable
,应在循环中对其进行初始化。否则,您将像@Bazingaa所说的那样重复绘制相同的内容。 / p>
您已经使用枚举声明了n
,但从未使用过。
您声明了index
数组,但从不使用它。
num_str
变量无用。
我在下面解决了其中一些问题:
import csv
import itertools
import pylab
import numpy as np
import matplotlib.pyplot as plt
colors = ['b', 'r', 'g', 'c']
cc = itertools.cycle(colors)
# List of filenames to read
filenames = ["2016-09-09-22_25_A_initial-Hysteresis.txt", "2016-09-09-22_25_F_initial-Hysteresis.txt", ...]
for i, filename in enumerate(filenames):
with open ("/path/to/filename/"+filename) as f:
content = f.readlines()
datatable = []
for line_num, line_content in enumerate(content):
data = line_content.split()
row = [[], [], [], []]
for index, num in enumerate(data):
isappendable = False
try:
data_attempt = float(num)
row[index] = data_attempt
if line_num > 15:
isappendable = True
except ValueError:
data_attempt = 0
if(isappendable):
datatable.append(row)
c = next(cc)
input = []
output = []
for x in datatable:
input.append(x[0])
output.append(x[1])
name = "DUT" + i
plt.plot(input, output, label = name)
plt.legend(loc='upper left')
plt.show()
希望这会有所帮助!
答案 1 :(得分:0)
看起来完整的代码可以简化为几行。
import numpy as np
import matplotlib.pyplot as plt
# List of filenames to read
filenames = ["2016-09-09-22_25_A_initial-Hysteresis.txt",
"2016-09-09-22_25_F_initial-Hysteresis.txt",
# ...
"2016-09-09-22_26_U_initial-Hysteresis.txt"]
for i, filename in enumerate(filenames):
inp, outp = np.loadtxt(filename, usecols=(0,1), unpack=True)
if len(inp) < 15:
continue
plt.plot(inp, outp, label = "DUT" + i)
plt.legend(loc='upper left')
plt.show()