在python shell中使用matplotlib

警告

此页严重过时

默认情况下,Matplotlib会将绘图延迟到脚本结束,因为绘图可能是一项昂贵的操作,并且您可能不希望每次更改单个属性时都更新绘图,只有在所有属性都更改之后才更新一次。

但是在使用python shell时,您通常希望使用每个命令更新绘图,例如,在更改 xlabel() 或线条的标记样式。虽然这在概念上很简单,但实际上可能很棘手,因为Matplotlib是一个隐藏在底层的图形用户界面应用程序,并且有一些技巧可以使应用程序在Python外壳中正常工作。

伊普生去营救

注解

这里描述的模式仍然存在,因为历史原因,但强烈建议不要使用。它会使用隐藏python内置的函数污染名称空间,从而导致难以跟踪错误。要获得ipython集成而不导入 %matplotlib magic is preferred. See ipython documentation .

幸运的是, ipython 这是一个增强的交互式python shell,它已经解决了所有这些技巧,并且具有matplotlib意识,因此当您在 吡拉普 模式。

johnh@flag:~> ipython
Python 2.4.5 (#4, Apr 12 2008, 09:09:16)
IPython 0.9.0 -- An enhanced Interactive Python.

In [1]: %pylab

  Welcome to pylab, a matplotlib-based Python environment.
  For more information, type 'help(pylab)'.

In [2]: x = randn(10000)

In [3]: hist(x, 100)

它为你设置了所有的东西,所以交互式绘图可以像你期望的那样工作。呼叫 figure() 一个数字窗口弹出,呼叫 plot() 您的数据显示在Figure窗口中。

请注意,在上面的示例中,我们没有导入任何matplotlib名称,因为在pylab模式下,ipython将自动导入它们。IPython也开启 互动式 模式,它使每个Pyplot命令触发图形更新,并提供Matplotlib感知 run 命令有效运行matplotlib脚本。IPython将在 run 命令,然后在运行结束时恢复交互状态,以便您可以继续手动调整图形。

最近有很多工作要将ipython嵌入到各种GUI应用程序中,并提供了pylab支持,所以请查看ipython邮件 list 最新状态。

其他python解释器

如果您不能使用ipython,并且仍然希望使用来自交互python shell的matplotlib/pylab,例如普通的ole标准python交互解释器,那么您需要了解matplotlib后端是什么。 什么是后端? .

使用使用tkinter用户界面工具包的tkagg后端,您可以使用来自任意非GUI python shell的matplotlib。只是设定你的 backend : TkAgginteractive : True 在你 matplotlibrc 文件(见) 使用样式表和RCPARAM自定义Matplotlib )然后发射 Python 。然后:

>>> from pylab import *
>>> plot([1,2,3])
>>> xlabel('hi mom')

应该是开箱即用的。这也可能适用于最新版本的qt4agg和gtk3agg后端,以及Macintosh上的MacOSX后端。注意,在批处理模式下,即从脚本生成图形时,交互模式可能较慢,因为它使用每个命令重新绘制图形。因此,在通过 matplotlibrc 文件而不是使用下一节中列出的函数。

图形用户界面shell充其量是有问题的,因为它们必须运行一个主循环,但是交互式绘图也涉及一个主循环。IPython已经为主要的Matplotlib后端整理了所有这些。可能还有其他shell和ides也可以在交互模式下与matplotlib一起工作,但一个明显的候选者没有这样做:python idle ide是一个不支持pylab交互模式的tkinter gui应用程序,不管后端如何。

控制交互式更新

这个 互动式 pyplot接口的属性控制是否在每个pyplot命令上绘制图形画布。如果 互动式 ,则图形状态将在每个plot命令上更新,但只在显式调用时绘制。 draw() .什么时候? 互动式True ,然后每个pyplot命令触发一个绘制。

Pyplot接口提供了4个对交互控制有用的命令。

isinteractive()
返回交互式设置 真假
ion()
打开交互模式
ioff()
关闭交互模式
draw()
强制重新绘制图形

在处理绘图昂贵的大人物时,您可能希望暂时关闭Matplotlib的交互式设置,以避免性能受到影响:

>>> #create big-expensive-figure
>>> ioff()      # turn updates off
>>> title('now how much would you pay?')
>>> xticklabels(fontsize=20, color='green')
>>> draw()      # force a draw
>>> savefig('alldone', dpi=300)
>>> close()
>>> ion()      # turn updating back on
>>> plot(rand(20), mfc='g', mec='r', ms=40, mew=4, ls='--', lw=3)