如何实现networkx绘图在同一窗口无需手动交互的实时更新
解决方案
问题本质是matplotlib默认的阻塞绘图模式会导致plt.show()暂停后续代码执行,必须手动关闭窗口才会继续运行。修改以下配置即可实现同一窗口无交互自动更新:
完整可运行代码
import matplotlib.pyplot as plt import networkx as nx import pydot from networkx.drawing.nx_pydot import graphviz_layout import time # 开启交互模式,核心改动 plt.ion() T = nx.balanced_tree(2, 5) colors = ['r']*len(T.nodes) for i in range(31): colors[i]='y' pos = graphviz_layout(T, prog="dot") # 没有dot安装的话替换为下面这行 # pos = nx.spring_layout(T) # 第一次绘图 nx.draw(T, pos, node_color=colors, edge_color='#909090', node_size=200, with_labels=True) plt.draw() plt.pause(1) # 停留1秒,同时触发界面刷新,替代原time.sleep plt.clf() # 修改图结构 T.remove_edge(3,8) T.add_edge(3,4) T.add_edge(7,8) # 第二次绘图 nx.draw(T, pos, node_color=colors, edge_color='#909090', node_size=200, with_labels=True) plt.draw() # 关闭交互模式,让最终窗口常驻不自动关闭 plt.ioff() plt.show()
关键改动说明
- 开头调用
plt.ion()开启matplotlib交互模式,该模式下所有绘图指令都不会阻塞代码运行 - 中间更新阶段使用
plt.draw()+plt.pause(秒数)替代原有的plt.show()+time.sleep,plt.pause会自动触发界面刷新,同时实现等待效果,避免窗口无响应 - 所有更新完成后调用
plt.ioff()关闭交互模式,再执行plt.show()让最终绘图窗口保持显示,不会自动退出 - 如果需要多次循环更新,把绘图、暂停、清空画布的逻辑放到循环体内即可
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

