matplotlib新手教程
Apr 27, 2010matplotlib是绘制二维图形的Python模块,它用Python语言实现了MATLAB画图函数的易用性,同时又有非常强大的可定制性。可以看一下用matplotlib绘制的图像展示。
我的paper里的图3,4和6就是用matplotlib画的啦。
好东东当然要大家分享,于是下面简单的写个教程,希望对Python有兴趣的或者熟悉MATLAB想找个替代品的筒子们有用。
首先,需要下载个ipython,ipython是Python终端,支持图形的交互更新。(本文建议安装 ipython,完全是为了方便演示,其实只要本地安装了matplotlib,不需要 ipython 也可以画图的啦。) 安装好之后,在终端运行 ipython -pylab,于是ipython就导入了matplotlib,显示如下界面:
azalea@azalea-laptop:~$ ipython -pylab
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15)
Type "copyright", "credits" or "license" for more information.
IPython 0.10 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.
Welcome to pylab, a matplotlib-based Python environment.
For more information, type 'help(pylab)'.
In [1]:
输入 plot([1,2,4,8,16])
此时应该弹出图形窗口
In [4]: plot(x,y) n list,plot()函数如果只收到一个参数,就默认为是y值,而x值默认是从0到n。
如果提供2个参数给plot()函数:
In [2]: x = range(-4,5)
In [3]: y = [elem**2 for elem in x]
In [4]: plot(x,y)
大家此时应该看到弹出的窗口里多了一条绿色抛物线。
如果我觉得绿色抛物线不爽怎么办呢?只要给plot()函数更多一些参数,就可以方便的改变线的颜色粗细和风格啦。
plot(x,y,color='red', linestyle='dashed', marker='o')
或者简单的写成
plot(x,y,'ro--')
都会画出一条红色虚线连接的红色圆点。注意现在看起来很奇怪,因为这条线和之前画的绿色抛物线重合了,可以 Ctrl+D 退出 ipython再重新进入,输入
In [1]: x = range(-4,5)
In [2]: y = [elem**2 for elem in x]
In [3]: plot(x,y,'ro--')
关于plot()函数的详细用法参考这里
In [4]: mu, sigma = 200, 25
In [5]: x = mu + sigma*randn(10000) #前两行是数据,不算。。
In [6]: hist(x, 50, normed=1)
一句话画出柱状图
In [7]: Means = (20, 35, 30, 35, 27)
In [8]: Std = (2, 3, 4, 1, 2) #前两行还是数据,仍然不算。。
In [9]: bar(range(len(Means)), Means, color='r', yerr=Std)
下面要讲高级的东东啦
前面我们看到只要一个plot()函数就能画出整个图啦,但其实 matplotlib在背后做了很多事。
首先,matplotlib自动创建了一个Figure对象,然后在Figure之上有创建了一个Axes对象,在Axes对象之上才用plot()函数创建了一个Line2D对象。详见文档。
我们可以手动创建Figure对象和Axes对象,并可以保存这些对象,用于以后的定制。
在 ipython 里,输入:
fig = plt.figure()
手动创建一个Figure对象。
ax = fig.add_subplot(111)
在Figure之上,手动创建了一个Axes对象,我们用ax指向这个对象,便于以后操作。
如果窗口没有变化,可以输入
show()
立刻刷新窗口
此时可以输入
ax.get_xlim()
获得Axes的x坐标范围,默认是 (0.0, 1.0)
下面用plot()函数在Axes上画线,返回值是一个python list,于是把list的第一个元素(即第一条线)赋值给变量line
line, = ax.plot([1,2,4,8,16])
show()
此时x和y坐标的范围随着数据自动改变了。
ax.get_xlim()
的值是 (0.0, 4.0)
此时我觉得应该
此时我想改变 x坐标轴上的文字颜色,
许多方法都殊途同归
方法一:
setp(ax.get_xticklabels(),color='g')
方法一变种 (MATLAB风格):
setp(ax.get_xticklabels(),'color', 'g')
详见文档
方法二:
for label in ax.get_xticklabels():
label.set_color('g')
我想把y轴变成log-scale的,很简单:
yscale('log')
于是现在查看y轴的scale,
ax.get_yscale()
的结果是 ‘log’,而ax.get_xscale()
的结果是 ‘linear’
如果我觉得还是linear scale好,怎么改回去呢?
你猜对了,是 yscale('linear')
忽然想把前面plot()画的line给改一下,于是
setp(line, color='orange', linestyle='-.', marker='^'))
或者
setp(line, ’color‘,'orange', 'linestyle','-.', 'marker','^'))
或者罗嗦的方法:
line.set_color('orange')
line.set_linestyle('-.')
line.set_marker('^')
发现matplotlib真是无所不能改,我于是想搞点恶作剧,恩,就把x轴的标记放大吧。
这又有N种方法:
方法一:
for line in ax.get_xticklines():
line.set_markeredgewidth(2)
line.set_markersize(20)
方法二:
setp(ax.get_xticklines(),markeredgewidth=2,markersize=20)
以上都是通过Axes来修改Tick对象的属性
而下面的方法是直接修改Tick对象的属性,殊途同归啦
方法三:
for line in ax.xaxis.get_ticklines():
line.set_markeredgewidth(2)
line.set_markersize(20)
详见文档
把上面例子里的某些x换成y,就可以修改y坐标轴的对应属性啦。
经过这一番折腾,现在的图形应该长成这样:
最后献上一张老图,代码在此: