不交互执行时,plt.figure.Figure.show()不执行任何操作

时间:2018-07-28 04:27:40

标签: python matplotlib ipython jupyter-notebook

因此,我将以下简单代码保存在.py文件中,并在shell中执行:

import matplotlib.pyplot as plt

myfig = plt.figure(figsize=(5, 5))
ax1 = myfig.add_subplot(1, 1, 1)
myfig.show()

但是它在执行时什么也不做,没有错误也没有。

然后,当我在shell中启动Ipython并键入完全相同的代码时,它确实会弹出一个空窗口。为什么会这样?

当然我可以使用plt.show(),一切都很好。但是,可以说我有两个图,Fig1和Fig2,并且两个图中都有东西,我只想显示其中一个,我该怎么做? plt.show()绘制了它们两者。

对不起,如果这很愚蠢,我只是很好奇为什么在ipython中进行交互工作时,调用fig1.show()时会弹出窗口,但是当我在shell中执行相同的脚本但执行以下操作时却什么也没发生:python myfile.py

谢谢!

3 个答案:

答案 0 :(得分:1)

plt.show启动事件循环,创建交互式窗口并在其中显示所有当前图形。如果您的数字超出当前在pyplot状态下实际显示的数字,则可以在调用plt.show()之前关闭所有不需要的数字。

fig1 = plt.figure()
ax1 = fig1.add_subplot(1, 1, 1)
ax1.plot([1,3,4])

fig2 = plt.figure()
ax2 = fig2.add_subplot(1, 1, 1)
ax2.plot([1,2,5])

# close first figure
plt.close(fig1)
# show all active figures (which is now only fig2)
plt.show()

相反,fig.show()将不会启动事件循环。因此,仅在事件循环已经开始的情况下才有意义,例如在plt.show()被调用之后。在非交互模式下,事件循环中的事件可能发生。举个例子,当fig1处于活动状态时,一旦按下键盘上的某个键,以下内容将显示fig2

import matplotlib.pyplot as plt

fig1 = plt.figure()
ax1 = fig1.add_subplot(1, 1, 1)
ax1.plot([1,3,4])

def show_new_figure(evt=None):
    fig2 = plt.figure()
    ax2 = fig2.add_subplot(1, 1, 1)
    ax2.plot([1,2,5])
    fig2.show()

# Upon pressing any key in fig1, show fig2.
fig1.canvas.mpl_connect("key_press_event", show_new_figure)

plt.show()

答案 1 :(得分:0)

您需要像这样修改代码:

import matplotlib.pyplot as plt

myfig = plt.figure(figsize=(5, 5))
ax1 = myfig.add_subplot(1, 1, 1)
plt.plot((1, 2, 3))       # <- plot something
plt.show()                # <- show the plot

matplotlib文档here中的更多信息。

答案 2 :(得分:0)

您需要添加一条额外的行

%matplotlib inline

在jupyter笔记本中获取情节。 有关更多信息,您可以参考http://ipython.readthedocs.io/en/stable/interactive/tutorial.html#magics-explained