【问题标题】:How to use names when importing csv data into matplotlib将csv数据导入matplotlib时如何使用名称
【发布时间】:2013-05-05 11:29:57
【问题描述】:

在绘制 numpy.genfromtxt 命令返回的数据时,我无法弄清楚如何在 matplotlib 中使用“名称”。 设想: 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:用户警告:未找到标记的对象。在个别地块上使用 label='...' kwarg。 warnings.warn("没有找到标记的对象。"

换句话说:那些“名字”去哪里了,我怎样才能找回它们?在 google、matplotlib 站点和 numy 站点上多次搜索没有产生任何结果。

【问题讨论】:

  • 你能显示你的数据摘录吗?

标签: python matplotlib genfromtxt


【解决方案1】:

您必须在 plot 函数中为您要绘制的每一行提供一个 label=.. 关键字,因为 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()

有关熊猫的更多信息,请参阅:http://pandas.pydata.org/

【讨论】:

  • 谢谢! dtype 位是我所缺少的。我不知道那是列名的最终位置。还要感谢指向熊猫的指针。我去看看。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2020-10-13
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
相关资源
最近更新 更多