• matplotlib入门之抛砖引玉


    鉴于以往使用matplotlib都是百度来的,一旦自己上手就无能为力,所以这次简单入门一下matplotlib,搞清楚基本概念和基础用法。之所以又叫抛砖引玉是因为matplotlib比较太强,不可能总结的完,所以主要针对常用而进行的总结,如果能够基本了解,后面遇到更高要求百度一下函数的参数啊之类的,就可以制作更高端的效果。

    1、基本概念

    在使用matplotlib时需要了解figure和axes两个概念。figure就是一张画布,没有任何内容的画布。axes不好解释,它是轴axis的复数形式,意味着axes是一套坐标轴,一套坐标就包括了标题、轴名、样式等等。

    所以我们画图都是先建一个figure,然后再建一个axes,然后在axes上绘制曲线、设置title、设置样式等(实际上很多代码都是直接plt.xxx开始画,这可以理解为高级API,都自动帮你处理了,但是遇到复杂一点的可能就没那么灵活了,所以建议还是按上面这种最佳实践方法来写)。
    在这里插入图片描述

    2、新建一个简单的demo

    首先是构建figure和axes,一般有三种方式:

    fig=plt.figure()  # 新建一个空figure,没有axes
    fig,ax=plt.subplots()  # 新建一个有axes的figure
    
    #新建一个有2*2个格子的axes的figure。比如这里fig就是整个图,而ax有4个子元素,每个元素代表一个格子让我们绘图
    fig,ax1=plt.subplots(2,2)  
    

    (plt.xxx简单但是不灵活,建议不要这么写)

    比如在一个figure上划分两个Axes,一个画sin函数图,一个画cos函数图。

    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, ax = plt.subplots(1, 2)	# 将Axes划分为1*2个格子
    
    x = np.arange(0, 10, 0.1)
    sin = np.sin(x)
    cos = np.cos(x)
    
    ax[0].plot(x, sin)  # 格子1绘制sin函数
    ax[1].plot(x, cos)  # 格子2绘制cos函数
    
    plt.show()  # 显式(在后面会介绍为什么要show)
    '
    运行

    在这里插入图片描述

    3、“美化”

    从2中我们绘制了一个图,但是信息太少了,什么title、style都没有。但是一个图有很多属性,比如轴、间距、标题等等,具体它们是指什么?设置他们的方法又是什么?
    在这里插入图片描述
    从上图我们就得到一些常用的诸如轴名、标题、图例等样式的设置。

    总体来说可以分为两种,一种是针对Axes的,比如坐标轴需要设置标题、轴名、控制轴间距范围等等;另一种是针对图(也就是根据数据画的线条等)需要设置颜色、样式等等

    针对Axes

    # 比如
    axes.Axes.set_xlim()和axes.Axes.set_ylim()  # 手动设置值域范围
    axes.Axes.set_title()  # 标题
    axes.Axes.set_xlabel()和axes.Axes.set_ylabel()  # 轴名
    ......
    

    针对图
    这部分主要是设置颜色、标记、线条样式等。

    先看例子,下图是ax[1].plot(x, cos,'r-.v')的绘制效果,在这里'r-.v'就是规定了线条为红色+点划线+节点用倒三角表示,其实就是颜色字符+线型字符+标记字符的组合。
    在这里插入图片描述

    • 颜色字符:‘b’ 蓝色,‘m’ 洋红色,‘g’ 绿色,‘y’ 黄色,‘r’ 红色,‘k’ 黑色,‘w’ 白色,‘c’ 青绿色,‘#008000’ RGB 颜色符串。多条曲线不指定颜色时,会自动选择不同颜色
    • 线型参数:‘‐’ 实线,‘‐‐’ 破折线,‘‐.’ 点划线,‘:’ 虚线
    • 标记字符:‘.’ 点标记,‘,’ 像素标记(极小点),‘o’ 实心圈标记,‘v’ 倒三角标记,‘^’ 上三角标记,‘>’ 右三角标记,‘<’ 左三角标记

    注意线型参数和标记字符联合决定线条样式,如果都不指定则采用模型线条,如果只指定标记字符则不显式线型(也就是如果fmt指定为’o’,则图形只有节点没有连线,就成了散点图)

    更多fmt以及复杂的属性设定:

    综合上面针对Axes和图的“美化”,一个demo如下:

    		import matplotlib.pyplot as plt
    		import numpy as np
    		
    		fig, ax = plt.subplots(1, 2) # 创建一个带Axes的fig,并划分为两个格子
    		
    		x = np.arange(0, 10, 0.1)
    		sin = np.sin(x)
    		cos = np.cos(x)
    		
    		# ax[0] 表示格子1
    		ax[0].plot(x, sin,'o')    # 表示为蓝色-实现-节点用实心圈表示
    		ax[0].set_title("sin function")  # 设置标题
    		ax[0].set_xlabel("x axis")  # 设置x轴名
    		ax[0].set_ylabel("y axis")  # 设置y轴名
    		
    		ax[1].plot(x, cos,'r-.v')   # 表示为 红色-点划线--节点用倒三角表示
    		ax[1].set_title("cos function")
    		ax[1].set_xlabel("x axis")
    		ax[1].set_ylabel("y axis")
    		
    		plt.show()
    
    

    4、如何在一个Axes同时画多个曲线

    简单,遵循一个函数:plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
    比如:

    ax[0].plot(x, sin,'o',x,cos,'r-.v') # 依次画sin和cos函数图像
    

    在这里插入图片描述
    (实际上调用两次plot也行)

    5、数据类型

    上面说了这么多,那么能够plot的数据类型是什么?

    • ndarray
    • list(其实是自动转ndarray)

    6、plt在jupyter和pycharm中使用的区别

    经验发现,plt在jupyter和pycharm中使用有所不同,主要是显示方法上的不同。比如pycharm必须要加plt.show()才能正常显示。

    这里主要是object-oriented interface和pyplot interface的区别:

    • OO interface:显式创建figure和axes,然后调用这些对象的方法
    x = np.linspace(0, 2, 100)
    
    # Note that even in the OO-style, we use `.pyplot.figure` to create the figure.
    fig, ax = plt.subplots()  # Create a figure and an axes.
    ax.plot(x, x, label='linear')  # Plot some data on the axes.
    ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes...
    ax.plot(x, x**3, label='cubic')  # ... and some more.
    ax.set_xlabel('x label')  # Add an x-label to the axes.
    ax.set_ylabel('y label')  # Add a y-label to the axes.
    ax.set_title("Simple Plot")  # Add a title to the axes.
    ax.legend()  # Add a legend.
    
    • pyplot interface:靠pyplot自动创建和管理axes,然后使用pyplot函数画图。(所以很多plt都没有创建figure和axes也能运行)
    x = np.linspace(0, 2, 100)
    
    plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
    plt.plot(x, x**2, label='quadratic')  # etc.
    plt.plot(x, x**3, label='cubic')
    plt.xlabel('x label')
    plt.ylabel('y label')
    plt.title("Simple Plot")
    plt.legend()
    

    正因为这些区别,pyplot interface通常用在交互式比如jupyter这种里面,而OO interface用在非交互式比如pycharm这种直接在函数里或代码里使用。

    show()
    在非交互式模式中,所有的行为都是delay的,要等show函数之后才执行。show函数能够被调用多次,等上一个窗口关闭后才显式下一张图片:

    import numpy as np
    import matplotlib.pyplot as plt
    
    plt.ioff()
    for i in range(3):
        plt.plot(np.random.rand(10))
        plt.show()
    '
    运行

    7、显示图片

    上面都是在绘制曲线等使用,但是我们还可以使用plt来显示图片。

    主要使用plt.imshow()来显示图像,参数如下:

    plt.imshow(X,
               cmap=None,
               norm=None,
               ......
              )
    

    7.1 参数:X

    标量数据(意味着不能是tensor?),可以是RGB(A)的3D或4D数据,也可以是2D数据(默认伪彩色显示)。支持的数组形状包括: (W,H)、(W,H,3)、 (W,H,4)(通道后置)。

    数据类型为0~1的浮点数或者0~255的整型数

    注意伪彩色:对于2D的灰度图使用了cmap来控制显示色彩,如果直接显示,会显示伪彩色图的图像(默认cmap=“viridis”)。
    在这里插入图片描述

    对于RGB和RGBA则忽略cmap,正常显示。所以如果像显示灰度图则需要修改cmap='gray'或者cmap=plt.cm.gray
    在这里插入图片描述

    7.2 参数:cmap

    在7.1中已经有所了解,plt中有很多种cmap,在color example code: colormaps_reference.py,并且你可以在Source code运行,会可视化出各种cmap样式,供你选择,图例代表最左侧值=0,最右侧值=1(或者uint8的255),所以你图中像素值接近0的就显示左侧的颜色,像素值接近1的就显示右侧的颜色
    在这里插入图片描述

    比如会灰度图像换上’bwr’(从图例看出越黑颜色越蓝,月亮颜色越红,中间亮度则越白)的cmap样式:
    在这里插入图片描述

    7.3 参数:norm

    该参数用于在进行cmap颜色映射前,将输入data缩放到[0,1]之间。默认使用线性缩放:将最小值映射为0,最大值映射为1.

    当然也可以指定比如’linear’,'log’等其他映射变换方式。

  • 相关阅读:
    [量子计算与量子信息] 2.1 线性代数
    刷近两年新低 人民币汇率破7 意味着什么
    基于ANSYS Twin Builder连杆结构数字孪生体建模关键技术及应用
    配置OSPF包文分析和验证
    Windows命令--管理类
    【springcloud】一些项目结构模式
    【探花交友】注册登录需求分析、短信验证码
    【Visual Leak Detector】源码文件概览
    【Pytorch Lighting】第 4 章:Lightning Flash 中的即食模型
    反射填充详解ReflectionPad2d(padding)
  • 原文地址:https://blog.csdn.net/qq_40243750/article/details/127037316