TkCanvas中的动画NetworkX图:背景颜色

时间:2013-01-13 16:14:31

标签: python matplotlib tkinter background-color networkx

为了演示Graph算法,我需要将一个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()

我现在的问题是: 图表的第一个显示就像我想要的那样(背景颜色),但是在您第一次点击“下一步”后,图表的背景颜色变为白色。我试过改变图形和画布的背景颜色。 我甚至不知道是什么带来了这种变化,我认为它只是两次画到同一个画布上。

如何修改代码以使图形始终具有相同的背景颜色?

在一个不相关的注释中:我添加的root.quit()无助于正确结束应用程序。这可能是我的愚蠢,但这里出了什么问题?

1 个答案:

答案 0 :(得分: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()