2012-11-18 19 views
14

के साथ एनिमेटिंग नेटवर्क ग्रोथ मैं समय के साथ बढ़ने वाले ग्राफ को एनिमेट करना चाहता हूं।नेटवर्कएक्स और मैटलप्लिब

यह वही है मैं अब तक है:

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/ 

क्या मैं चाहता हूँ एक एनीमेशन है, जहां आप ग्राफ बढ़ रहा है देख सकते हैं:

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

हालांकि, मैं निम्न त्रुटि संदेश मिलता है। मैं प्रत्येक चरण में ग्राफ को सहेज सकता हूं, और मैटलप्लिब के बाहर एक एनीमेशन बनाने में सक्षम हो सकता हूं, लेकिन क्या ऐसा करने का कोई तरीका है?

+0

अपने बैकएंड क्या है का इस्तेमाल किया? मुझे कुछ बैकएंड के साथ कुछ एनीमेशन समस्याओं का सामना करना पड़ा है। क्या आप matplotlib के [basic_example.py] (http://matplotlib.org/examples/animation/basic_example.html) चला सकते हैं? – tiago

+0

हां, यह मेरे लिए पूरी तरह से काम करता है। बैकएंड के लिए, मैं सिर्फ उबंटू, पायथन 2.7, numpy, scipy, networkx और matplotlib पर हूं ... सभी पिछले कुछ दिनों में स्थापित हैं, इसलिए वे नवीनतम संस्करण हैं ... मैं मूल रूप से एक छात्र हूं, और कुछ expereriments कोशिश कर रहा हूँ, इन ग्राफों को एनिमेट करने में वास्तव में मददगार होगा, इसलिए मैं देख सकता हूं कि वे कैसे बढ़ते हैं! – Nicomoto

+0

मैं नेटवर्कक्स से परिचित नहीं हूं। शायद मुद्दा यह है कि 'कलाकार एनीमेशन' एक matplotlib कलाकार की अपेक्षा करता है, न कि एनएक्स वस्तु? – tiago

उत्तर

9

समीक्षा पर, यह कोड लगभग इस समस्या के लिए प्रासंगिक नहीं था जैसा मैंने सोचा था। हालांकि, मैं आपके लिए एक जवाब देने के लिए this SO answer और this SO answer का उपयोग करने में सक्षम था। यहां कोड है जो एक ग्राफ बनाएगा, इसमें 50 यादृच्छिक नोड्स और 50 यादृच्छिक किनारों को जोड़ें, और प्रत्येक नोड और किनारे के बाद ग्राफ की एक छवि प्रदर्शित करें। अपने कोड से महत्वपूर्ण परिवर्तन के कुछ:

  1. इस कोड pylab.ion() के प्रयोग पर आधारित है (अधिक जानकारी के लिए here देखें)।
  2. आपका कोड एक आंकड़े का उपयोग करने और इसके भीतर छवि को बदलने की कोशिश करता है। यह कोड प्रत्येक फ्रेम के लिए एक नया आंकड़ा बनाता है।
  3. यह कोड .mp4 पर नहीं लिखता है। यदि आपको वास्तव में ऐसा करने की ज़रूरत है, तो मैं उन्हें प्रस्तुत करते समय .png फ़ाइल को आंकड़े लिखने का सुझाव दूंगा, और तथ्य के बाद एमपी 4 में परिवर्तित कर दूंगा।
  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

देरी के लिए खेद है, किसी भी तरह से, आपका सुझाव मुझे क्या सोच रहा है, यहां मैंने जो किया है, मैंने ग्राफ को प्लॉट किया है और व्यक्तिगत पीएनजी संग्रहीत किया है और फिर उन्हें बाहर एक साथ चिपकाया है ... मैंने आयन के साथ एक कार्यान्वयन भी किया, एकमात्र समस्या यह है कि मैं इसे gif फ़ाइलों के रूप में सहेज नहीं सकता, लेकिन यह बहुत अच्छा है क्योंकि आप रन टाइम – Nicomoto

+0

में परिवर्तन देख सकते हैं! मेरा मतलब matplotlib.animation.FuncAnimation का उपयोग करके वैकल्पिक समाधान का प्रयास करना था (अधिक जानकारी के लिए http://matplotlib.org/api/animation_api.html देखें), लेकिन मेरे पास अभी समय नहीं है। – brentlance

12

ब्रेटलान्स का एक बेहतर संस्करण। उम्मीद है कि यह सहायक होगा। यह एनिमेशन दिखाएगा लेकिन चित्र के बाद चित्र नहीं दिखाएगा।

फिर भी पता नहीं कैसे सवाल के मालिक 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

संबंधित मुद्दे