从python中的列表中绘制数据

时间:2018-03-21 00:59:07

标签: python arrays string list matplotlib

我需要绘制一些物体(汽车)的速度。

每个速度都通过例程计算并写入文件中,大致通过这个(我删除了一些行来简化):

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。

enter image description here

我得到了这个:

from numpy import array

y = np.fromstring( str(lst[1])[1:-1], dtype=np.float, sep=',' )
plt.plot(y)
plt.show()

enter image description here

我学到的是,我之前构建的速度列表集被视为数据行。

我必须将它们转换为数组才能绘制它们。然而括号[]正在走向正轨。通过将数据行转换为字符串并通过此方法删除括号(即[1:-1])。

它现在正在运作,但我确信有更好的方法可以做到这一点。

有任何意见吗?

3 个答案:

答案 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()

在顶部,我假设您想要绘制第二行0.0, 2.8, 4.0, 4.2, 2.2, 2.1, 0.0。然后是结果。 enter image description here

答案 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()

enter image description here