• matplotlib你真的明白plt,fig和ax吗


    你真的明白plt,fig和ax吗?

    plt系列接口是用来模仿MATLAB的风格的。如果用户熟悉MATLAB,还是建议以plt为主的。对于基本的画图,plt系列足够了。
    个人觉得,真正不合适的用法,反而是各种混淆plt接口和其它更细节的内部接口函数,混杂着用,成了四不像。
    学习matplotlib的过程和其它包应该有所区别:如果每次打开CSDN一顿搜索,是很难掌握matplotlib的,因为matplotlib一个相同的功能实现方式很多:
    plt.title()ax.title.set_text('title')ax.set_title()居然是相同的,如下图:

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.style.use('_mpl-gallery')
    
    # make data
    np.random.seed(1)
    x = np.linspace(0, 8, 16)
    y1 = 3 + 4*x/8 + np.random.uniform(0.0, 0.5, len(x))
    y2 = 1 + 2*x/8 + np.random.uniform(0.0, 0.5, len(x))
    
    # plot
    fig, ax = plt.subplots(1, 3, figsize=(12, 4))
    
    for i in range(3):
        ax[i].fill_between(x, y1, y2, alpha=.5, linewidth=0)
        ax[i].plot(x, (y1 + y2)/2, linewidth=2)
    
        ax[i].set(xlim=(0, 8), xticks=np.arange(1, 8),
               ylim=(0, 8), yticks=np.arange(1, 8))
        plt.title('plt.title')
        ax[0].set_title('ax.set_title')
        ax[1].title.set_text('ax.title.set_text') 
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    这就表明如果每次都要手动搜索的话,会非常不确定,因为一种效果有完全不同的实现方式,这次搜到这个,下次搜到那个:
    笔者在初学的时候,碰见在figure, axes, axis这几个词就头大

    plt vs ax

    尝试区分.plt和ax.plot,为什么matplotlib能用不同方式来实现同一功能?
    在底层逻辑上,matplotlib架构上分为两层:底层和高层。高层是底层的封装,现在可以加一个最高层seaborn,cartopy等等…
    在任意一层操作都能够实现画图的目的,而且画出来是一样的。但越底层的操作越细节,越高层越易于人机交互。
    (如最高层searborn,几行代码就行了。最底层ax,反复调节各种轴)
    .plt 对应的就是最高层,这就是为什么它简单上手,但要调细节就不方便了。
    ax.plot是底层,基本上可以实现任何细节的调试。

    看matplotlib官方提供的图绘说明:

    • Figure是“画布”,画图的第一件事,就是创建一个画布figure,加各种元素
    • axes是“坐标系”,这个命名不太准确,不仅是坐标轴的复数,它应该是物理中“坐标系”的概念,或工程制图中“图纸”的概念,它保证了你在图中画多个物体,这多个物体能在同一个坐标系中。axes包含大部分图像元素,比如坐标轴,标签,注释文字,刻度线等等
    • Axis是“坐标轴”,每个坐标轴上包括下列元素:

    right plot way

    正确的画图方式是fig, ax = plt.subplots(),虽然大多数教程以plt.xxx开始,这虽然好上手,但是不便于对代码的理解

    #手搓数据
    import matplotlib.pyplot as plt
    import numpy as np
    # make data: correlated + noise
    np.random.seed(1)
    x = np.random.randn(5000)
    y = 1.2 * x + np.random.randn(5000) / 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ax与plt大部分是通用的,因为我们用了“正统”的画图方式,为了避免混淆,全用ax

    # plot:
    fig, ax = plt.subplots()
    
    ax.hexbin(x, y, gridsize=20)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    用ax调节细节:
    xlim,xlablegrid都是ax这一层的

    fig, ax = plt.subplots(figsize=(3, 3))
    
    ax.hexbin(x, y, gridsize=20, cmap='BuPu')
    ax.set(xlim=(-2, 2), ylim=(-3, 3))
    ax.set_xlabel('thisisx', fontsize=12, fontfamily='sans-serif',fontstyle='italic')
    ax.set_ylabel('thisisy', fontsize='x-large',fontstyle='oblique')
    ax.grid(color='lightgrey', linestyle='--', linewidth=1)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    最后是坐标轴tick和细节,这个在axes.xaxis或者axes.yaxis上完成。

    fig, ax = plt.subplots(figsize=(3, 3))
    
    ax.hexbin(x, y, gridsize=20, cmap='BuPu')
    ax.set(xlim=(-2, 2), ylim=(-3, 3))
    ax.set_xlabel('thisisx', fontsize=12, fontfamily='sans-serif',fontstyle='italic')
    ax.set_ylabel('thisisy', fontsize='x-large',fontstyle='oblique')
    ax.grid(color='lightgrey', linestyle='--', linewidth=1)
    
    ax.xaxis.set_tick_params(rotation=45,labelsize=12,colors='saddlebrown') 
    start, end = ax.get_xlim() 
    ax.xaxis.set_ticks(np.arange(start, end,1)) 
    ax.yaxis.tick_right()
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这样就完成对matplotlib的所有操作了

    后台回复【matplotlib】可以领取速查表:

    image-20221127103703719

    image-20221127103713773

  • 相关阅读:
    【车牌识别】基于BP神经网络实现车牌识别(带语音播报)含Matlab源码
    Easyexcel·读取excel
    Linux:Centos9 《下载-安装》
    什么是抽象类?什么时候用?什么是接口?抽象类与接口的区别?
    高效的开发流程搭建,kaggle提交流程示范
    Java实战---拼图游戏
    智能工厂落地的三种模式,你了解多少?
    兴趣爱好是否可以发展为自己的职业?
    webpack的热重载/热更新HMR是如何实现的
    Jenkins | 流水线构建使用expect免密交互时卡住,直接退出
  • 原文地址:https://blog.csdn.net/wlh2067/article/details/128081514