Matplotlib 绘图生成器

Den*_*niz 5 python plot iterator generator matplotlib

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

import matplotlib.pyplot as plt

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

plt.plot(range(5), a)
plt.show()
Run Code Online (Sandbox Code Playgroud)

据我所知,在 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()
Run Code Online (Sandbox Code Playgroud)

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

当您考虑它时,想要在两个生成器上进行绘图是有意义的。只是一点一点地绘制。这可能吗matplotlib

我知道有一个类似的线程,不幸的是没有得到答复。

Bre*_*arn 4

问题是,即使range在 Python 3 中不是一个真正的列表,它仍然提供比自定义生成器更多的功能。特别是,它提供了__len__. 这一点至关重要,因为 matplotlib 在底层将所有内容转换为 numpy 数组,而 numpy 数组要求预先知道它们的大小。Python 3 范围对象还提供项目访问,因此它们实际上非常类似于普通序列。您可以在文档中看到它们不是简单的生成器。

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