1.Matliotlib库介绍:
Matliotlib库是Python优秀的数据可视化第三方库,官网为http://matplotlib.org。
Matliotlib库的效果见:http://matplotlib.org/gallery.html。
Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发。
matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式。导入方式如下:
import matplotlib.pyplot as plt #尽管别名可以省略或者修改,建议使用上述约定的别名
2.Matliotlib库绘制图形:
下面是使用Matplotlib库绘制一个简单的图形并存储成文件的代码,可以看出使用Matliotlib库绘制图形还是很方便的。
import matplotlib.pyplot as plt
plt.plot([3,1,4,5,2]) #绘制一个五个元素的列表的图形
plt.ylabel("Grade") #绘y轴增加一个标签叫Grade,x轴自动生成
# plt.savefig()将输出图形存储为文件,默认PNG格式,可以通过dpi修改输出质量
plt.savefig('test',dpi=600)
plt.show()
生成如下图形:
下面使用Matplotlib库绘制xy轴均有对应数值的图形。
import matplotlib.pyplot as plt
plt.plot([0,2,4,6,8],[3,1,4,5,2]) #当有两个参数时,按照x轴和y轴顺序绘制数据点
plt.ylabel("Grade")
plt.axis([-1,10,0,6]) # 设定x轴y轴尺度的函数
plt.show()
生成如下图形:
3.Matliotlib库绘图区域:
matplotlib所绘制的图位于图片(Figure)对象中,可以使用plt.figue()
生成一个新的图片,这时会出现一个空白的绘图窗口。
不过我们不能使用空白的图片进行绘图,需要通过add_subplot()
来创建一个或多个子图。
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1) # 将图片(Figure)对象划分成2行2列,子图ax1位于第一个位置
ax2 = fig.add_subplot(2,2,2) # 子图ax2位于第二个位置
ax3 = fig.add_subplot(2,2,3) # 子图ax3位于第三个位置
plt.show()
得到如下的子图显示:
最简单分割绘图区域的办法是使用plt.subplot(nrows,ncols,plot_number)
函数,将一个绘图区域分割成以第一个参数nrows作为横轴数量,将第二个参数作为纵轴数量的子区域。
使用subplot()
函数,在全图绘图区域中创建一个分区体系,并定位到一个子绘图区域。
例如:plt.subplot(3,2,4)
将获得如下图所示的绘图区域。
分区域绘图范例:
import numpy as np
import matplotlib.pyplot as plt
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()
将得到如下效果:
plt.subplot()
参数选项:
参数 | 说明 |
---|---|
nrows | 子图的行数 |
ncols | 子图的列数 |
sharex | 所有子图使用相同的x轴刻度(调整xlim会影响所有子图) |
sharey | 所有子图使用相同的y轴刻度(调整ylim会影响所有子图) |
subplot_kw | 传入add_subplot的关键字参数字典,由于生成子图 |
默认情况下,matplotlib会在子图的外部和子图之间留有一定的间距,这个间距都是相对于图的高度和宽度来指定的,可以使用图对象的subplots_adjust()
方法来改变间距,也可以用作顶层函数。
subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None) # wspace和hspace分别控制图片的宽度和高度百分比
4.颜色、标记与线类型(plot()
):
plt.plot(x, y, format_string, **kwargs)
- x——X轴数据,列表或数组,可选(绘制多条曲线时,各条曲线的x不能省略);
- y——Y轴数据,列表或数组;
- format_string——控制曲线的格式字符串(由颜色字符、风格字符和标记字符组成),可选;
颜色字符:
颜色字符 | 说明 | 颜色字符 | 说明 |
---|---|---|---|
‘b’ | 蓝色 | ‘m’ | 洋红色(magenta) |
‘g’ | 绿色 | ‘y’ | 黄色 |
‘r’ | 红色 | ‘k’ | 黑色 |
‘c’ | 青绿色(cyan) | ‘w’ | 白色 |
‘#008000’ | RGB某颜色 | ‘0.8’ | 灰度值字符串 |
风格字符:
风格字符 | 说明 | 风格字符 | 说明 |
---|---|---|---|
‘_’ | 实线 | ‘__’ | 破折线 |
‘_.’ | 点划线 | ‘:’ | 虚线 |
“” | 无线条 |
标记字符:
标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|
‘.’ | 点标记 | ‘,’ | 像素标记(极小点) |
‘o’ | 实心圈标记 | ‘v’ | 倒三角标记 |
‘^’ | 上三角标记 | ‘>’ | 右三角标记 |
‘<‘ | 左三角标记 | ‘1’ | 下花三角标记 |
‘2’ | 上花三角标记 | ‘3’ | 左花三角标记 |
‘4’ | 右花三角标记 | ‘s’ | 实心方形标记 |
‘p’ | 实心五角标记 | ‘*’ | 星形标记 |
‘h’ | 竖六边形标记 | ‘H’ | 横六边形标记 |
‘+’ | 十字标记 | ‘x’ | x标记 |
‘D’ | 菱形标记 | ‘d’ | 瘦菱形标记 |
‘|’ | 垂直线标记 |
**kwargs
——第二组或更多(x, y, format_string):
color:控制颜色,color=’green’
linestyle:线条风格,linestyle=’dashed’
marker:标记风格,marker=’o’
markerfacecolor:标记颜色,markerfacecolor=’blue’
markersize,标记尺寸,markersize=20
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(10)
plt.plot(a, a*1.5,color='green',linestyle='dashed',marker='o',markerfacecolor='blue',markersize=10)
plt.show()
将颜色字符、风格字符和标记字符组合使用,效果如下:
import numpy as np
import matplotlib.pyplot as plt
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()
5、pyplot的中文显示方法:
pyplot并不默认的支持中文的显示,如果我们希望显示中文,有两种方法实现。
- 通过rcParams(matplotlib用于改变全局字体的相关资源库)属性修改字体实现,这个方法会改变全局所有的字体:
rcParams的属性:
属性 | 说明 |
---|---|
‘font.family’ | 用于显示字体的名字 |
‘font.style’ | 字体风格,正常’normal’或斜体’italic’ |
‘font.size’ | 字体大小,整数字号或者’large’、’x-small’ |
rcParams[‘font.family’]的属性: | |
属性 | 说明 |
:—-: | :—-: |
‘SimHei’ | 中文黑体 |
‘Kaiti’ | 中文楷体 |
‘LiSu’ | 中文隶书 |
‘FangSong’ | 中文仿宋 |
‘YouYuan’ | 中文幼圆 |
‘STSong’ | 华文宋体 |
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
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
来实现(建议使用此方法):
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=20) # 只对xlabel起作用
plt.ylabel("纵轴:振幅",fontproperties='SimHei',fontsize=20) # 只对ylabel起作用
plt.plot(a, np.cos(2*np.pi*a),'r--')
plt.show()
得到如下图形:
6、pyplot的文本显示方法:
函数 | 说明 |
---|---|
plt.xlable() | 对X轴增加文本标签 |
plt.ylable() | 对Y轴增加文本标签 |
plt.title() | 对图像整天增加文本标签 |
plt.text() | 在任意位置增加文本 |
plt.annotate() | 在图形中增加带箭头的注解 |
其中:plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
- xy——箭头所在位置;
- xytext——文本显示位置;
- arrowprops——是一个字典类型,定义了箭头显示的一些属性,facecolor表示箭头颜色、shrink表示箭头缩进比率、width表示箭头宽度。
import numpy as np
import matplotlib.pyplot as plt
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()在图形上方增加文本标签,其中'$$'表示使用Latex格式,专业排版体系,有自己的Latex语法
plt.title(r'正弦波实例$y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
# plt.annotate()在图形中增加带箭头的注解。
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()
得到如下图形:
7.pyplot的子绘图区域:
绘制子绘图区域前面提到了plt.subplot()
方法,但是要绘制复杂的绘图区域可以使用plt.subplot2grid()
方法。
该方法的设计理念为,设定网格,选中网格,确定选中行列区域数量,编号从0开始,从而实现对一个自定义网格的使用。
plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)
- GridSpec——二元组(m,n),表示将网格分为m行n列;
- CurSpec——二元组(a,b),表示选择第几个网格,索引从0开始;
- colspan——表示列的延伸,从前面选定的位置开始在列的方向上延伸设定的长度,默认为1(不合并);
- rowspan——表示行的延伸,默认为1(不合并)。
通过如下设定:plt.subplot2grid((3,3),(1,0),colspan=2)
得选中如下区域的网格:
但是每次调用plt.subplot2grid()
方法都需要重新对图形的设定做一个约束,例如每次都需要给出(3,3)这样一个方位,我们可以使用GridSpec
类来简化其中的设定。
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])
通过GridSpec
类可以很方便的定位到下面各个网格位置:
Reference:
《Python for Data Analysis:Data Wrangling with Pandas,Numpy,and IPython》