Matplotlib的"交互模式"(ion(),ioff())的精确语义?

Eri*_*got 21 python matplotlib interactive-mode

Matplotlib的pyplot中"交互模式"的文档如下:

pyplot接口的交互属性控制是否在每个pyplot命令上绘制图形画布.如果interactive为False,则每个绘图命令都会更新图形状态,但只会在显式调用draw()时绘制.当interactive为True时,则每个pyplot命令都会触发绘制.

这似乎很清楚:当交互模式打开时,人们可以不必plot()这样做draw().但是,在以下代码中执行draw()不会执行任何操作:

from matplotlib import pyplot as pp

# Interactive mode is off by default

pp.plot([10, 20, 50])
pp.draw()

raw_input('Press enter...')  # No graph displayed?!!
Run Code Online (Sandbox Code Playgroud)

(在Windows XP上,Matplotlib 1.0.1).

ion()在开头添加会使图形出现,同时等待用户输入enter(方便地关闭所有数字):

from matplotlib import pyplot as pp

ion()

pp.plot([10, 20, 50])  # No draw() is necessary

raw_input('Press enter...')  # The graph is interactive *and* the terminal responds to enter
Run Code Online (Sandbox Code Playgroud)

因此,看起来ion()确实不是每个绘图命令后,只是增加自动图表更新,可惜我不能找到文档中任何事情.后一个程序的另一个更重要的问题是ion()使所有绘图命令更新图形,这在单个图形被多次更新时是耗时的.

那么,有没有办法:

  • 让终端等待进入,之后所有数字都自动关闭,
  • 有交互式Matplotlib图,
  • ...而不强制交互模式在开始时打开(以便不强制图形的自动更新,这可能是耗时的)?

Eri*_*got 15

以下是Matplotlib邮件列表中有关此主题的有趣讨论的摘要.执行摘要是:

  • 交互模式(激活ion())可以自动执行许多操作.特别是,pyplot.*命令会在屏幕上自动更新相关轴.但是,对Matplotlib对象的方法调用ax.plot()(ax如Axes对象)通常不会执行自动更新; 在这种情况下,pyplot.draw()执行必要的更新.)

  • 非交互模式不太方便. draw()通常不会更新屏幕上的数字.draw()在非交互模式中有点"不活跃" 的事实在当前文档中没有提及,但希望很快就会包含在那里.

同时,可以在Matplotlib 的当前分支中找到有关交互和非交互模式的更多信息.一个更好的文档draw(),show()朋友们也可以在同一分支中.

  • `ax.figure.canvas.draw()`将更新一个数字 (2认同)