2012-11-18 34 views
14

Tôi muốn tạo hoạt ảnh cho biểu đồ phát triển theo thời gian.Tăng trưởng mạng hoạt hình với NetworkX và Matplotlib

Đây là những gì tôi có cho đến nay:

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

Tuy nhiên, tôi nhận được thông báo lỗi sau:

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/ 

Những gì tôi muốn là một phim hoạt hình, nơi bạn có thể xem đồ thị ngày càng tăng. Tôi có thể lưu đồ thị ở mỗi giai đoạn, và có thể tạo ra một hình ảnh động bên ngoài matplotlib, nhưng có cách nào để làm cho nó hoạt động như thế này không?

+0

phụ trợ của bạn là gì? Tôi đã gặp phải một số vấn đề về hoạt ảnh với một số chương trình phụ trợ. Bạn có thể chạy [basic_example.py] của matplotlib (http://matplotlib.org/examples/animation/basic_example.html) không? – tiago

+0

Có, điều đó hoàn toàn phù hợp với tôi. Đối với các phụ trợ, tôi chỉ trên ubuntu, python 2,7, numpy, scipy, networkx và matplotlib ... tất cả được cài đặt trong vài ngày qua, vì vậy chúng là phiên bản mới nhất ... Im cơ bản là một sinh viên, và đang thử một vài thử nghiệm, Nó sẽ thực sự hữu ích để tạo hiệu ứng cho các đồ thị này, vì vậy tôi có thể thấy chúng phát triển như thế nào! – Nicomoto

+0

Tôi không quen với networkx. Có lẽ vấn đề là 'ArtistAnimation' mong đợi một nghệ sĩ matplotlib và không phải là một đối tượng nx? – tiago

Trả lời

9

Khi xem xét, mã đó gần như không liên quan đến vấn đề này như tôi đã nghĩ. Tuy nhiên, tôi đã có thể sử dụng this SO answerthis SO answer để cùng nhau trả lời câu trả lời cho bạn. Đây là mã sẽ tạo ra một đồ thị, thêm 50 nút ngẫu nhiên và 50 cạnh ngẫu nhiên vào nó, và hiển thị một hình ảnh của đồ thị sau mỗi nút và cạnh được thêm vào. Một vài thay đổi quan trọng từ mã của bạn:

  1. Mã này được dựa trên sử dụng pylab.ion() (xem here để biết thêm thông tin).
  2. Mã của bạn cố gắng sử dụng một hình và thay đổi hình ảnh trong đó. Mã này tạo ra một hình mới cho mỗi khung hình.
  3. Mã này không ghi ra .mp4. Nếu bạn thực sự cần phải làm điều đó, tôi sẽ đề nghị viết các con số ra tập tin .png trong khi dựng hình chúng, và chuyển đổi sang mp4 sau khi thực tế.
  4. Lưu ý rằng mã này sử dụng matplotlib.pyplot.pause() thay vì time.sleep(). Các số liệu sẽ không hiển thị nếu bạn sử dụng time.sleep().

Chúc may mắn!

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

Xin lỗi vì sự chậm trễ, dù bằng cách nào, gợi ý của bạn là điều khiến tôi suy nghĩ, đây là những gì tôi đã làm trước, tôi vẽ đồ thị và lưu trữ png cá nhân và sau đó stiched chúng lại với nhau bên ngoài ... Tôi cũng đã thực hiện với ion, vấn đề duy nhất là tôi không thể lưu chúng dưới dạng tệp gif, nhưng nó khá mát mẻ vì bạn có thể thấy thay đổi trong thời gian chạy – Nicomoto

+0

Cảm ơn! Tôi có nghĩa là để thử một giải pháp thay thế bằng cách sử dụng matplotlib.animation.FuncAnimation (xem http://matplotlib.org/api/animation_api.html để biết thêm thông tin), nhưng tôi chỉ không có thời gian. – brentlance

12

Phiên bản cải tiến của bretlance. Hy vọng nó sẽ rất hữu ích. Ảnh sẽ hiển thị các hoạt ảnh nhưng không hiển thị ảnh sau ảnh.

Vẫn không biết làm thế nào chủ sở hữu của câu hỏi Animate drawing networkx edges đã sử dụng hình ảnh động matplotlib của

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

chính xác những gì tôi đang tìm kiếm. Chuyển đổi đẹp giữa bản vẽ này sang bản vẽ khác. Giảm tạm dừng cho một hình ảnh động trơn tru. Cảm ơn. :) – mythicalcoder

Các vấn đề liên quan