0

グラフ アルゴリズムのデモでは、networkx グラフを Tkinter Canvas に描画し、実行時にそのグラフ (およびプロット) を変更できるようにする必要があります。

私は次のコードをつなぎ合わせました(私の問題につながる最小限のコードであることを願っていますが、私はこれに慣れていないのでわかりません):

import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import Tkinter as Tk
import networkx as nx
from tkMessageBox import showinfo

root = Tk.Tk()
root.wm_title("Animated Graph embedded in TK")
root.wm_protocol('WM_DELETE_WINDOW', root.quit())

f = plt.figure(figsize=(5,4))
a = f.add_subplot(111)
plt.axis('off')

# the networkx part
G=nx.complete_graph(5)
nx.draw_networkx(G,pos=nx.spring_layout(G),ax=a)

# a tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def next_graph():
    if G.order():
        a.cla()
        G.remove_node(G.nodes()[-1])
        nx.draw(G, pos=nx.circular_layout(G), ax=a)
        canvas.draw()

b = Tk.Button(root, text="next",command=next_graph)
b.pack()  

Tk.mainloop()

私の問題は次のとおりです。グラフの最初の表示は(背景色に関して)希望どおりですが、最初に「次へ」をクリックすると、グラフの背景色が白に変わります。フィギュアとキャンバスの背景色を変えてみました。何がその変化をもたらすのかさえわかりませんが、同じキャンバスに2回描画しているだけだと思います。

グラフの背景色が常に同じになるようにコードを変更するにはどうすればよいですか?

無関係なメモ: 追加した root.quit() は、アプリケーションを適切に終了するのに役立ちません。これは私の側ではばかげているかもしれませんが、ここで何がうまくいかなかったのですか?

4

1 に答える 1

5

私はあなたがとても近いと思います。イベントループで使用するnx.draw_networkx()と機能します(そこでも軸をオフにします)。

これらの変更と、ループで再利用される最初に計算された単一のレイアウトを使用した例を次に示します。

import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import Tkinter as Tk
import networkx as nx
from tkMessageBox import showinfo

root = Tk.Tk()
root.wm_title("Animated Graph embedded in TK")
# Quit when the window is done
root.wm_protocol('WM_DELETE_WINDOW', root.quit)

f = plt.figure(figsize=(5,4))
a = f.add_subplot(111)
plt.axis('off')

# the networkx part
G=nx.complete_graph(5)
pos=nx.circular_layout(G)
nx.draw_networkx(G,pos=pos,ax=a)
xlim=a.get_xlim()
ylim=a.get_ylim()



# a tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def next_graph():
    if G.order():
        a.cla()
        G.remove_node(G.nodes()[-1])
        nx.draw_networkx(G, pos, ax=a)
        a.set_xlim(xlim)
        a.set_ylim(ylim)
        plt.axis('off')
        canvas.draw()

b = Tk.Button(root, text="next",command=next_graph)
b.pack()

Tk.mainloop()
于 2013-01-13T20:18:25.893 に答える