2017-04-30 13 views
0

私は、ループごとにシャッフルするゼロ、1、および2の2次元numpy配列(enviro_gridという名前)を持っています。変化するカラーマップのアニメーションをアニメーション化して、すべてのエージェントが私が期待する動作に従っていることを視覚的に検証/実証することができます。Python:2D numpy配列を変更するカラーマップをアニメーション化する

コードの

スケルトン概要:

import numpy as np 
import random 
import pylab as plt 

#...initialize values, setup, seed grid with 0's, 1's, 2's, etc... 

for t_weeks in range(time_limit): 

    for j in range(player_n): 

    #...Here lie a bunch of for/if loops which shuffle values around via rules... 
    #...culminating in grid/array updates via the following line... 
    #...which is seen a few times per iteration as the P[:,j]'s change. 
    #...Note that P[6, j] and P[7, j] are just x, y array locations for each agent... 
    #...while P[0, j] is just a designation of 1 or 2 

     enviro_grid[int(P[6, j]), int(P[7, j])] = int(P[0, j]) 

    #...Then I have this, which I don't really understand so much as... 
    #... just copy/pasted from somewhere 

    im = plt.imshow(enviro_grid, cmap = 'hot') 
    plt.colorbar(im, orientation='horizontal') 
    plt.show() 

私はすでに、助けのためのいくつかのリンクを見てきました。例えば、これらの

How to animate the colorbar in matplotlib

Colormap issue using animation in matplotlib

http://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/

私はあまりにも私のリーグの再外です:Pythonは、私が見ているもののはるかに少ないテーラーの半分を理解すること私自身のコードに私がおそらく有用である必要があるような非常に基本的なヘルプを説明するのを助けるために、私が過去に行ったプロットはplot(x、y、options)の形式であり、ループ反復中のプロットの自然な副産物です。このfig.methodとplt.methodのすべては、最終的なplt.show()で最高潮に達し、私を混乱させ、怒らせます。上記のすべての例でdef()関数を使用すると、私自身の文脈に移行する限り、私の明快さがさらに悪化します。

私のコードに基づいてこれを実現するソリューションを提供してもらえますか?私は必要に応じて詳細を提供することができますが、この短いスタックオーバーフローの設定を維持しようとしています。

ありがとうございました。

答えて

0

matplotlibで簡単なアニメーションを行う上で最大の課題は、plt.showコマンドのブロック動作を理解して回避することです。それはthis questionにうまく記述されています。

import numpy as np 
import pylab as plt 

def get_data(): return np.random.randint(0,3,size=(5,5)) 

im = None 
for _ in xrange(20): # draw 20 frames 
    if not im: 
     # for the first frame generate the plot... 
     im = plt.imshow(get_data(), cmap = 'hot', interpolation='none',vmin=0,vmax=2)  
     plt.colorbar(im, orientation='horizontal') 
    else: 
     # ... for subsequent times only update the data 
     im.set_data(get_data()) 
    plt.draw() 
    plt.pause(0.1) 

注意あなたがあなたのGUI実際にプロットを描画するのに十分な時間を与えるためにplt.pauseコマンドが必要ですが、あなたはおそらく時間がはるかに作ることができること:あなたの特定の問題のために、多分このようなものは良い出発点になります短く

+0

(以前のコメントをまとめて削除しました。また、私はあなたの助けに感謝の言葉を削除したことに気付きましたので、もう一度言いましょう:ありがとうございます!) I私はちょうどイメージにリンクすることができることを認識しました。ですから、わかりやすくするために、私はforループの時間をforループ/時間ループの最後に入れていますが、それは "働いています"が、これを実行します: http://i.imgur.com/tFNGPDD.png このエラーメッセージまたは警告メッセージも表示します:MatplotlibDeprecationWarning:このGUI固有の関数がwarnings.warn(str、mplDeprecation)に実装されるまで、デフォルトイベントループを使用します。 –

+0

イメージとカラーバーを複数回作成しているようです。おそらくフレームごとに1回です。私が掲示したコードスニペットでは、 'imshow'コマンドと' colorbar'コマンドは最初のフレームに対してのみ実行され、後続のすべてのフレームについては既に存在するプロットのデータが更新されています。なぜあなたのケースでは、それらの文がすべてのフレームに対して実行されるのか分かりません。ある時点で 'im'変数を' None'または '0'に設定する可能性はありますか?また、私はバックエンドに依存しているかもしれないので、この警告は出ませんが、無視するのはおそらく安全です。 – user8153

+0

おっと!うん、それは、私はあなたのforループを自分で置き換えたとき、私は間違いなくその前にではなく、その中にim = noneを入れました。それを修正し、それは正常に動作します。 もう一度、ありがとうございます。私はすぐにそれか何かのgifを投稿することを願っています。オレンジ色のものを追いかけて食べる小さな白い点を見るのはクールだ。次のステップでは、私の恐ろしい、醜い、面白味のないコードを最適化しています... –

関連する問題