【问题标题】:Matplotlib plotting generatorsMatplotlib 绘图生成器
【发布时间】:2015-12-17 12:15:32
【问题描述】:

当我这样做时它会绘图(在 Python 3 中):

import matplotlib.pyplot as plt

a = [1,2,3,4,5]

plt.plot(range(5), a)
plt.show()

据我所知,在 Python 3 中,range() 返回一个迭代器,因此我上面的代码几乎是在迭代器上绘制的。现在我的问题是,为什么我不能这样做:

def myGen(iterable):
    for i in iterable:
        yield i
a = myGen([1,2,3,4,5])
plt.plot(range(5),a)
plt.show()

当我尝试这个时,我得到ValueError: x and y must have same first dimension

当您考虑它时,想要绘制两个生成器是有道理的。只是一个接一个的情节。这在matplotlib 中可行吗?

我知道there is a similar thread,很遗憾没有得到答复。

【问题讨论】:

  • range 不是迭代器,它是一个 不可变序列plt.plot(range(5), (i for i in (1,2,3,4,5))) 会以同样的方式失败,您不能将生成器传递给 plot
  • @PadraicCunningham:这与它无关。它不会因为range 而失败,而是因为生成器表达式。
  • @BrenBarn,这正是我刚才所说的。
  • @PadraicCunningham:但这正是他要问的:为什么他不能通过生成器来绘图?
  • @BrenBarn,没有人问为什么 range 有效但生成器失败,OP 认为它们具有可比性,但它们不是

标签: python matplotlib plot iterator generator


【解决方案1】:

问题是,尽管 Python 3 中的 range 不是一个真正的列表,但它仍然提供了比您的自定义生成器更多的功能。特别是,它提供了__len__。这是至关重要的,因为 matplotlib 在后台将所有内容都转换为 numpy 数组,而 numpy 数组需要预先知道它们的大小。 Python 3 范围对象也提供了项目访问,所以它们真的很像普通的序列。您可以在the documentation 中看到它们不是简单的生成器。

我不确定你需要做些什么才能让你自己的自定义类在这里工作,但这可能比它的价值更麻烦。 Matplotlib 需要能够将您的数据转换为 numpy 数组,而 numpy 反过来需要比简单的“这个对象是可迭代的”更多的信息。它需要能够知道有多少数据并一次获取所有数据。

【讨论】:

  • 如果 matplotlib 会将我作为参数放入其中的任何合适的东西转换为 numpy 数组,那么我宁愿首先传入一个 numpy 数组。我希望 matplotlib 有一个算法,它需要两个生成器并在它们上调用 __next__() 并反复绘制绘图点,然后当我在绘图上调用 show() 时,它只是渲染并以某种方式获得所有点画在图上。但是,是的,显然我只是要传入数组。
  • @Deniz:不,它不会那样做。就像我说的,它在开始时将整个数据集转换为 numpy 数组。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2021-03-25
  • 2020-03-31
  • 2016-11-06
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多