2014-12-30 3 views
2

Networkx는 Matplotlib을 사용합니다.PNG에서 stdout/http 응답으로 networkx 그래프 그리기

직접하기 matplotlib, 이미지가 매우 간단 역할을하는 서버 스크립트와

(단순에 대한 병 사용) : 그러나

import matplotlib.pyplot as plot 
from matplotlib.backend.backends_agg import FigureCanvasAgg 
from matplotlib.figure import Figure 
from StringIO import StringIO 
from bottle import route, response 

@route("/plot.png")            
def serve_image():             
    F = Figure()        # new figure 
    P = F.add_subplot(111)     # new plot container inside the figure 
    P.plot(list(range(10)), list(range(10))) # simple plot 
    PNG = StringIO()       # container for PNG data 
    canvas = FigureCanvasAgg(F)    # create image 
    canvas.print_png(PNG)      # draw image into the container 
    response.content_type = "image/png"  # duh 
    return PNG.getvalue()      # return contents of the container 

을 Networkx 암시하기 matplotlib , 그림 또는 인스턴스를 생성, 사용하지 않을 것 subplots. 매뉴얼은 일반적으로 다음과 같습니다.

networkx.draw(my_graph) 
plot.show() 

이 플롯을 PNG 이미지로 제공하는 방법은 무엇입니까?

답변

1

저는 특히 networkx에 익숙하지 않지만 그릴 그림을 그리는 축 개체를 지정하는 take an ax kwarg 인 것으로 보입니다.

귀하의 경우 P 개체 일 것이고 fig.add_subplot에 의해 반환됩니다. 일반적으로

, 즉 같은 모습 수행하는 코드 :

def blah(data, ax=None): 
    if ax is None: 
     ax = plt.gca() 
    return ax.plot(data) 

따라서 pyplot 상태 머신은 호출에는 축이 지정된 객체없는 경우입니다. 수동으로 생성 한 축 객체를 전달하는 동안 안전하게 사용할 수 있어야합니다.

networkx.draw, it appears to follow that pattern에서 확인하십시오.

+0

와우, 잘못된 이름에 대해 이야기 해주세요! 나는 matplotlib을 해킹 - 할 - 할 - 일종의 방법으로 사용하고 결코 체계적으로 배울 수 없다 - 그래서 나는 결코 "축"이 "음모"를 의미하지는 않을 것이라고 생각한다. 감사! –

+0

글쎄요, 명확히하기 위해,'axis'는 matplotlib 용어에서'axes'와 다릅니다. 'Axes' 인스턴스 (일반적으로'ax'라고 함)는 "플롯"이며, "xaxis"와 "yaxis"는 모두'Axis'의 인스턴스입니다. 상관없이 그것을 도왔 으면 좋겠다! –

4

키워드를 사용하여 matplotlib 축 인스턴스를 networkx.draw() (및 기타 기능)으로 보낼 수 있습니다. 예 : 귀하가 사용하게 될 경우

P = F.add_subplot(111)     
P.plot(list(range(10)), list(range(10))) 
networkx.draw(my_graph, ax=P) # draw into axis P 
+0

답변 해 주셔서 감사합니다. Joe는 먼저 게시 한 것으로 보이고 조금 더 많은 정보가 있으므로 대신 대답을 받아 들여야했습니다. –