2014-06-24 3 views
4

배열이 필요한 matplotlib.animation에서 사용할 컬렉션 (LineCollection) 인 networkx.draw 함수의 출력을 사용하려고합니다. PNG로 내 모습을 저장하고 싶지 않습니다. 왜냐하면 많은 것들이 있기 때문입니다. 나는 또한 그것을 표시하고 싶지 않지만 결정적인 것은 아니다.LineCollection을 Array로 변환하거나 Networkx 그래프 애니메이트

간단한 코드가 될 수

import networkx as nx 
graph= nx.complete_graph(5) #a simple graph with five nodes 
Drawing=nx.draw(graph) 

이 파이썬 컬렉션 출력 :

<matplotlib.collections.LineCollection at 0xd47d9d0> 

를 I 도면 그런 종류의 목록을 생성 할 :

artists=[] 
artists.append(Drawing) 

및 애니메이션에서 그 도면을 더 사용하십시오 :

나는 아래와 같은 형식 오류 얻을 그러나
import matplotlib 
fig= plt.figure() #initial figure, which can be empty 
anim=matplotlib.animation.ArtistAnimation(fig, artists,interval=50, repeat_delaty=1000) 

: 그래서

TypeError: 'LineCollection' object is not iterable 

, 내가 "아티스트"목록이 NumPy와 배열이나 PIL라는 PNG 이미지 또는 뭔가해야하거나 이미지의 목록이어야합니다 생각 (나는 익숙하지 않다.), 그리고 이미지를 png 또는 다른 형식으로 저장하지 않고 컬렉션을 변환하는 방법을 모른다.

이 사실이 내가하고 싶은 것입니다 : a dynamic animation를, 내가 가지고있는 도면 중 하나 im = plt.imshow(f(x, y))를 사용하려고하면, 그것은이 오류가 있습니다 : 나는 충분히 명확했다 희망

TypeError: Image data can not convert to float 

을,이다 처음으로 애니메이션 및 음모 도구를 사용했습니다. 누구든지 해결책이 있습니까?

답변

2

여기에 다이나믹 한 애니메이션이 있습니다 (iPython 노트북에서 그런 식으로보고 싶다면 사용할 수 있습니다). 본질적으로 draw_networkx을 사용하고 각 프레임에 대해 플롯 할 항목을 제공하려고합니다. 해당 기능을 호출 할 때마다 위치가 변경되지 않도록하려면 동일한 위치 (아래 pos)를 다시 사용하고 싶습니다.

%pylab inline #ignore out of ipython notebook 
from IPython.display import clear_output #ignore out of ipython notebook 

import networkx as nx 
graph= nx.complete_graph(5) #a simple graph with five nodes 

f, ax = plt.subplots() 

pos=nx.spring_layout(graph) 

for i in range(5): 
    nx.draw_networkx(graph, {j:pos[j] for j in range(i+1)}, ax=ax, nodelist=graph.nodes()[0:i+1], 
        edgelist=graph.edges()[0:i], with_labels=False) 
    ax.axis([-2,2,-2,2]) #can set this by finding max/mins 

    time.sleep(0.05) 
    clear_output(True) #for iPython notebook 
    display(f) 
    ax.cla() # turn this off if you'd like to "build up" plots 

plt.close() 
+0

Ipython을 사용하여 코드를 시도했지만 표시하지 않고 ''과 같은 출력을 제공합니다. 귀하의 코드는 디스플레이를 지우지 않고 축을 지우는 것만으로도 매번 축을 다시 작성해야하는 이유를 이해할 수 없습니다. 그리고 내가하고 싶은 것은 이미지를 지우고 그것을 다시 플로팅하는 것입니다. 나는 'plt.ion()'과 'plt.show()'를 'clf()'와 함께 사용하여 직접 시도했지만, 어떤 이유로 든 파이썬 디스플레이가 충돌하고 애니메이션 저장에 도움이되지 않습니다. 이유는 무엇입니까? 그리고 나는 또한 'nx.draw_network (graph, pos)'와 같은 위치를 사용하고 있었지만, 그것과 다른 점이 있습니까? – potato

+0

방금 ​​[이 답변] (http://stackoverflow.com/a/13571425/3482094)에서 아이디어를 사용하고 타이머 대신'pause()'를 사용했고'plt 대신'pylab.draw()를 사용했습니다. 쇼', 나는 왜 모른다. 그러나 그것은 일했다! 따라서 이전 질문을 무시할 수 있습니다. 그러나 여전히 비디오 문제를 해결할 수 없었다. – potato

+0

죄송합니다. 동영상의 문제점이 무엇을 의미하는지 모르시겠습니까? [여기] (http://matplotlib.org/examples/animation/dynamic_image2.html)의 두 번째 마지막 줄의 주석 처리를 제거하면 동영상을 가져와야합니다. – ChrisE

관련 문제