我正在研究一个不断发展的系统,其状态在列表列表中记录为浮点数。每个矩形代表一个数字;落在各种范围内的数字将以不同的颜色绘制,就像分级地图一样。我想描绘整个系统演变过程中的许多镜头,并且
为简单起见,这里有一个最小的例子。调用列表列表中的每个条目时move_one_step
将添加到统一随机漫游中。困难在于更新图形对象并以正确的方式调用move_one_step
。
#!/usr/bin/env python3
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
def move_one_step(list_in):
hold_list =list_in
for i in list(range(LEN_BLOCK)):
for j in list(range(LEN_BLOCK)):
list_in[i][j] +=np.random.uniform(0,VMAX) # Uniform within 0 and `VMAX`.
return hold_list
LEN_BLOCK =10
MAX_NUM_STEP =10
VMAX =4
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
list_sys =[ [0]*LEN_BLOCK for _ in list(range(LEN_BLOCK)) ]
hold_axes =plt.pcolormesh(list_sys, vmin=0, vmax=VMAX)
plt.colorbar()
fig =hold_axes.get_figure()
out_video_path ="./evolution.mp4"
DPI =100 # Dots per inch.
FPS =5 # `fps`: frame rate
writer =animation.FFMpegWriter(fps=FPS)
with writer.saving(fig, out_video_path, DPI):
for i in range(MAX_NUM_STEP):
list_sys =move_one_step(list_sys)
hold_axes.set_array(list_sys)
writer.grab_frame()
解释失败,错误消息摘录如下:
Traceback (most recent call last):
File "./animation.py", line 42, in <module>
writer.grab_frame()
File "/usr/local/lib/python3.6/site-packages/matplotlib/animation.py", line 328, in grab_frame
dpi=self.dpi, **savefig_kwargs)
File "/usr/local/lib/python3.6/site-packages/matplotlib/figure.py", line 1573, in savefig
...
[I omitted the rest]
...
AttributeError: 'list' object has no attribute 'ndim'
错误不明显。我相信我未能对应轴和图形对象的类型,但我对它们的理解很差。
我的想法的主要来源:Python 中的 2D 网格数据可视化;动画示例代码
对不起,我只是复制和粘贴并应用了我自己的很多猜测......
你是对的,"错误不明显"。关于set_array()
似乎有一个非常特别的细节,在这个问题的答案中有 2 个提到。也就是说,您必须使用一维数组进行set_array()
。这也取决于shading
设置。我不确定您的真正期望是什么,但这将解决错误并在此处为您的特定情况提供视频:
更改 hold_axes.set_array(list_sys)
到hold_axes.set_array(np.array(list_sys).ravel())
.
实际上我只是发现我必须在@Luo的回答之后使用1d(不是2d(numpy数组(不是列表(。我想评论几件事:plt.pcolormesh
返回一个QuadMesh
; QuadMesh
的方法set_array
接收一维数组,该数组将从左到右描绘因此,在我看来,pcolormesh
"只"收到 2D 数组具有高度误导性!(我的代码中有几个小错误,但我没有时间准备另一个正确的最小示例。正如所指出的,未能对应于函数调用就足够了,这是错误的根源。如果您发现我的理解不正确,请在评论中纠正我。
参考:matplotlib.collections(在页面中搜索你想知道的方法,看看它的"原型"(