2017-06-11 5 views
0

進化するシステムを研究しています。状態はリストのリストにフロートとして記録されています。各矩形は数字を表します。さまざまな範囲内の数値は、レベルマップのように異なる色で描画されます。私は、システムの進化を通じて多くのショットを肖像画にしたいと思います。Python:ビデオとして出力されるレイヤーカラーの進化システム

ここでは簡単な例を示します。 move_one_stepが呼び出されると、リストのリスト内の各エントリが均一にランダムなウォークに追加されます。難しいのは、Figureオブジェクトを更新して、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' 

エラーが明らかにされていません。私は、軸と図形オブジェクトの種類に対応することができなかったと信じていますが、私はそれらについての理解がよくありません。

私のアイデアの主なソース:2D grid data visualization in Python; Animation example code

は、あなたが「エラーが明らかにされていません」という権利です

答えて

1

....私はちょうどコピーして貼り付けると、私自身の多くの当て推量を適用し、そのためすみません。 this questionの回答のうち2つに記載されている、set_array()についての非常に特別な詳細があるようです。つまり、の場合は、set_array()に1Dアレイを使用する必要があります。また、それはshadingの設定にも依存します。私はあなたが本当に期待するかわからないんだけど、これはエラーを解決し、ここであなたの特定のケースのためのビデオを提供します:

         変更hold_axes.set_array(np.array(list_sys).ravel())hold_axes.set_array(list_sys)
           。

0

実際、私はちょうど@Looの答えの少し後に、1d(2dではなく)のnumpy配列(リストではない)を使用しなければならないことを発見しました。私が発言したいことのいくつか:plt.pcolormeshQuadMeshを返します。 QuadMeshのメソッドset_arrayは1d配列を受け取ります。これは左から右へと移植されます したがって、pcolormeshは2次元配列を受け取ることが非常に間違っているようです! (私のコードにはいくつかの小さなエラーがありますが、別の正しい最小限の例を準備する時間がありません)指摘したように、関数呼び出しに対応していないとエラーが発生します。間違った理解、コメントで私を修正してください)

参考:matplotlib.collections(検索、ページには、この方法は、あなたがその「原型」を参照して、知りたい)

関連する問題