matplotlib-3.2.1

一.简介

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()
plt接口

 

 

三. 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()
pyplot1

 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()
pyplot2

 

四.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_work\Leaning\pic.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()
imshow

 

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()
3d

 

8.其他:

 

 六.其他

1.填充fill、表示二维数组pcolormesh、对数图、极坐标图、plt.tight_layout()紧凑布局、颜色、文字、数学表达式等

2.plt.gca()获取当前画布,plt.gcf()获取当前窗口,得到对象,从而使用相关对象的函数,比如add_subplot()

 

posted on 2020-06-15 17:35  温润有方  阅读(403)  评论(0编辑  收藏  举报