Matplotlib库是python优秀的数据可视化第三方库,官网为:http://matplotlib.org/
一些可视化效果可以查看:http://matplotlib.org/gallery.html
Matplotlib库的使用
Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发,Matplotlib的设计者想让用户可以很简单的使用Matplotlib画图,而不用去管复杂的实现类,所以Matplotlib提供了一个子库Matplotlib.pyplot。
Matplotlib.pyplot
Matplotlib.pyplot是绘制各类可视化图形的命令子库,相当于快捷方式。
使用import matplotlib.pyplot as plt导入pyplot
| import matplotlib.pyplot as plt
plt.plot([3,1,4,5,2]) plt.ylabel("grade") plt.savefig('test',dpi=600) plt.show()
|

plot函数在绘制图像的时候如没指定横坐标,或只输入了一组数组,则会把默认这组数组为纵坐标,并根据纵坐标的索引生成横坐标
1 2 3 4 5 6
| import matplotlib.pyplot as plt
plt.plot([0,2,4,6,8],[3,1,4,5,2]) plt.ylabel("grade") plt.axis([-1,10,0,6]) plt.show()
|

pyplot的绘图区域
plt.subplot(nrows,ncols,plot_number)函数可以在全局绘图区域中创建一个分区体系,并定位到一个子绘图区域。
- nrows代表这块区域横轴方向分割的块数
- ncols代表这块区域纵轴方向分割的块数
- plot_number代表正在画的这张图在这块区域的那块位置
1 2 3 4 5 6 7 8 9 10 11 12 13
| import matplotlib.pyplot as plt import numpy as np
def f(t): return np.exp(-t)*np.cos(2*np.pi*t) a= np.arange(0.0,5.0,0.02)
plt.subplot(211) plt.plot(a,f(a))
plt.subplot(2,1,2) plt.plot(a,np.cos(2*np.pi*a),'r--') plt.show()
|

pyplot的plot()函数
plt.plot(x,y,format_string,**kwargs)
x:X轴数据,列表或数组,可选
y:Y轴数据,列表或数组
format_string:控制曲线的格式字符串,可选
由颜色字符、风格字符和标记字符组成
**kwargs:第二组或更多(x,y,format_string)
当绘制多条曲线时,各条曲线的x不能省略。
1 2 3 4 5 6 7
| mport matplotlib.pyplot as plt import numpy as np
a=np.arange(10) plt.plot(a,a*1.5,a,a*2.5,a,a*3.5,a,a*4.5) plt.axis([-1,10,-1,40]) plt.show()
|

format_string参数是控制曲线格式的字符串,由颜色字符、风格字符和标记字符组成。
颜色字符 | 说明 |
|---|
'b' | 蓝色 |
'g' | 绿色 |
'r' | 红色 |
'c' | 青绿色 |
'#008000' | RGB某颜色 |
'm' | 洋红色 |
'y' | 黄色 |
'k' | 黑色 |
'w' | 白色 |
'0.8' | 灰度值字符串 |
风格字符 | 说明 |
|---|
'-' | 实线 |
'--' | 破折线 |
'-.' | 点划线 |
':' | 虚线 |
'',' ' | 无线条 |
标记字符 | 说明 |
|---|
'.' | 点标记 |
',' | 像素标记(极小点) |
'o' | 实心圈标记 |
'v' | 倒三角标记 |
'^' | 上三角标记 |
'>' | 右三角标记 |
'<' | 左三角标记 |
'1' | 下花三角标记 |
'2' | 上花三角标记 |
'3' | 左花三角标记 |
'4' | 右花三角标记 |
's' | 实心方形标记 |
'p' | 实心五角标记 |
'*' | 星形标记 |
'h' | 竖六边形标记 |
'H' | 横六边形标记 |
'+' | 十字标记 |
'x' | x标记 |
'D' | 菱形标记 |
'd' | 瘦菱形标记 |
| `’ | '` |
1 2 3 4 5 6 7
| import matplotlib.pyplot as plt import numpy as np
a=np.arange(10) plt.plot(a,a*1.5,'go-',a,a*2.5,'rx',a,a*3.5,'*',a,a*4.5,'b-.')
plt.show()
|

** kwargs是可选参数,以上的颜色,风格,标记也都可以表示:
- color:控制颜色,
color='green' - linestyle:线条风格,
linestyle='dashed' - marker:标记风格,
marker='o' - markerfacecolor:标记颜色,
markerfacecolor='bule' - markersize:标记尺寸,
markersize=20 - ……
pyplot的中文显示
pyplot并不默认支持中文显示,需要rcParams修改字体实现
1 2 3 4 5 6 7
| import matplotlib.pyplot as plt import matplotlib
matplotlib.rcParams['font.family']='SimHei' plt.plot([3,1,4,5,2]) plt.ylabel('纵轴(值)') plt.show()
|

