【问题标题】:plotting data from a list in python从python中的列表中绘制数据
【发布时间】:2018-08-29 23:51:30
【问题描述】:

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

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

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])。

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

有没有cmets?

【问题讨论】:

  • 您使用的是 python 2.7 还是 3+?如果您使用 2.7,我建议使用 cPickle 导入将数组保存在 pickle 文件中。否则你可以看 3+ 的泡菜。我知道这不能回答您的问题,但它可以更轻松地从硬盘读取对象。
  • 我使用 python 2.7

标签: python arrays string list matplotlib


【解决方案1】:

只要说您有数组 [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 标签的原因。

【讨论】:

  • 我试过了,将值复制粘贴到另一个变量中,有效。但是,当它来自 python 脚本时,它不会,然后我得到了我在图像 1 上呈现的内容。这些值被视为 yLabel。你能看到图 1 吗?
  • 检查您传递的值是否存储为 str 或 int。如果它们是字符串,您可以添加一些代码,如 xs = [int(x) for x in xs] 将它们转换回整数
  • 'lst = [line.rstrip() for line in f]' 'lst = [float(x) for x in lst]' 我得到:ValueError: could not convert string to float: [ 0.0, 3.8, 4.5, 4.3, 2.1, 2.2, 0.0] 我真的要疯了
  • 所以它是一个字符串而不是一个浮点数!如果正确准备了字符串(不包括非浮点字符),您的转换应该可以工作。也许打印列表以检查字符串是否包含任何额外的引号或类似字符
  • 是的,数据默认存储为字符串。我不知道这个。如果我在保存数据时使用 np 数组,则一切都已修复,并且此处给出的所有解决方案都有效。即np.savetxt("vels.txt", np.array(velocities))
【解决方案2】:

只是一种可能的简单解决方案。使用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。然后这是结果。

【讨论】:

  • 我收到此错误:lst = [map(float,line.split()) for line in f] ValueError: could not convert string to float: [0.0,
  • 谢谢,但我得到了同样的错误。 lst = [map(float,line.split(',')) for line in f] ValueError: could not convert string to float: [0.0
  • 正如我在第一篇文章中提到的,完成这项工作的唯一方法是将行转换为字符串,然后删除括号。使用 [1:-1],即:y = np.fromstring(str(lst[1])[1:-1], dtype=np.float, sep=',')
  • @user3766029 “唯一的方法”,不,我不这么认为。显然,python 无法将[] 转换为float 数字,所以在第一步,假设您已经删除了左右方括号。现在,让我再次编辑答案。
【解决方案3】:

这个例子并不完整,所以这里必须做一些假设。一般来说,使用 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()

【讨论】:

  • 谢谢,这是我一直在寻找的正确方法。我真的搞砸了列表,我当然永远不会忘记 numpy 来存储数据。我也有位置数据,这是(x,y)的类似矩阵。你有什么建议吗?将位置存储在不同的文件中,或将数据保存在单个文件中为 (x,y,vel) ?
  • 这完全取决于你想如何使用它。在这个例子中,数组的行是汽车的速度。因此,要添加位置,您需要一个 3D 数组。或者您将格式完全更改为带有 (x,y,vel,car_number) 的列数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2020-07-18
  • 1970-01-01
  • 2017-07-02
  • 2016-11-06
相关资源
最近更新 更多