一.简介
1.https://matplotlib.org/
2.matplotlib中的图
(1)figure:(呈现出来的)整个窗口(画板):可以分为几块(subplot),可以包含一些画布,至少有一个画布用于作图,
(2)axes:具有数据空间的图像区域(画布):一个画布只能对应一个窗口,一个axes对象可以有一些axis对象(轴、维度,若是二维的,则有两个轴,即x和y轴,即一组axis表示了一个坐标系),axes利用一些axis对象来限制数据空间
(3)axis:维度、轴:我们根据数据来作图,数据有限制,则数据空间有限,我们利用多个轴来表示有限的数据空间,简单说,轴就是定位和限制数据。画布是无限的数据空间,而轴组成的数据空间是有限的
(4)其他概念:figsize窗口大小,label轴标签;title标题;lim限制;plot绘图;subplot绘制子图,bar柱状图;legend图例;width宽度;scatter散点图;axis坐标轴;等高线图contours;image图片;动画animation,tick刻度,grid网格
3.绘图:建议(2)
(1)可以依赖于对象方法的形式绘图和进行一些操作,因为窗口、画布、维度这些都是对象,有相应的属性和方法。比如ax.plot()
(2)可以依赖于其中的pyplot接口进行自动创建和管理这些对象,并用相应的函数进行绘图。比如plt.plot()
二. 创建窗口和画布
1.窗口一般表示计算机是怎么呈现给我们看的绘图窗口,涉及到后端,有交互式(pygtk,wxpython,tkinter,qt4等)和非交互式(PNG,SVG,PDF等保存显示格式)两种
2.窗口和画布本质上都是对象,则有相应的方法和属性,但是我们一般不严格区分它们
3.创建
(1)对象法
1 import matplotlib.pyplot as plt 2 import numpy as np 3 import pandas as pd 4 5 x = np.linspace(-1,1,10) 6 y = 2*x 7 8 # # 1.利用对象方法的形式创建窗口和画布,一般用于嵌入图,其实等号右边已经进行创建,左边不过是赋值对象 9 # # (1)创建一个窗口figure,用于呈现图形,创建完成后默认之后的操作都在该窗口下进行,除非重新创建一个窗口或改变窗口 10 f = plt.figure(num=1, figsize=(8, 5)) # num指明是第几张figure,figsize指明figure的长宽(以英寸为单位) 11 # # (2)创建一个画布axes,用于绘图区域,注意若创建多个,后一个覆盖前一个 12 # ([left, bottom, width, height] ,背景颜色)左和下表示对于窗口左下角(0,0)的差距--百分比,宽高表示画布大小--百分比 13 ax1 = f.add_axes([0.1, 0.1, 0.8, 0.9], facecolor='y') 14 ax2 = f.add_axes([0.2, 0.2, 0.2, 0.2], facecolor='r') 15 ax1.plot(x, y) 16 ax2.scatter(x, y) 17 plt.show()
(2)plt接口
1 # 1.利用pyplot接口进行一些操作 2 fig, axes = plt.subplots(2, 2) # 创建一个窗口,并将其等分为2行2列的画布,其中axes为一个2*2的画布对象,每个元素表示一个画布 3 axes[0][0].plot(x, y) 4 axes[0][1].scatter(x, y) 5 # 注意:plt绘图时,所在的画布若没指定,则默认为上面出现的最后一个画布 6 plt.plot(x, y, color='b') 7 plt.bar(x, y, color='r') 8 9 # 2.subplot把当前的figure等分成3*3的画布区域,后面一个参数表示选择第几个画布, 10 # 本质是创建一个画布,注意当创建的画布和之前的有冲突时,后面的画布覆盖前面的画布 11 plt.subplot(3,3,7) # 等价于f.add_subplot(2,2,1) 12 plt.plot(x, y, color='y') 13 14 # 3.跨行跨列的画布 15 plt.figure(num=2) # 创建一个figure 16 # (1)前一个元组表示把figure怎么分(3行3列),后面表示选择哪个画布(第0行第0个)作为起始,然后往后跨行或列,colspan行跨度,rowspan列跨度 17 ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3) 18 ax2 = plt.subplot2grid((4, 4), (2, 0), rowspan=2) 19 # (2)还可以用gridspec把fig网格来选取画布 20 # import matplotlib.gridspec as gridspec 21 # gs = gridspec.GridSpec(3, 3)#定义(3,3)的图 22 # ax6 = plt.subplot(gs[0, :]) 23 24 # 4.直接创建画布 25 plt.axes([0.6, 0.2, 0.25, 0.25],facecolor='r') # 等价于fig.add_axes()
三. pyplot
1.绘图的接口,有各种函数和操作,主要特点是自动创建对象、跟踪对象和绘图
2.pyplot常用操作
1 x = np.linspace(-1, 1, 10) 2 y = 2 * x 3 4 # pyplot 5 fig, axes = plt.subplots() # 创建一个窗口和一个画布 6 plt.axis([0.5, 10, 0, 10]) # 构建坐标系[xmin, xmax, ymin, ymax]:x轴,y轴 7 # 相当于plt.xlim(0.5,6)和plt.ylim(0,5) 8 9 # #设置x,y轴的标签(说明),可以设定一些属性 10 plt.xlabel('x lable', fontsize=14, color='red') 11 plt.ylabel('y lable') 12 13 # 标题 14 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 15 plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号 16 plt.title('真的标题') 17 18 # plot根据点作二维线性图,可选属性:x,y, label标签(图例),markersize=12点的大小,linestyle线宽, 19 # color颜色:'b' 蓝色,'g' 绿色,'r' 红色,'c' 青色,'m' 品红,'y' 黄色,'k' 黑色,'w' 白色 20 # linestyle线的形状:'-' 实线样式,'--' 虚线样式,'-.' 点划线样式,':' 虚线样式 21 # marker点的形状:'.' 点标记,',' 像素标记,'o' 圆圈标记,'^' 三角形标记,'s' 方形标记,'*' 星标,'x' X标记,等等... 22 pic1 = plt.plot(3*x, 4*y, color='red', marker='x',markersize=8, linewidth=5,linestyle=':',label='线1') 23 24 d = pd.DataFrame( 25 {'one': pd.Series([1,5,7,2],index=['a','b','c','d']), 26 'two': pd.Series([6,3,9,4],index=['a','b','c','d']), 27 } 28 ) 29 # data利用标签数据来进行绘图 30 pic2 = plt.plot('one','two',data=d,label='线2') 31 32 # 显示图例,默认绘图中的标签,loc:0为最优,1右上角,2左上角....; ncol:为标签有几列 33 plt.legend(loc=0, ncol=2) 34 35 # 显示网格线 36 plt.grid(True) 37 38 # text在任意位置添加文本,pyplot中可以使用teX渲染的数学表达式 39 plt.text(8, 8, r'$mu=100, sigma=15$',fontdict={'size': 16, 'color': 'r'}) 40 41 # 注释,文本、被注释点的坐标位置xy(x0, y0)、xytext注释文本的位置,arrowprops箭头,bbox边框(背景颜色:white,边框颜色:无,透明度:80%,) 42 # ,weight字体,color颜色 43 plt.annotate('注释', xy=(2, 5), xytext=(3, 1.5), 44 weight=13,color='b', 45 arrowprops=dict(facecolor="y", headlength=10, headwidth=10, width=20), 46 bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k', lw=1, alpha=0.5), 47 ) 48 49 # 显示 50 plt.show()
1 y = np.random.normal(loc=0.5, scale=0.4, size=1000) 2 y = y[(y > 0) & (y < 1)] 3 y.sort() 4 x = np.arange(len(y)) 5 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 6 plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号 7 # 8 plt.subplot(221) 9 plt.plot(x, y) 10 11 # 修改刻度 12 plt.subplot(222) 13 plt.plot(x, y) 14 plt.yscale('log') # 更改轴的比例,也就是改刻度,有linear线性刻度,log对数刻度,logit、symlog对称对数 15 plt.title('log') 16 plt.grid(True) 17 18 # 改变轴名称 19 plt.subplot(223) 20 plt.plot(x, y) 21 # 设置x,y的范围以及单位轴长,以及程度标记 22 plt.xticks([0,200,600,800],['刻度1','刻度2','刻度4','刻度5']) 23 plt.yticks([0,0.6,0.9,1], 24 ['$really bad$', r'$normal$','good','really good']) 25 26 27 plt.subplot(224) 28 plt.plot(x, y) 29 # gca='get current axis'得到现在的轴(四个边框) 30 ax = plt.gca() 31 ax.spines['right'].set_color('none') # 去除右边的边框 32 ax.spines['top'].set_color('none') # 去除上面的边框 33 ax.xaxis.set_ticks_position('bottom') # 把下边的框代替x轴 34 ax.yaxis.set_ticks_position('left') # 把左边的框代替y轴 35 ax.spines['bottom'].set_position(('data',-0)) # 把下边框(x轴)放在y轴-0的位置 36 ax.spines['left'].set_position(('data',-0)) # 把左边框(y轴)放在x轴-0的位置 37 38 # 其他 39 #sharex,sharey共享x,y轴,定义一个(2,2)的figure,并给出格式(ax11, ax12), (ax13, ax14)) 40 f, ((ax11, ax12), (ax13, ax14)) = plt.subplots(2, 2, sharex=True, sharey=True) 41 # ax2 = ax1.twinx() # 创建画布 把y轴镜面反射 42 plt.suptitle('Categorical Plotting') # 总标题 43 44 plt.show()
四.plt常用图形绘制
1.二维线图plot:在二维平面上,根据点顺序连线,线图,若x为延x轴顺序进行,即为折线图:反映数据的变化趋势,一般用于随时间或有序类别而变化的数据,刻度均匀分布
1 x = np.linspace(0,10,9) 2 y = x + np.random.randn(x.shape[0],) 3 4 # 折线图plot,必要参数x,y 5 plt.subplots() 6 plt.plot(x,y) 7 8 plt.show()
2.散点图:表明数据的分布情况,表明因变量随自变量变化的大致趋势,适用于多类别的聚合数据,核心在于发现变量之间的关系(比如线性、指数、对数等)
1 x1 = list((np.random.randn(50)+1)*5) 2 x1.extend(list((np.random.randn(50)+2)*5)) 3 x2 = np.random.randn(100) 4 category = np.random.choice([1,2,3],[1,100])[0] 5 size = category*300 6 fig, ax = plt.subplots() 7 # 绘制散点图,x和y表示二维数据的对应,alpha透明度 8 # c表示color颜色,可以用于类别分类,颜色不同表示类别不同,s表示点的大小,跟c一样的意义,可以设定不同类别大小不同 9 plt.scatter(x1, x2, c=category, s=size, marker='o', alpha=0.95) 10 11 plt.show()
3.直方图(频数/频率图):数值数据分布的精确图形表示,一般用横轴表示数据类型(数据是连续的,一个范围),纵轴表示分布情况,着重于整体的统计分布
1 x = 100 + 15 * np.random.randn(437) 2 plt.subplots() 3 # hist给定一个数组之类的对象,自动计算相关频数或频率 4 # bins表示分多少组,range表示显示的范围,align对齐方式left’, ‘mid’, ‘right,density表示True即求频率 5 plt.hist(x,bins=30, range=(50,140), density=1, align=u'left') 6 7 plt.show()
4.条形图:用宽度相同的条形的高度或长短来表示数据多少的图形,有横向和纵向两类,用于比较数据之间的差异
1 x = np.arange(6) 2 y1 = np.random.rand(6) 3 y2 = np.random.rand(6) 4 5 plt.subplots() 6 # bar条形图,x表示横轴,实际是柱型的对称中心位置,一般为类别,是具体的,孤立存在的,height表示纵轴,width表示宽度,color表示填充颜色, 7 plt.bar(x=x,height=y1,width=0.2,label='a') 8 plt.bar(x+0.3,y2,width=0.3,color='r',label='b') 9 10 # 添加数据标签 11 for a, b in zip(x, y1): 12 # ha: horizontal alignment 横向对齐 13 # va: vertical alignment 纵向对齐 14 plt.text(a + 0.4, b + 0.05, '%.2f' % b, ha='center', va='bottom') # 加注释,在离柱顶(0.4,0.05)处传入y值 15 plt.legend() 16 17 plt.figure() 18 # x= 起始位置, bottom=水平条的底部(左侧), y轴, height 水平条的宽度, width 水平条的长度 19 # plt.bar(x=1, bottom=y1, height=0.1, width=x, orientation="horizontal") 20 plt.barh(y1,x,height=0.01,) 21 plt.show()
5.饼图:表示各个数据的占比
1 labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' 2 sizes = [15, 30, 45, 10] 3 explode = (0, 0.1, 0, 0) 4 5 fig1, ax1 = plt.subplots() 6 # 饼图:labels饼图外侧显示的说明文字,explode表示每块离中心的距离,size表示每块的比例(自动归一化) 7 # autopct表示数字显示格式,shadow表示是否显示阴影,startangle绘制起始角度,90表示y轴正方形 8 # counterclock表示逆时针绘图 9 ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', 10 shadow=True, startangle=90,counterclock=True) 11 ax1.axis('equal') # 将饼图显示为正圆形 12 13 plt.show()
6.轮廓图(等高线图):可用于绘制梯度下降方法等
1 def f(x,y): 2 # the height function计算高度 3 return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2) 4 5 n = 256 6 x = np.linspace(-3, 3, n) 7 y = np.linspace(-3, 3, n) 8 X,Y = np.meshgrid(x, y) # 把x,y绑定为网格 9 10 # 使用contour来设置轮廓线(等高线):x和y轴,z轴的值,线的数,颜色,宽度... 11 C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidths=np.arange(.5, 4, .5)) 12 # 绘制等高线 13 plt.clabel(C, inline=True, fontsize=10,fmt='%1.1f') # 绘制等高线,是否在线里面,大小 14 15 # contourf填充颜色,cmap对应颜色,热颜色'hot'/’cold‘,,10:分为10+2=12部分 16 c_set = plt.contourf(X, Y, f(X, Y), 10, alpha=.75, cmap=plt.cm.hot) 17 18 19 # 设置颜色条,(显示在图片右边) 20 plt.colorbar(c_set) 21 22 plt.show()
7.imshow:将数据显示为图像;即在2维空间上,用数据(可以是实际的RGB(A)数据,也可以是2D标量数据数组、矩阵、表格等)来表示图像,再使用imshow来渲染成图像,注意:要实际显示灰度图像,请使用参数设置颜色映射 。
1 # 1.读取图片,将其转为numpy数组,有很多方式.. 2 import matplotlib.image as mpimg 3 img = mpimg.imread(r'E:python_workLeaningpic.jpg') 4 print(img.shape) # (310, 500, 3)二维grb ,3个通道 5 6 plt.subplot(3,3,1) 7 plt.imshow(img) 8 9 plt.subplot(3,3,2) 10 img2 = img[:, :, 0] # 伪彩色图,只选择一个通道 11 plt.imshow(img2) 12 plt.colorbar() # 色标参考 13 # 展示图片(origin:位置。。。)plt.colorbar(shrink=.92)#颜色对应参数,(压缩92%) 14 15 plt.subplot(3,3,3) 16 # camp颜色映射,hot表示热成像,还有 'binary', 'gist_yarg', 'gist_gray', 'gray', 'bone', 'pink','spring', 'summer', 17 # 'autumn', 'winter', 'cool', 'Wistia','hot', 'afmhot', 'gist_heat', 'copper','Greys', 'Purples', 'Blues', 18 # 'Greens', 'Oranges', 'Reds','YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu', 'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 19 # 'BuGn', 'YlGn'等 20 plt.imshow(img2, cmap="hot") 21 22 plt.subplot(3,3,4) 23 # 检查特定的数据范围,也就是检测像素的分布 24 plt.hist(img2.ravel(), bins=256, range=(0.0, 255.0), fc='k', ec='k') 25 26 plt.subplot(3,3,5) 27 # clim设定颜色的限制,用于增强图像(根据像素分布去除不重要的地方) 28 plt.imshow(img2, clim=(100, 200)) 29 plt.colorbar() # 色标参考 30 31 plt.subplot(3,3,6) 32 # interpolation插补,用于修正或改变图像像素的缺失,nearest近似原则,bicubic双三次模糊图像(常用),bilinear双线性(像素化) 33 plt.imshow(img, interpolation="nearest",origin='lower') 34 35 plt.subplot(3,3,7) 36 plt.imshow(img, interpolation="bicubic") 37 plt.show()
8.3d图:3d看起来像2d,但可以如matlab中那样通过旋转等方式观测不同角度的3d图
1 from mpl_toolkits.mplot3d import axes3d # 必要 2 z = np.linspace(-2, 2, 100) # 高度 3 x = (z**2 + 1) * np.sin(np.linspace(-4 * np.pi, 4 * np.pi, 100)) 4 y = (z**2 + 1) * np.cos(np.linspace(-4 * np.pi, 4 * np.pi, 100)) 5 6 fig = plt.figure() 7 8 # 关键在于创建一个3d画布 projection='3d', 9 # 像matlab那样旋转3d:在teminal中"python 当前文件名" 10 ax = fig.add_subplot(2,2,1, projection='3d') # 或者ax = fig.gca(projection='3d') 11 ax.plot(x, y, z) # 线图 12 13 ax = fig.add_subplot(2,2,2, projection='3d') 14 ax.scatter(x, y, z) # 散点图 15 16 ax = fig.add_subplot(2,2,3, projection='3d') 17 X, Y, Z = axes3d.get_test_data(0.05) 18 ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) # 线框图 19 20 ax = fig.add_subplot(2,2,4, projection='3d') 21 X = np.arange(-4, 4, 0.25) 22 Y = np.arange(-4, 4, 0.25) 23 X, Y = np.meshgrid(X, Y) # 构建网格点矩阵--必要-定义高度时需要x和y的对应 24 Z = np.sin(np.sqrt(X ** 2 + Y ** 2)) # 定义高度 25 # 绘制表面(x,y,z,行跨度,列跨度,颜色映射),跨度表示默认划分网格的几个小块作为一个整体 26 surface = ax.plot_surface(X, Y, Z,rstride=1, cstride=1, cmap=plt.get_cmap('rainbow')) 27 # 等高线(x,y,z,zdir=x表示从x轴压下去,即yz的投影,放在offset=-4的位置) 28 ax.contourf(X, Y, Z, zdir='x', offset=-4, cmap=plt.get_cmap('rainbow')) 29 ax.set_xlabel('X') 30 ax.set_ylabel('Y') 31 ax.set_zlabel('Z') 32 plt.show()
8.其他:
六.其他
1.填充fill、表示二维数组pcolormesh、对数图、极坐标图、plt.tight_layout()紧凑布局、颜色、文字、数学表达式等
2.plt.gca()获取当前画布,plt.gcf()获取当前窗口,得到对象,从而使用相关对象的函数,比如add_subplot()