2012-11-18 13 views
14

時間の経過と共に成長するグラフをアニメーション化したいと思います。NetworkXとMatplotlibでネットワークの成長をアニメーション化する

これは私がこれまで持っているものです。

fig = plt.figure() 
ims = [] 
graph = nx.Graph() 
for i in range(50): 
    // Code to modify Graph 
    nx.draw(graph, pos=nx.get_node_attributes(graph,'Position')) 
    im = plt.draw() 
    self.ims.append([im]) 
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,repeat_delay=1000) 
ani.save('dynamic_images.mp4') 
plt.show() 

はしかし、私は、次のエラーメッセージが出ます:私が欲しいもの

File "main.py", line 204, in <module> 
    repeat_delay=1000) 
    File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 356, in __init__ 
    TimedAnimation.__init__(self, fig, *args, **kwargs) 
    File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 304, in __init__ 
    Animation.__init__(self, fig, event_source=event_source, *args, **kwargs) 
    File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 53, in __init__ 
    self._init_draw() 
    File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 363, in _init_draw 
    artist.set_visible(False) 
AttributeError: 'NoneType' object has no attribute 'set_visible' 
[email protected]ualBox:~/Desktop/CS8903-SpecialProblem/Code/ 

あなたはグラフが成長して見ることができ、アニメーション、です。私は各段階でグラフを保存することができ、matplotlibの外側にアニメーションを作成できるかもしれませんが、このように動作させる方法はありますか?

+0

バックエンドは何をしたのか分からないのですか?いくつかのバックエンドでアニメーションの問題が発生しました。 matplotlibの[basic_example.py](http://matplotlib.org/examples/animation/basic_example.html)を実行できますか? – tiago

+0

はい、それは私のために完全に動作します。 バックエンドに関しては、私はちょうどubuntu、python 2.7、numpy、scipy、networkx、matplotlibなどです...最近数日間でインストールされているので、最新のバージョンです... 基本的には学生です。いくつかのexpererimentsを試して、それは本当にこれらのグラフをアニメーション化するために役立つだろう、私は彼らがどのように成長するかを見ることができます! – Nicomoto

+0

私はnetworkxに慣れていません。おそらく問題は 'ArtistAnimation'はmatlotlibアーティストであり、nxオブジェクトではないと期待しているということでしょうか? – tiago

答えて

9

レビューしたところ、このコードは、私が思っていたほどこの問題には関係しませんでした。しかし、私はthis SO answerthis SO answerを使って答えをまとめました。グラフを作成し、50個のランダムなノードと50個のランダムなエッジを追加し、すべてのノードとエッジが追加された後にグラフのイメージを表示するコードです。あなたのコードからの主な変更の数:

  1. このコードは(詳細はhereを参照)pylab.ion()を使用することに基づいています。
  2. あなたのコードは1つのFigureを使用し、その中のイメージを変更しようとします。このコードは、フレームごとに新しいFigureを作成します。
  3. このコードは.mp4に書き出されません。あなたが本当にそれをする必要があるなら、それらをレンダリング中に.pngファイルに書き出し、その事実の後にmp4に変換することをお勧めします。
  4. このコードでは、time.sleep()の代わりにmatplotlib.pyplot.pause()が使用されています。 time.sleep()を使用すると、数値が表示されません。

幸運!

import random 
import pylab 
from matplotlib.pyplot import pause 
import networkx as nx 
pylab.ion() 

graph = nx.Graph() 
node_number = 0 
graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100))) 

def get_fig(): 
    global node_number 
    node_number += 1 
    graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100))) 
    graph.add_edge(node_number, random.choice(graph.nodes())) 
    fig = pylab.figure() 
    nx.draw(graph, pos=nx.get_node_attributes(graph,'Position')) 
    return fig 

num_plots = 50; 
pylab.show() 

for i in range(num_plots): 

    fig = get_fig() 
    fig.canvas.draw() 
    pylab.draw() 
    pause(2) 
    pylab.close(fig) 
+0

遅れて申し訳ありませんが、いずれにしても、あなたの提案は、私が最初にやったことです、私はグラフをプロットし、個々のPNGを保存して、 私はionで実装しましたが、唯一の問題はこれらをgifファイルとして保存できないことですが、実行時に変更が反映されるので、かなりクールです – Nicomoto

+0

ありがとう!私はmatplotlib.animation.FuncAnimation(詳細についてはhttp://matplotlib.org/api/animation_api.htmlを参照)を使用して代替ソリューションを試すことを意味したが、私は時間がなかった。 – brentlance

12

改良されたバージョンのbretlanceです。それが助けになることを願っています。 アニメーションが表示されますが、の画像はありませんの画像です。

はまだ疑問の所有者 Animate drawing networkx edges はmatplotlibののアニメーションの使用

#!/usr/bin/env python 
import random 
import pylab 
from matplotlib.pyplot import pause 
import networkx as nx 
pylab.ion() 

graph = nx.Graph() 
node_number = 0 
graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100))) 

def get_fig(): 
    global node_number 
    node_number += 1 
    graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100))) 
    graph.add_edge(node_number, random.choice(graph.nodes())) 
    nx.draw(graph, pos=nx.get_node_attributes(graph,'Position')) 

num_plots = 50; 
pylab.show() 

for i in range(num_plots): 

    get_fig() 
    pylab.draw() 
    pause(2) 
+0

私が探していたもの。ある図面と別の図面との間の素敵な移行。一時停止を減らすと、滑らかなアニメーションが得られます。ありがとう。 :) – mythicalcoder

関連する問題