python - Matplotlib 绘图生成器

标签 python matplotlib plot iterator generator

当我这样做时它会绘制(在 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/

相关文章:

python - 与 Matlab 相比,在 python 中从 Matlab 的 .mat 中读取 cv::Mat 得到不同的结果

python - matplotlibrc.py 未重置后端

python - matplotlib 出条形图的两个图例

python - Matplotlib:让 contourf 颜色标签以对数刻度和多个级别显示

r - 使用雷达/极坐标图来描绘单个数据点

python - 2 个地 block 的交集(鼠尾草)

python - 如何使 matplotlib 极坐标图中的角度顺时针旋转,顶部为 0°?

python - 如何检查 numpy.float64(0)?

python - SQLAlchemy 级联删除到多对多表

python - Matplotlib:将plot_surface中的cmap设置为x轴和y轴