2012-11-18 22 views
14

würde Ich mag eine Grafik animieren, das im Laufe der Zeit wächst.Animieren von Netzwerk-Wachstum mit NetworkX und Matplotlib

Dies ist, was ich bisher:

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() 

Allerdings bekomme ich folgende Fehlermeldung:

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]:~/Desktop/CS8903-SpecialProblem/Code/ 

Was ich will, ist eine Animation, in dem Sie die Grafik wachsen sehen können. Ich kann das Diagramm in jeder Phase speichern und kann möglicherweise eine Animation außerhalb von Matplotlib erstellen, aber gibt es eine Möglichkeit, es so zu machen?

+0

Was ist Ihr Backend? Ich habe einige Animationsprobleme mit einigen Backends festgestellt. Können Sie Matplotlibs [basic_example.py] (http://matplotlib.org/examples/animation/basic_example.html) ausführen? – tiago

+0

Ja, das funktioniert perfekt für mich. Wie für das Backend, bin ich nur auf Ubuntu, Python 2.7, Numpy, Scipy, NetworkX und Matplotlib ... alle in den letzten Tagen installiert, so dass sie die neueste Version sind ... Ich bin im Grunde ein Student, und Ich probiere ein paar Experimente aus. Es wäre wirklich hilfreich, diese Grafiken zu animieren, damit ich sehen kann, wie sie wachsen! – Nicomoto

+0

Ich bin nicht mit NetworkX vertraut. Vielleicht ist das Problem, dass 'ArtistAnimation' einen Matplotlib-Künstler und kein Nx-Objekt erwartet? – tiago

Antwort

9

Nach einer Überprüfung war, dass Code nicht annähernd so relevant für dieses Problem, wie ich gedacht hatte. Allerdings konnte ich this SO answer und this SO answer verwenden, um eine Antwort für Sie zusammenzuschustern. Hier ist Code, der ein Diagramm erstellt, 50 zufällige Knoten und 50 zufällige Kanten hinzufügt und ein Bild des Diagramms anzeigt, nachdem jeder Knoten und jede Kante hinzugefügt wurde. Einige der wichtigsten Änderungen aus dem Code:

  1. auf mit pylab.ion() Dieser Code basiert (siehe here für weitere Informationen).
  2. Ihr Code versucht, eine Figur zu verwenden und das darin enthaltene Bild zu ändern. Dieser Code erstellt für jeden Rahmen eine neue Figur.
  3. Dieser Code schreibt nicht in .mp4 aus. Wenn Sie das wirklich tun müssen, würde ich vorschlagen, die Zahlen beim Rendern in .png-Datei zu schreiben und nachher in mp4 zu konvertieren.
  4. Beachten Sie, dass dieser Code verwendet matplotlib.pyplot.pause() statt time.sleep(). Die Zahlen werden nicht wiedergegeben, wenn Sie time.sleep() verwenden.

Viel Glück!

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

Tut mir leid für die Verzögerung, wie auch immer, dein Vorschlag hat mich zum Nachdenken gebracht, hier ist, was ich zuerst gemacht habe, ich habe die Grafik geplottet und einzelne PNGs gespeichert und sie dann zusammen genäht ... Ich habe auch eine Implementierung mit Ion, das einzige Problem ist, kann ich nicht diese als gif-Dateien speichern, aber es ist ziemlich cool, wie Sie Änderungen in der Laufzeit sehen können – Nicomoto

+0

Vielen Dank! Ich wollte eine alternative Lösung mit matplotlib.animation.FuncAnimation versuchen (siehe http://matplotlib.org/api/animation_api.html für weitere Informationen), aber ich hatte einfach nicht die Zeit. – brentlance

12

Eine verbesserte Version von Bretlance. Ich hoffe, es wird hilfreich sein. Es wird sich zeigen Animationen aber nicht Bild nach dem.

wissen immer noch nicht, wie der Besitzer der Frage Animate drawing networkx edges Verwendung von matplotlib Animation gemacht

#!/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

genau das, was ich gesucht habe. Schöner Übergang zwischen einer Zeichnung und einer anderen. Das Verringern der Pause ergibt eine glatte Animation. Vielen Dank. :) – mythicalcoder

Verwandte Themen