我应该如何从csv文件中自动将值读入Matplotlib的aitoff投影?

时间:2017-10-31 22:55:47

标签: python csv numpy matplotlib

我现在已经四周寻找答案了,我似乎找不到任何帮助。基本上我正试图从csv文件中读取值(确切地说是2列)。这是一个例子:

from astropy import units as u
from astropy.coordinates import SkyCoord
import matplotlib.pyplot as plt
import numpy as np
from numpy import genfromtxt
my_data = genfromtxt('TGAS_2MASS_ALLWISE_TYC2.csv', delimiter = ', ', usecols=['ra','dec'])
plt.figure(figsize=(8,4.2))
plt.subplot(111, projection="aitoff")
plt.title("Aitoff")
plt.grid(True)
plt.plot(my_data, 'o', markersize=2, alpha=1)
plt.subplots_adjust(top=1,bottom=0.0)
plt.show()

我尝试了许多不同的方法来完成这项工作,但我似乎找不到任何方法。这是它给我的错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-16-da402c9f65a8> in <module>()
      4 import numpy as np
      5 from numpy import genfromtxt
----> 6 my_data = genfromtxt('TGAS_2MASS_ALLWISE_TYC2.csv', usecols=['ra','dec'], delimiter = ',')
      7 plt.figure(figsize=(8,4.2))
      8 plt.subplot(111, projection="aitoff")

c:\python36\lib\site-packages\numpy\lib\npyio.py in genfromtxt(fname, dtype, comments, delimiter, skip_header, skip_footer, converters, missing_values, filling_values, usecols, names, excludelist, deletechars, replace_space, autostrip, case_sensitive, defaultfmt, unpack, usemask, loose, invalid_raise, max_rows)
   1626             # if usecols is a list of names, convert to a list of indices
   1627             if _is_string_like(current):
-> 1628                 usecols[i] = names.index(current)
   1629             elif current < 0:
   1630                 usecols[i] = current + len(first_values)

AttributeError: 'NoneType' object has no attribute 'index'

2 个答案:

答案 0 :(得分:1)

一切都取决于csv文件的外观。但即使它有列名

ra, tum, dec, mor
1, 2, 3, 5
2, 4, 5, 3
2, 1, 4, 3

您仍然可以使用usecols=[0,2]阅读它。文档说明:

  

usecols:序列,可选
  要读取哪些列,其中0为第一列。例如,usecols =(1,4,5)将提取第2列,第5列和第6列。

因此,您不能将字符串用作列,而是使用整数。

u = u"""ra, tum, dec, mor
1, 2, 3, 5
2, 4, 5, 3
2, 1, 4, 3"""

import io
import matplotlib.pyplot as plt
from numpy import genfromtxt


my_data = genfromtxt(io.StringIO(u), delimiter = ', ', usecols=[0,2])

plt.plot(my_data, 'o')

plt.show()

答案 1 :(得分:-1)

根据我的理解,plt.plot将采用2个强制参数(x, y)来表示x和y轴上的数据。 xy这里是值列表(float或int),并且具有相同的长度。所以我认为代码中的plt.plot(my_data, 'o', markersize=2, alpha=1)是错误的。你的mydata是n次n矩阵,所以很多matpltolib试图说它不能绘图,因为数据是&gt; 3维?