我需要绘制一些物体(汽车)的速度。
每个速度都通过例程计算并写入文件中,大致通过这个(我删除了一些行来简化):
thefile_v= open('vels.txt','w')
for car in cars:
velocities.append(new_velocity)
if len(car.velocities) > 4:
try:
thefile_v.write("%s\n" %car.velocities) #write vels once we get 5 values
thefile_v.close
except:
print "Unexpected error:", sys.exc_info()[0]
raise
这是一个文本文件,其中包含每辆车的速度列表。
类似的东西:
[0.0, 3.8, 4.5, 4.3, 2.1, 2.2, 0.0]
[0.0, 2.8, 4.0, 4.2, 2.2, 2.1, 0.0]
[0.0, 1.8, 4.2, 4.1, 2.3, 2.2, 0.0]
[0.0, 3.8, 4.4, 4.2, 2.4, 2.4, 0.0]
然后我想绘制每个速度
with open('vels.txt') as f:
lst = [line.rstrip() for line in f]
plt.plot(lst[1]) #lets plot the second line
plt.show()
这是我发现的。这些值被视为一个字符串,并将它们作为yLabel。
我得到了这个:
from numpy import array
y = np.fromstring( str(lst[1])[1:-1], dtype=np.float, sep=',' )
plt.plot(y)
plt.show()
我学到的是,我之前构建的速度列表集被视为数据行。
我必须将它们转换为数组才能绘制它们。然而括号[]正在走向正轨。通过将数据行转换为字符串并通过此方法删除括号(即[1:-1])。
它现在正在运作,但我确信有更好的方法可以做到这一点。
有任何意见吗?
答案 0 :(得分:0)
只要说你有数组[0.0, 3.8, 4.5, 4.3, 2.1, 2.2, 0.0]
,就可以将代码看起来像:
import matplotlib.pyplot as plt
ys = [0.0, 3.8, 4.5, 4.3, 2.1, 2.2, 0.0]
xs = [x for x in range(len(ys))]
plt.plot(xs, ys)
# Make sure to close the plt object once done
plt.close()
如果你想为x轴设置不同的间隔,那么:
interval_size = 2.4 #example interval size
xs = [x * interval_size for x in range(len(ys))]
:从文本文件中读取值时,请确保将值从字符串转换回整数。这可能就是为什么你的代码假设你的输入是y标签。
答案 1 :(得分:0)
只是一个可能的简单解决方案。使用map
功能。在您的文件中说,您存储的数据类似,没有任何[
和]
不可转换的字母。
#file_name: test_example.txt
0.0, 3.8, 4.5, 4.3, 2.1, 2.2, 0.0
0.0, 2.8, 4.0, 4.2, 2.2, 2.1, 0.0
0.0, 1.8, 4.2, 4.1, 2.3, 2.2, 0.0
0.0, 3.8, 4.4, 4.2, 2.4, 2.4, 0.0
然后下一步是;
import matplotlib.pyplot as plt
path = r'VAR_DIRECTORY/test_example.txt' #the full path of the file
with open(path,'rt') as f:
ltmp = [list(map(float,line.split(','))) for line in f]
plt.plot(ltmp[1],'r-')
plt.show()
答案 2 :(得分:0)
示例不完整,因此必须在此进行一些假设。通常,使用numpy或pandas来存储数据。
假设car
是一个具有velocity
属性的对象,您可以在列表中写入所有速度,将此列表保存为numpy的文本文件,再次使用numpy读取并绘制它。
import numpy as np
import matplotlib.pyplot as plt
class Car():
def __init__(self):
self.velocity = np.random.rand(5)
cars = [Car() for _ in range(5)]
velocities = [car.velocity for car in cars]
np.savetxt("vels.txt", np.array(velocities))
####
vels = np.loadtxt("vels.txt")
plt.plot(vels.T)
## or plot only the first velocity
#plt.plot(vels[0]
plt.show()