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

  • 相关阅读:
    REDIS缓存穿透,缓存击穿,缓存雪崩
    spring 自动装配
    SpringBoot @Condition
    【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
    【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法
    【Azure 环境】基于Azure搭建企业级内部站点, 配置私有域名访问的详细教程 (含演示动画)
    【Azure Function】Function App和Powershell 集成问题, 如何安装PowerShell的依赖模块
    【Azure 应用服务】Python3.7项目在引用pandas 模块后,部署报错 
    【Azure 应用服务】部署Azure Web App时,是否可以替换hostingstart.html文件呢?
    【Azure 应用服务】添加自定义域时,Domain ownership 验证无法通过 
  • 原文地址:https://www.cnblogs.com/yu-liang/p/13058205.html
Copyright © 2020-2023  润新知