如何从文件中的python中绘制数据,第一列是字符串,第二列是数字?

时间:2018-10-20 05:31:16

标签: python matplotlib genfromtxt

假设我有一个名为FARM的文件,其中包含以下数据

pigs 23
horses 10
cows 35
goats 20
sheep 22
chickens 62
roosters 5

我想用以下结果绘制此数据

enter image description here

以下代码正是我想要的

import matplotlib.pyplot as plt
import numpy as np
a,b = np.genfromtxt('FARM', usecols=(0,1), unpack=True, delimiter=' ', dtype='str')

x=[]
for i in a:
   x.append(i)

y=[]
for i in b:
   y.append(int(i))

plt.plot(x,y,'s')
plt.show()

我的问题是:是否有直接方法可以从np.genfromtxt获取x和y,还是必须像我一样从a和b转换?

如果可以为每列有选择地设置dtype,我将拥有所需的东西。但是我还无法弄清楚该怎么做。

经过进一步考虑,考虑到注释和答案,我认为从同一文件中绘制具有不同数据类型的列的一种更直观的方法是对np.genfromtxt进行两次调用,每个调用都提取一个列,然后继续进行操作。通常的方法如下:

x = np.genfromtxt('FARM', usecols=(0),  unpack=True,  dtype='str')                 
y = np.genfromtxt('FARM', usecols=(1),  unpack=True,  dtype='int')        

plt.plot(x,y,'s')
plt.show()

这种方式不需要特殊的转换。

1 个答案:

答案 0 :(得分:0)

有直接方法可直接从文件中获取各个数据类型。为此,您必须使用dtype=None。这样做将保留默认的dtypes。将生成一个元组列表,您可以使用x将其分成两个子列表yzip,然后直接绘制。

data = np.genfromtxt('FARM', usecols=(0,1), delimiter=' ', dtype=None)
x, y = list(zip(*data))
plt.plot(x,y,'s')

enter image description here

一种替代方法是直接使用map将字符串转换为int,而不是使用for循环。

a,b = np.genfromtxt('FARM', usecols=(0,1), unpack=True, delimiter=' ', dtype='str')

y = list(map(int, b))
plt.plot(a,y,'s')