Matplotlib交互模式下图形窗口消失

4 投票
3 回答
10720 浏览
提问于 2025-04-18 04:59

我在用matplotlib画图的时候需要用到交互模式(应该是脚本,而不是在python或ipython控制台里)。但是设置了plt.ion()之后,出现了一个奇怪的bug(?)。当我尝试绘制我的图形时(我觉得我做的具体操作不太重要,因为在非交互模式下是完全正常的),我看不到图形——只看到一个闪烁的灰色窗口,瞬间消失,程序就结束了。

如果我明确地加上plt.draw()(还有plt.pause(1)来查看结果),我会看到图形如预期出现。如果我在图形可见后进行我想要的修改,图形会改变。但窗口在暂停结束后还是会消失。

我是在Ubuntu下用Spyder,后端是Qt4Agg运行的。尝试从终端运行脚本python my_script.py,结果是一样的。

这可能是什么问题呢?在交互模式下,怎么才能让图形不消失呢?

更新

有效的例子:

import matplotlib.pyplot as plt
import numpy as np

plt.ion()

x = np.linspace(1, 10)
y = np.sin(x)
plt.plot(x, y)
plt.draw()
plt.pause(1)

如果我运行这段代码,我能看到正弦图持续1秒,然后窗口就消失了。

更新 2

我在这里找到了解决方案:https://stackoverflow.com/a/10724654/1304161。如果我在Spyder中正确设置运行选项,它就能正常工作。虽然在gnome-terminal中运行不行,但我其实不太需要这个。希望在将来作为GUI应用的一部分时不会有问题……

3 个回答

0

如果你想在不同的时间显示多个图形,可以在 plt.show() 之后使用 code.interact(local=locals())。这样做会让Python解释器暂停,直到你在Python命令行中按下Ctrl-Z。

import code
import matplotlib.pyplot as plt
import numpy as np

# Start pyplot's "interactive mode" which lets you run plt.show multiple times
plt.ion()

x = np.linspace(1, 10)
y = np.sin(x)

# PLOT #1 - displayed
plt.plot(x, y)
plt.draw()
plt.show()

# Wait for figure to be closed AND Ctrl-Z pressed in Python Shell
code.interact(local=locals())

print("Some more code can go here...")

# PLOT #2 - displayed
plt.plot(x, y)
plt.show()

# Wait for figure to be closed AND Ctrl-Z pressed in Python Shell
code.interact(local=locals())
1

你可以通过在最后加上这两行代码来让它正常运行:

plt.ioff()
plt.show()

所以这个程序现在可以正常工作了:

import matplotlib.pyplot as plt
import numpy as np

plt.ion()

x = np.linspace(1, 10)
y = np.sin(x)
plt.plot(x, y)
plt.draw()
plt.ioff()
plt.show()
3

我在这里找到了解决办法:https://stackoverflow.com/a/10724654/1304161

如果我在Spyder中正确设置运行选项,它就能正常工作。虽然在gnome-terminal中运行不行,但我其实不太需要这个。希望当它成为一个图形界面应用的一部分时不会有问题。如果那时候有问题,我会再回来找的 :)

撰写回答