【问题标题】:How to plot many datasets from numpy list with matplotlib如何使用 matplotlib 从 numpy 列表中绘制许多数据集
【发布时间】:2016-12-12 20:10:29
【问题描述】:

我是 Python 新手,正在努力使用 matplotlib 在一张图上绘制多条曲线。

我有 50 个数据文件。我已将它们全部阅读并将它们存储在 3D numpy 列表中。第一维是文件号,第二维是时间,第三维是被测量的参数(时间,压力,...)。对于单个文件,数据可能如下所示:

(时间)(压力) 1 3.4 2 5.1 3 5.1 4 5.1 5 7.8

我想在一张图上绘制所有 50 时间与压力的曲线。到目前为止我所拥有的是:

plt.plot(\
    clipData[0,:,0], clipData[0,:,1],\
    clipData[1,:,0], clipData[1,:,1],\
    clipData[2,:,0], clipData[2,:,1])
plt.show()

这对于前三条曲线效果很好,但我认为必须有一种方法可以做到这一点,而无需手动将列表生成到 50 个。我考虑过使用循环将列表构建为长字符串,然后推将此字符串放入 plot()。

guts = 'clipData[0,:,0], clipData[0,:,1]'
plt.plot(guts)
plt.show

但我的简单测试清楚地表明我做错了什么。

任何帮助将不胜感激,我相信有一种优雅的方式可以做到这一点。

【问题讨论】:

    标签: python arrays matplotlib


    【解决方案1】:

    也许是这样的:

    for i in range(50):
        plt.plot(clipData[i,:,0], clipData[i,:,1])
    plt.show()
    

    因为当你使用 guts = 'clipData[0,:,0], clipData[0,:,1]' guts 只是一个无法绘制的字符串。

    【讨论】:

      【解决方案2】:

      您可以将两个二维数组传递给plot。第一个数组中的每一列都将根据第二个数组的对应列进行绘制。

      plt.plot(clipData[:, :, 0].T, clipData[:, :, 1].T)
      

      以这种方式绘图在指定线条属性时会受到一定的限制,特别是您不能为每条线条传递标签。为了完全控制线属性,在循环中绘制会更方便。

      【讨论】:

      • 不错。比我的解决方案干净得多。
      • 啊,我明白了。谢谢你的澄清。
      【解决方案3】:
      for i in range(0,len(clipData)):
          plt.plot(clipData[i,:,0],clipData[i,:,1])
      plt.show()
      

      这样,您的绘图例程将针对任何长度的 clipData 运行,或者如果您将来更改它。

      【讨论】:

      • 效果很好,谢谢。 len() 如何知道您想要列表第一个轴的维度。它是否默认为第一个轴?我一直在说 len(clipData[:,0,0]) 之类的东西,但显然不需要。
      • 我对 numpy 数组的内部工作原理不是很熟悉。但是这里有很多可用的信息:docs.scipy.org/doc/numpy/reference/…docs.scipy.org/doc/numpy/reference/arrays.ndarray.htmldocs.python.org/2/library/functions.html#len。从最后。 “len:返回对象的长度(项目数)。”抱歉,我帮不上忙,这是我无法记住的细微差别。
      • @tfinan74 Goyo 的回答比我的好,简洁多了!
      • @tfinan74 len 将返回第一个维度。你也可以使用clipData.shape[0]
      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      相关资源
      最近更新 更多