yu-liang

一.简介

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

 

分类:

技术点:

相关文章:

  • 2021-04-11
  • 2021-09-20
  • 2021-10-19
  • 2021-05-12
  • 2021-07-09
  • 2022-12-23
  • 2022-01-07
猜你喜欢
  • 2022-12-23
  • 2021-07-09
  • 2021-09-16
  • 2022-12-23
  • 2021-05-28
  • 2021-11-27
  • 2021-11-27
相关资源
相似解决方案