在绘制numpy.genfromtxt命令返回的数据时,我无法弄清楚如何在matplotlib中使用“names”。 场景: 1.我有一个包含列标题和值行的文件 2.我事先不知道列标题 - 它们是以编程方式生成的,并且可能在程序运行期间发生变化 3.我需要读取数据和列标题,绘制它们并生成相应的图例。
我可以使用以下名称读取数据列:
dataArray = numpy.genfromtxt('myData.csv', delimiter = ',', names = True)
然后用
绘制它们matplotlib.plot.plot(dataArray)
matplotlib.plot.show()
但我如何制作合适的传奇?我认为没有参数的图例命令就足够了(例如matplotlib.plot.legend()
)但事实并非如此。我得到了一个错误:
/usr/lib/python2.7/site-packages/matplotlib/axes.py:4601:UserWarning:找不到标记的对象。在个别情节上使用label ='...'kwarg。 warnings.warn(“找不到标记的对象。”
换句话说:那些“名字”去哪里,我该如何找回它们?谷歌,matplotlib网站和numy网站上的多次搜索没有产生任何结果。
答案 0 :(得分:2)
您必须在label=..
函数中为要绘制的每一行提供plot
关键字,因为matplotlib不会自动检测numpy结构化数组中的名称(您也可以使用pandas,这样做,见下文)。
比如说你的数据看起来像这样:
from StringIO import StringIO
myDatacsv = StringIO("""a, b, c
1, 2, 3
2, 3, 4
3, 4, 5""")
使用numpy.genfromtxt
读取它们会生成结构化数组:
>>> import numpy as np
>>> dataArray = np.genfromtxt(myDatacsv, delimiter = ',', names = True)
>>> dataArray
array([(1.0, 2.0, 3.0), (2.0, 3.0, 4.0), (3.0, 4.0, 5.0)],
dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])
(在您的情况下,"myData.csv"
而不是myDatacsv
偏离正常,这只是为了举例)
现在,您可以遍历列名称并绘制每个列名称:
import matplotlib.pyplot as plt
plt.figure()
for col_name in dataArray.dtype.names:
plt.plot(dataArray[col_name], label=col_name)
plt.legend()
plt.show()
这将生成如下图:
使用pandas,这将产生相同的数字(自动绘制数据框的所有列并将其添加到图例中):
import pandas as pd
# one of the following will do (reading it with pandas, or converting
# from the numpy array to pandas dataframe)
data_df = pd.read_csv(myDatacsv)
data_df = pd.DataFrame(dataArray)
data_df.plot()
有关pandas的详细信息,请参阅:http://pandas.pydata.org/