在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 : TkAgg
和 interactive : 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)