Python中在def函数内使用igraph绘图无显示的问题求助
Python中igraph函数内绘图不显示的问题解决
问题现象
使用igraph绘图时,将图形构建逻辑封装到draw_graph函数后,在if代码块内调用ig.plot()无法显示图形;但把ig.plot()移到if块外执行,图形就能正常显示。
测试代码对比
代码1(图形不显示)
import matplotlib.pyplot as plt import igraph as ig def draw_graph(vertex_num): g = ig.Graph() g.add_vertices(vertex_num) layout = g.layout("kk") visual_style = {} visual_style["vertex_size"] = 20 visual_style["layout"] = layout visual_style["bbox"] = (300, 300) visual_style["margin"] = 20 return (g, visual_style) #main name = ['1','2','3','4','5','6','7'] option = '1' if option == '1': g,visual_style = draw_graph(5) ig.plot(g, **visual_style)
代码2(图形可显示)
import matplotlib.pyplot as plt import igraph as ig def draw_graph(vertex_num): g = ig.Graph() g.add_vertices(vertex_num) layout = g.layout("kk") visual_style = {} visual_style["vertex_size"] = 20 visual_style["layout"] = layout visual_style["bbox"] = (300, 300) visual_style["margin"] = 20 return (g, visual_style) #main name = ['1','2','3','4','5','6','7'] option = '1' if option == '1': g,visual_style = draw_graph(5) ig.plot(g, **visual_style)
原因分析
在非交互式脚本环境中,ig.plot()返回的绘图对象如果没有被引用,if代码块执行完毕后会被Python垃圾回收机制回收,导致图形无法正常渲染显示。而将ig.plot()放在代码块外时,对象会被保留到脚本结束,环境会自动处理显示逻辑。
解决方法
方法1:保留绘图对象引用并显式调用显示
将ig.plot()的结果赋值给变量,再调用show()方法:
#main name = ['1','2','3','4','5','6','7'] option = '1' if option == '1': g,visual_style = draw_graph(5) plot_obj = ig.plot(g, **visual_style) plot_obj.show()
方法2:结合matplotlib的plt.show()
利用已导入的matplotlib,调用plt.show()触发图形显示:
#main name = ['1','2','3','4','5','6','7'] option = '1' if option == '1': g,visual_style = draw_graph(5) ig.plot(g, **visual_style) plt.show()
内容的提问来源于stack exchange,提问作者Vanessa_BdL
相关产品推荐
相关产品推荐

