当我这样做时它会绘制(在 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 , 遗憾的是没有答案。
最佳答案
问题在于,即使 Python 3 中的 range
不是真正的列表,它仍然提供比您的自定义生成器更多的功能。特别是,它提供了 __len__
。这是至关重要的,因为 matplotlib 会在后台将所有内容转换为 numpy 数组,而 numpy 数组需要预先知道它们的大小。 Python 3 范围对象也提供项目访问,所以它们真的很像普通序列。你可以在the documentation中看到它们不是简单的生成器。
我不确定您需要做些什么才能使您自己的自定义类在这里工作,但这可能比它的值(value)更麻烦。 Matplotlib 需要能够将您的数据转换为 numpy 数组,而 numpy 反过来需要比简单的“此对象可迭代”更多的信息。它需要能够知道有多少数据并立即获取所有数据。
关于python - Matplotlib 绘图生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32684338/