28

我对 Matplotlib 的交互功能有疑问。我运行以下程序并收到一个冻结的空图形窗口。

import matplotlib.pyplot as plt
import numpy as np

plt.ion()
x = np.arange(0, 4*np.pi, 0.1)
y = [np.sin(i) for i in x]
plt.plot(x, y, 'g-', linewidth=1.5, markersize=4)
plt.show()

如果我删除了 'plt.ion()' 语句,那么它工作得很好。我使用 IDLE 并且 Matplotlib 版本 1.2.x 包安装在 Python 3.2.2 中。

我希望它是交互式的,但我得到了一个不友好的非交互式窗口。有人可以阐明我所缺少的吗?先感谢您。

4

2 回答 2

55

我碰到了这个在这里找到的链接,它回答了我的问题。

似乎在通过 开启交互模式后plt.ion(),pyplot 需要暂时暂停,以便通过plt.pause(0.0001). 这就是我所做的并且它有效!

>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> plt.ion()
>>> x = np.arange(0, 4*np.pi, 0.1)
>>> y = [np.sin(i) for i in x]
>>> plt.plot(x, y, 'g-', linewidth=1.5, markersize=4)
>>> plt.pause(0.0001)         
>>> plt.plot(x, [i**2 for i in y], 'g-', linewidth=1.5, markersize=4)
>>> plt.pause(0.0001)
>>> plt.plot(x, [i**2*i+0.25 for i in y], 'r-', linewidth=1.5, markersize=4) 
>>> plt.pause(0.0001)

如果您在 IDLE 控制台中尝试过,请注意,到目前为止,所有内容都已显示,除了图形窗口冻结且无法退出。要解冻它,请键入以下最后一条语句

>>> plt.show(block=True)

现在可以关闭窗口了。

于 2012-10-02T07:18:10.603 回答
6

我现在正在遇到一模一样的问题。在 ipython 中有魔法%matplotlib,它为我解决了这个问题。至少现在我可以输入plt.figure()(假设import matplotlib.pyplot as plt已被调用)并获得一个完全交互式的响应图。

但是,我仍然很想知道这个魔法究竟导入了什么才能理解这个问题。

于 2014-07-09T11:46:34.920 回答