16

時間の経過とともに大きくなるグラフをアニメーション化したいと思います。

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

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'
nicomoto@nicomoto-VirtualBox:~/Desktop/CS8903-SpecialProblem/Code/

私が欲しいのは、グラフが成長しているのを見ることができるアニメーションです。各段階でグラフを保存でき、matplotlibの外部でアニメーションを作成できる可能性がありますが、このように機能させる方法はありますか?

4

3 に答える 3

16

ブレットランスの改良版。それが役立つことを願っています。アニメーションは表示されますが、画像ごとには表示されません。

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)
于 2012-12-15T11:39:55.113 に答える
10

確認したところ、そのコードは私が思っていたほどこの問題に関連していませんでした。しかし、私はこのSO回答このSO回答を使用して、回答をまとめることができました。グラフを作成し、それに50個のランダムノードと50個のランダムエッジを追加し、すべてのノードとエッジが追加された後にグラフの画像を表示するコードを次に示します。コードからの重要な変更のいくつか:

  1. このコードはの使用に基づいていますpylab.ion()(詳細については、こちらを参照してください)。
  2. コードは1つの図を使用して、その中の画像を変更しようとします。このコードは、フレームごとに新しい図を作成します。
  3. このコードは.mp4に書き出されません。本当に必要な場合は、レンダリング中に図を.pngファイルに書き込み、事後にmp4に変換することをお勧めします。
  4. このコードはmatplotlib.pyplot.pause()の代わりにを使用することに注意してくださいtime.sleep()。を使用すると、図形はレンダリングされません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)
于 2012-11-26T19:08:28.167 に答える