首页 > 解决方案 > 制作 2D 动画时,python2 与 python3 中的 set_array 问题

问题描述

我一直以同样的方式制作地理数据的 2D 动画。

首先,我使用数据的第一个“帧”(此处为 data0)进行绘图:

    img = ax.pcolormesh(data0.lon.values, data0.lat.values, data0.x.values, cmap='viridis')

然后我调用 FuncAnimation 并将数据传入:

    anim = FuncAnimation(fig, animate, np.arange(monthly_data.time.size), fargs=(fig, img, monthly_data))

然后使用 set_array 用下一帧更新 img 对象

    img.set_array(ma.masked_invalid(this_data[:-1,:-1].ravel()))

这在 python2 中一直运行良好,但我遇到了 python3 的问题。结果以“倾斜”地图结束,我认为我已将其缩小到 set_array 与 py3 中的 QuadMesh 对象的行为不同,但我找不到任何有关 set_array 可能如何变化的信息。

有没有人有什么建议?

标签: pythonpython-3.xmatplotlibcartopy

解决方案


我遇到了同样的问题-这就是发生的事情

您不应使用与数据矩阵大小匹配的 X、Y 数组定义初始四边形网格。这样做会将您的四边形网格的大小裁剪为比数据集短的一行/列。

文档

X 和 Y 的维度应该比 C 的维度大一。或者,X、Y 和 C 可能具有相同的维度,在这种情况下,C 的最后一行和最后一列将被忽略。

当您使用:

qm.set_array(new_array)

您将扁平数组扔进构造函数中,该构造函数将按顺序放置值,但期望不同大小的数组。您得到的不是错误,而是四边形网格,其中每列的最后一个连续元素被放置在下一行中,从而创建了扭曲的网格。

使用适当间隔的额外行和列定义原始文件,或者在使用 set_array() 时手动调整它们以匹配较小的四边形网格。


推荐阅读