PyGSP代码在Python Shell可运行,终端执行脚本无图像显示问题
问题描述
在Python交互式Shell中执行以下代码时,图形可正常显示:
import numpy as np import matplotlib.pyplot as plt from pygsp import graphs, filters, plotting plotting.BACKEND = 'matplotlib' plt.rcParams['figure.figsize'] = (10, 5) rs = np.random.RandomState(42) W = rs.uniform(size=(30, 30)) W[W < 0.93] = 0 W = W + W.T np.fill_diagonal(W, 0) G = graphs.Graph(W) G.set_coordinates('ring2D') G.plot()
但将相同代码保存为脚本文件(如test.py),通过终端执行python3 test.py时,完全无法显示图像,即使在plot()后添加sleep语句也无效。
问题原因
- Matplotlib在交互式Shell模式下会自动启用交互模式,执行绘图命令后会立刻渲染并弹出图形窗口;而在脚本模式下默认是非交互模式,绘图操作仅生成图形对象但不会主动弹出窗口,脚本执行完毕后直接退出,因此看不到任何图像。
- 添加sleep语句无效的原因是:图形窗口根本没有被触发显示,程序只是暂停执行,并没有完成窗口的渲染和弹出操作。
解决方法
方法1:显式调用plt.show()
在G.plot()之后添加plt.show()命令,该命令会强制Matplotlib弹出图形窗口,并阻塞程序直到用户关闭窗口。修改后的脚本代码如下:
import numpy as np import matplotlib.pyplot as plt from pygsp import graphs, filters, plotting plotting.BACKEND = 'matplotlib' plt.rcParams['figure.figsize'] = (10, 5) rs = np.random.RandomState(42) W = rs.uniform(size=(30, 30)) W[W < 0.93] = 0 W = W + W.T np.fill_diagonal(W, 0) G = graphs.Graph(W) G.set_coordinates('ring2D') G.plot() plt.show() # 显式触发图形窗口显示
方法2:启用交互模式并等待用户操作
在脚本开头添加plt.ion()开启交互模式,让绘图命令执行后自动弹出窗口,再配合plt.waitforbuttonpress()或input()让程序等待用户操作后再退出,避免窗口一闪而过:
import numpy as np import matplotlib.pyplot as plt from pygsp import graphs, filters, plotting plt.ion() # 开启Matplotlib交互模式 plotting.BACKEND = 'matplotlib' plt.rcParams['figure.figsize'] = (10, 5) rs = np.random.RandomState(42) W = rs.uniform(size=(30, 30)) W[W < 0.93] = 0 W = W + W.T np.fill_diagonal(W, 0) G = graphs.Graph(W) G.set_coordinates('ring2D') G.plot() plt.waitforbuttonpress() # 等待用户按键后关闭窗口、结束程序
内容的提问来源于stack exchange,提问作者fernando herrera
相关产品推荐
相关产品推荐

