http://www.blogbus.com/flyfeeling-logs/53148228.html
matplotlib是python中一个用于画图的一个包,在matplotlib的主页上是这么介绍的:matplotlib is a python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms. 目前matplotlib的最新版本是0.99.1,可以进入他的官网进行下载:http://matplotlib.sourceforge.net/
使用matplotlib来画图已经很长时间了,零零碎碎的也积攒了很多小tips,但是一直没怎么整理,在这个帖子里,我准备将平时所用到的小tips做一个小结,在以后也会不定期的进行更新。
首先介绍一下matplotlib中最常用的一个子模块,pyplot。这个包中包含常用的绘制二维曲线的方法,也是实际中应用最多的一个字包。因此通常我们用matplotlib绘图的时候首先需要引入这个包,即
import matplotlib.pyplot as plt
下面介绍二维图中的常用的几个概念
figure:定义一个图片
fig = plt.figure()
axes:定义图片中的一块绘图区域,在实际作图中,通常使用下面的方法
ax = fig.add_subplot(111)
可以将图片划分为几个绘图区域,括号中的三个数字分别表示将图片划分为几行、 几列,以及选取第几个绘图区域,因此,如下的语句表示,将图片划分为2行2列,供4个区域,ax是其中的第三个区域,注意在这里是按照行来数的,即图片的左下角的区域。
ax = fig.add_subplot(223)
括号中的数字也可以用逗号隔开,即
ax = fig.add_subplot(2,2,3)
axis:表示绘图区域的一个坐标轴,有x轴和y轴之分,分别可以通过以下方法取得
xaxis = ax.xaxis
yaxis = ax.yaxis
以上的三个概念是绘图中使用最多,大部分操作也是在其中完成的。
下面介绍一些经常使用到的一些操作。
1. 画二维曲线图
x = arange(0,5,0.1)
y = [math.sin(a) for a in x]
ax.plot(x,y,"ro-")
图片结果如图1所示,双引号里面的三个字符分别表示曲线颜色,点的形状,线的形状。也可以用以下的方式显示指定:
ax.plot(x,y,color='r',linestyle='-',marker='o')
color的取值可以参见表1,或者使用RGB的值,即color=(1,0,0)。
linestyle与marker的取值可以参见表2,默认的线形为'-',点形为'o'。如果只想表示散点图,可以使用
ax.plot(x,y,"ro")
或者
ax.plot(x,y,color='r',linestyle='',marker='o')
图1 表1
表2
在实际中,我们可能经常会用到对数坐标轴,这时可以用下面的三个函数来实现
ax.semilogx(x,y) #x轴为对数坐标轴
ax.semilogy(x,y) #y轴为对数坐标轴
ax.loglog(x,y) #双对数坐标轴
2. 图形标注
这个命令很简单,如果在plot语句中使用了label属性,那么使用legend语句即可自动在图片中添加一个标注框,如下:
x = arange(0,5,0.1)
y = [math.sin(a) for a in x]
ax.plot(x,y,"ro-",label = "sin(x)")
y = [math.cos(a) for a in x]
ax.plot(x,y,"bx-",label = "cos(x)")
ax.legend()
程序运行结果如图2所示。
当然我们可以指定legend的位置,如下:
ax.legend(loc='lower left')
或者
ax.legend(loc=3)
location的可选参数见表3.
图2 表3
3. 坐标轴的标题
在图2中,我们使用下面语句来定义坐标轴标题
ax.set_xlabel("x")
ax.set_ylabel("sin(x),cos(x)")
4. 数学公式编辑
图2中的图形标签与坐标轴的标题都是用常规字体来显示的,那么很多时候我们希望它们显示成数学公式的样子,或者有时候直接就需要编辑一个数学公式,里面可能包括一些拉丁字母或者数学符号等,这时候我们需要借助用:LaTex。
LaTex是一款排版软件,是编辑论文的常用工具,也可以处理日常生活中的各种文档,如写信、写书、画表格,甚至做幻灯片。它和word的主要区别在于:word是“所见即所得”,而LaTex是“所想即所得”。在LaTex里编辑公式是依靠一系列命令生成的。
当然在这里,我不准备将篇幅全部用于LaTex上面,感兴趣的朋友可以自己google学习之。在matplotlib里面,也可以使用LaTex的命令来编辑公式,只需要在字符串前面加一个“r”即可,这里给大家看一个简单的例子。
x = arange(1,1000,1)
r = -2
c = 5
y = [5*(a**r) for a in x]
ax.loglog(x,y,label = r"$y = c*x^{\gamma}, c=5,\gamma=-2$")
ax.legend()
ax.set_xlabel(r"x")
ax.set_ylabel(r"y")
程序执行结果如图3所示,这实际上是一个power-law的例子,有兴趣的朋友可以继续google之。
图3
关于LaTex的更多命令,可以参见matplotlib的官方教程:
http://matplotlib.sourceforge.net/users/mathtext.html#mathtext-tutorial
5. 控制坐标轴的显示
前面所有的例子的坐标轴的所有显示(如最大值,最小值,间隔大小,显示方式等等)都是使用的默认生成方式,而实际上,我们也可以用几句命令很方便的进行修改。下面用例子来说明吧:
x = arange(0,5,0.1)
y = [10*math.sin(a) for a in x]
ax.plot(x,y,"ro-",label = "sin(x)")
ax.set_xlim(1,4) # 设定x轴范围
ax.set_ylim(-8.5,11) # 设定y轴范围
ax.set_xticks(range(1,4.1,0.5)) # 设定x轴的标签
ax.set_yticks(range(-8,11,2)) # 设定y轴的标签
程序运行结果如图4所示,而如果你希望你的坐标轴上的标签显示的不是数字,而是一些设定好的文字,当然也可以:
ax.set_xticklabels(list("abcdefg")) # 设定x轴的标签文字
显示结果如图5所示
图4 图5
通过set_xticks与set_xticklabels的结合,我们就可以任意变换我们想要的x轴标签的显示形式了,记住,set_xticks是设定标签的实际数字,而set_xticklabels则是设定我们希望他显示的结果。