rcParams的属性:
属性 | 说明 |
|---|
font.family | 用于显示字体的名字 |
font.style | 字体风格,正常’normal‘或斜体’italic‘ |
font.size | 字体大小,整数字号或者’large‘、’x-small‘ |
中文字体 | 说明 |
|---|
SimHei | 黑体 |
Kaiti | 楷体 |
LiSu | 隶书 |
FangSong | 仿宋 |
YouYuan | 幼圆 |
STSong | 华文宋体 |
1 2 3 4 5 6 7 8 9 10 11 12 13
| import matplotlib.pyplot as plt import matplotlib import numpy as np
matplotlib.rcParams['font.family']='STSong' matplotlib.rcParams['font.size']=20
a = np.arange(0.0,5.0,0.02)
plt.xlabel('横轴:时间') plt.ylabel('纵轴:振幅') plt.plot(a,np.cos(2*np.pi*a),'r--') plt.show()
|

为了能够使用局部的中文字体我们在有中文输出的地方,增加一个fontproperties属性。这也是最推荐的方法上面的代码变为:
1 2 3 4 5 6 7 8 9
| import matplotlib.pyplot as plt import numpy as np
a = np.arange(0.0,5.0,0.02)
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=20) plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=20) plt.plot(a,np.cos(2*np.pi*a),'r--') plt.show()
|

pyplot的文本显示函数
函数 | 说明 |
|---|
plt.xlabel() | 对X轴增加文本标签 |
plt.ylabel | 对Y轴增加文本标签 |
plt.title | 对图形整体增加文本标题 |
plt.text | 在任意位置增加文本 |
plt.annotate | 在图形中增加带箭头的注解 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import matplotlib.pyplot as plt import numpy as np
a = np.arange(0.0,5.0,0.02) plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=15,color='green') plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=15) plt.title(r'正弦波实例 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25) plt.text(2,1,r'$\mu=100$',fontsize=15)
plt.axis([-1,6,-2,2]) plt.grid(True) plt.show()
|

plt.annotate(s,xy=arrow_crd,xytext=text_crd,arrowprops=dict)是注释函数
- s:注释的文本
- xy:箭头显示位置
- xytext:文本显示位置
- arrowprops:字典类型,定义整个箭头显示的属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import matplotlib.pyplot as plt import numpy as np
a = np.arange(0.0,5.0,0.02) plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=15,color='green') plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=15) plt.title(r'正弦波实例 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25) plt.annotate(r'$\mu=100$', xy=(2,1), xytext=(3,1.5), arrowprops=dict(facecolor='black',shrink=0.1,width=2))
plt.axis([-1,6,-2,2]) plt.grid(True) plt.show()
|

pyplot的子绘图区域
pyplot.subplot函数只能将一块绘图区域分割为规则的子绘图区域,但在实际应用中,我们希望可以划分不规则的区域,所以就有了plt.subplot2grid()函数,这个函数辅助plt.subplot()函数划分绘图区域。
plt.subplot2grid(GridSpec,CurSpec,colspan=1,rowspan=1)
设计理念:设定网格,选中网格,确定选中行列区域数量,编号从0开始。
- GridSpec:划分网格为几块区域
- CurSpec:选择网格的第几行几列
- colspan和rowspan:确定选择网格的横向和纵向的延伸数量。
1 2 3 4 5 6 7 8 9 10 11 12
| import matplotlib.pyplot as plt
plt.subplot2grid((3,3), (0,0), colspan=3) ... plt.subplot2grid((3,3), (1,0), colspan=2) ... plt.subplot2grid((3,3), (1,2), rowspan=2) ... plt.subplot2grid((3,3), (2,0)) ... plt.subplot2grid((3,3), (2,1)) ...
|

使用subplot2grid函数固然可以划出不规则区域,但每次都要在选择子绘图区域时,都要确定整个绘图区域(例子中的第一个参数),所以我们可以使用GridSpec类和subplot函数来规定整体绘图区域。
1 2 3 4 5 6 7 8 9 10
| import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec
gs=gridspec.GridSpec(3, 3)
ax1=plt.subplot(gs[0,:]) ax2=plt.subplot(gs[1,:-1]) ax3=plt.subplot(gs[1:,-1]) ax4=plt.subplot(gs[2,0]) ax5=plt.subplot(gs[2,1])
|

关键
不可能掌握每一种画图方法,要根据数据选取恰当的图形展示数据含义,然后通过文档来绘图。