Matplotlib库由各种可视化类构成,matplotlib.pyplot是绘制各类可视化图形的命令子库,通常约定引入别名:import matplotlib.pyplot as plt
。
1. plot()函数
plt.plot(x, y, format_string, **kwargs)
参数 | 说明 |
---|---|
x | X轴数据,列表或者数组,可选 |
y | Y轴数据,列表或者数组 |
format_string | 控制曲线线型格式的字符串,可选 |
**kwargs | 下一组曲线的坐标数据、线型 |
注意: | 绘制多条曲线时,各条线的X轴数据不能省略,仅绘制一条曲线时X轴数据可省略 |
format_string
:控制曲线的格式字符串,由颜色字符、风格字符和标记字符组成
常用颜色字符:
颜色字符 | 说明 | 颜色字符 | 说明 |
---|---|---|---|
‘b’ | 蓝色 blue | ‘m’ | 洋红色 magenta |
‘g’ | 绿色 green | ‘y’ | 黄色 yellow |
‘r’ | 红色 red | ‘k’ | 黑色 black |
‘c’ | 青绿色 cyan | ‘w’ | 白色 white |
常用风格字符:
风格字符 | 说明 |
---|---|
‘-’ | 实线 |
‘- -’ | 破折线 |
‘-.’ | 点划线 |
‘:’ | 虚线 |
'‘或’ ’ | 无线条 |
常用标记字符:
标记字符 | 说明 | 标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|---|---|
‘.’ | 点标记 | ‘1’ | 下花三角标记 | ‘h’ | 竖六边形标记 |
‘,’ | 像素点标记 | ‘2’ | 上花三角标记 | ‘H’ | 横六边形标记 |
‘o’ | 实心圈标记 | ‘3’ | 左花三角标记 | ‘+’ | 十字标记 |
‘v’ | 倒三角标记 | ‘4’ | 右花三角标记 | ‘x’ | x标记 |
‘^’ | 上三角标记 | ‘s’ | 实心方形标记 | ‘D’ | 菱形标记 |
‘>’ | 右三角标记 | ‘p’ | 实心五角标记 | ‘d’ | 瘦菱形标记 |
‘<’ | 左三角标记 | ‘*’ | 星形标记 | ‘|’ | 垂直线标记 |
仅绘制一条线,且省略X轴数据
import matplotlib.pyplot as plt
plt.plot([3, 1, 4, 5, 2])#当plot函数输入的参数只有一个列表时,默认为y轴,而x轴取这个列表的索引值
plt.ylabel("grade")
plt.savefig('test',dpi=600)#将图像存储为文件,默认png格式,dpi为输出质量
plt.show()
仅绘制一条线,不省略X轴数据
import matplotlib.pyplot as plt
plt.plot([0, 2, 4, 6, 8], [3, 1, 4, 5, 2])#当plot函数输入的参数有两个列表时,第一个列表为x轴,第二个列表为y轴
plt.ylabel("grade")
plt.axis([-1, 10, 0 ,6])#设置坐标轴范围,前两个值为横轴坐标,后两个值为纵轴坐标
plt.show()
绘制多条曲线
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(10)
#总共绘制四条线
#第一条线为颜色为绿色、标记字符为实心圈、线型风格为实线
#第二条线为颜色为红色、标记字符为x标记、线型风格未指定所以不画线
#第三条线为颜色未指定默认蓝色、标记字符为星形标记、线型风格未指定所以不画线
#第四条线为颜色为蓝色、标记字符未指定不画出、线型风格为点划线
plt.plot(a, a*1.5, 'go-', a, a*2.5, 'rx', a, a*3.5, '*', a, a*4.5, 'b-.')
plt.savefig('test4',dpi=600)
plt.show()
2. subplot()函数在一个区域里绘制多个图形
#plt.subplot(nrows, ncols, plot_number)
# nrows子图行数, ncols子图列数, plot_number选择子图位置
plt.subplot(3, 2, 4)#将画布分割成3行2列的六个区域,从左到右从上到下区域编号依次为1——6,每个区域称为一个子图
#plt.subplot(324) = 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)#将画布划分成2行1列的两个区域,并选择第一个子图
plt.plot(a, f(a))
plt.subplot(2,1,2)#选择子图2
plt.plot(a, np.cos(2*np.pi*a),'r--')#第三个参数'r--'为设置线型为红色 -- 型虚线
plt.show()
3.pyplot的中文显示
第一种方法:用rcParams修改全局字体实现,即图像中所有文本字符都会被改变属性
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'#字体设置为黑体
matplotlib.rcParams['font.style'] = 'normal'#字体风格设置为正常
matplotlib.rcParams['font.size'] = 20#字体大小设置为20
plt.plot([3,1,4,5,2])
plt.ylabel("纵轴(值)")
plt.savefig('test5', dpi=600)
plt.show()
rcParams的属性
属性 | 说明 |
---|---|
‘font.family’ | 字体名称 |
‘font.style’ | 字体风格,正常’normal’ 或 斜体’italic’ |
‘font.size’ | 字体大小,整数字号或者’large’、‘x-small’ |
font.family可选字体
中文字体 | 说明 | 中文字体 | 说明 | 中文字体 | 说明 |
---|---|---|---|---|---|
‘SimHei’ | 中文黑体 | ‘LiSu’ | 中文隶书 | ‘YouYuan’ | 中文幼圆 |
‘Kaiti’ | 中文楷体 | ‘FangSong’ | 中文仿宋 | ‘STSong’ | 华文宋体 |
第二种方法:在有中文输出的地方,增加一个属性:fontproperties,仅改变设置了fontproperties的中文属性
import matplotlib.pyplot as plt
import numpy as np
plt.plot([3,1,4,5,2])
plt.ylabel("纵轴(值)", fontproperties='SimHei',fontsize=20)
plt.savefig('test6', dpi=600)
plt.show()
4.pyplot的文本显示
函数 | 说明 |
---|---|
plt.xlabel() | 对X轴增加文本标签 |
plt.ylabel() | 对Y轴增加文本标签 |
plt.title() | 对图形整体增加文本标签 |
plt.text() | 在任意位置增加文本 |
plt.annotate() | 在图形中增加带箭头的注释 |
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(r'正弦波实例 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=20)#设置图标题
plt.text(1, 1, r'$\mu=100$', fontsize=15)#在横坐标为1,纵坐标为1的位置显示$$之间的Latex文本
#增加箭头注释,参数从左到右分别为:文本内容、箭头位置、文本位置、箭头属性字典(颜色、与xy位置的间隙、宽度)
plt.annotate(r'$\mu=100$',xy=(3,1),xytext=(4,1.5),arrowprops=dict(facecolor='black',shrink=0.1,width=2))
plt.axis([-1, 6,-2, 2])#设置坐标轴的范围
plt.grid(True)#显示网格
plt.savefig('text7',dpi=600)#保存图像
plt.show()
5.pyplot子绘图区域的设计(比subplot更强大的方法)
理念: 设定网格,选中网格,确定选中行列区域数量,编号从0开始
(1)方法一:
函数: plt.subplot2grid(GridSpace, CurSpec, colspan=1, rowspan=1)
参数 | 说明 |
---|---|
GridSpace | 要划分的行数和列数,如数组(3,3)将画布划分成3行3列 |
CurSpec | 要选择的区域的行列下标,如数组(0,1)选择第一行第二列(下标从0开始) |
colspan | 从CurSpec位置开始选中的列数,缺省值为1 |
rowspan | 从CurSpec位置开始选中的行数,缺省值为1 |
例如:plt.subplot2grid((3,3), (1,0), colspan=2)
生成3行3列的区域,并选中ax2区域,如下图所示:
plt.subplot2grid((3,3), (0,0), colspan=3)#选择ax1区域
plt.subplot2grid((3,3), (1,2), colspan=1, rowspan=2)#选择ax3区域
plt.subplot2grid((3,3), (2,0))#选择ax4区域
plt.subplot2grid((3,3), (2,1))#选择ax5区域
(2)方法二: 使用gridspec类配合subplot()函数
对于上面那幅图的区域划定和选择方法如下:
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])
6.16种pyplot的基础绘图函数
函数 | 说明 |
---|---|
plt.plot(x, y, fmt, …) | 绘制一个坐标图 |
plt.boxplot(data, notch, position) | 绘制一个箱形图 |
plt.bar(left, height, width, bottom) | 绘制一个条形图 |
plt.barh(width, bottom, left, height) | 绘制一个横向条形图 |
plt.polar(theta, r) | 绘制极坐标图 |
plt…pie(data,explode) | 绘制饼图 |
plt.psd(x, NFFT=256, pad_to, Fs) | 绘制功率谱密度图 |
plt.specgram(x, y, NFFT=256, Fs) | 绘制X-Y的相关性函数 |
plt.scatter(x, y) | 绘制散点图 |
plt.step(x, y, where) | 绘制步阶图 |
plt.hist(x, bins, normed) | 绘制直方图 |
plt.contour(X, Y, Z, N) | 绘制等值图 |
plt.vlines() | 绘制垂直图 |
plt.stem(x,y, linefmt, markerfmt) | 绘制柴火图 |
plt.plot_date() | 绘制数据日期 |
饼图示例:
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'#定义标签
sizes = [15,30,45,10]#设置每个标签占据的百分比,与上面的标签按照顺序对应
explode = (0, 0.1, 0, 0)#设置每个标签扇形区域的突出程度,0为不突出
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
plt.show()
直方图示例:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)#设置随机数种子
mu, sigma = 100,20#设置正态分布的均值和标准差
a = np.random.normal(mu,sigma, size=100)#产生100个服从正态分布的数据,存入数组a
#绘制直方图函数,a为数组,30:称为bin,将a等分成30个区间,每个柱体高度表示数组a在此bin上分布的数据的多少
plt.hist(a, 30, histtype='stepfilled', facecolor='b', alpha=0.75)#绘制直方图
plt.title('Histogram')
plt.show()
极坐标图示例
import numpy as np
import matplotlib.pyplot as plt
N = 20#要绘制的极坐标图中数据的个数
theta = np.linspace(0.0, 2*np.pi, N, endpoint=False)#从0到360度等分出N个不同的角度
radii = 10*np.random.rand(N)#生成每个角度对应的值
width = np.pi / 4*np.random.rand(N)#生成每个角度的宽度值
#面向对象的绘图方法
ax = plt.subplot(111, projection='polar')#设置了绘图区域,第二个参数说明绘制极坐标图
#theta, radii, width分别对应极坐标图中的left,height,width
#left:表示绘制极坐标系中的那些颜色区域的时候从哪开始,表示图中的某一个位置
#height:从中心点向边缘绘制的长度
#width:每个绘图区域的面积
bars = ax.bar(theta, radii, width=width, bottom=0.0)
#给每个扇形区域添加颜色
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.viridis(r/10.))
bar.set_alpha(0.5)
plt.show()
散点图示例:
import numpy as np
import matplotlib.pyplot as plt
#继续使用面向对象的思想绘图
fig, ax = plt.subplots()
ax.plot(10*np.random.randn(100),10*np.random.randn(100),'o')
ax.set_title('Simple Scatter')
plt.show()