Python:一个以视频形式输出的分层进化系统



我正在研究一个不断发展的系统,其状态在列表列表中记录为浮点数。每个矩形代表一个数字;落在各种范围内的数字将以不同的颜色绘制,就像分级地图一样。我想描绘整个系统演变过程中的许多镜头,并且

为简单起见,这里有一个最小的例子。调用列表列表中的每个条目时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(在页面中搜索你想知道的方法,看看它的"原型"(

最新更新