• python数学建模--绘图动态可视化图表


    写在本博客的开篇

    本博客的灵感来源自笔者最近研究的最优化问题
    在使用模拟退火算法、遗传算法求二元函数最值的过程中,虽然笔者已经能够通过算法得到不错的结果,但是笔者还是比较好奇算法的执行过程中,变量是怎样更新的,显然可视化是一种很好的方法

    在上一篇博客【python数学建模–sympy三维图像绘制】中,笔者使用了sympy.plotting绘图类绘制了目标函数在约束条件下的三维图像,但是根据sympy官方的api,对于动态三维图像的绘制,plot3d()函数却爱莫能助,笔者遂尝试在matplolib绘图库中寻找答案

    很幸运,在查找遗传算法相关资料的时候看到了博主【includei】的博客【【Python】遗传算法求解二元函数最值】,在该博客中,博主不仅实现了遗传算法求解复杂二元函数的最值一过程,而且将算法中两个自变量x,y的更新过程在三维图像中动态的展示了出来,笔者阅后感到受益匪浅,在继续查找了若干篇关于matplotlib库绘制动态图的博客后,得到了下面一点小小的成果,遂决定将其分享出来

    关于matplotlib绘图的两种模式

    阻塞模式

    matplotlib的显示模式默认为阻塞(block)模式,当调用plt.show()函数显示图片时,程序会暂停运行,直到关闭图片之后,程序才会继续进行运行(打开一个窗口以后必须关掉才能打开下一个新的窗口)
    这就是与我们想要绘制动态图的目的相冲突的地方(动态图需要数据更新)

    交互模式

    从阻塞模式切换至交互模式,我们需要使用plt.ion()函数。
    切换到交互模式之后,程序在生成图片窗口之后会继续向下执行,而不会进入阻塞状态,这就为我们提供了数据更新的可能

    总结

    我们要想使用matplotlib库绘制动态图,就需要使用plt.ion()函数将绘图模式改为交互模式,在该模式下,我们可以绘制动态图像

    一些其他的函数

    函数名描述功能
    plt.ion()打开交互模式此时可以绘制动态图,也可以同时生成多个图片窗口
    plt.ioff()退出交互模式,打开交互模式后,必须使用该函数退出,否则生成的图片窗口只会一闪而过
    plt.clf()清除Figure对象
    plt.cla()清除Ax对象
    plt.pause()暂停常用于在‘绘图循环’中暂停

    绘制动态图的例子

    二维折线图

    结果演示

    在这里插入图片描述

    代码

    import matplotlib.pyplot as plt
    x = list(range(1, 21)) 
    loss = [2 / (i**2) for i in x]  
    plt.ion()# 打开交互模式
    
    
    plt.figure(figsize=(4.5,3))
    
    for i in range(1, len(x)):
        ix = x[:i]
        iy = loss[:i]
        plt.cla()#清除当前Axes对象
        plt.title("loss")
        plt.xlabel("epoch")
        plt.ylabel("loss")
        plt.plot(ix, iy)
        plt.pause(0.5)
    plt.ioff() # 关闭交互模式
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    本案例来自博主点PY的博客:plt.ion()画动态图

    三维折线图

    结果演示

    在这里插入图片描述

    代码

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    plt.ion()
    fig = plt.figure(figsize=(4.5,3)) # 生成画布
    ax = Axes3D(fig, auto_add_to_figure=False)  #实例化Axes3D对象,创建3D图像(注意:见下方注释)
    fig.add_axes(ax) # 手动将3D图像添加到画布对象上
    
    # 设置坐标轴范围
    ax.set_xlim3d(0, 20)
    ax.set_ylim3d(0, 20)
    ax.set_zlim3d(0, 50)
    
    for i in range(30):
        x = np.linspace(1, 20, 9)
        y = np.arange(10,19,1)
        z = np.random.randint(20, 50, 9)  # numpy分别生成三个维度数据
    
        ax.plot(x, y, z, 'gx--')
        plt.show()
        plt.pause(0.3)
    plt.ioff()
    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
    1. 本案例来自博主boboelec的博客:python Axes3D 三维动态折线图画法
    2. 注意:在创建3D图像时,如果使用ax = Axes3D(fig),将会报出下面警告:MatplotlibDeprecationWarning: Axes3D(fig) adding itself to the figure is deprecated since 3.4. Pass the keyword argument auto_add_to_figure=False and use fig.add_axes(ax) to suppress this warning. The default value of auto_add_to_figure will change to False in mpl3.5 and True values will no longer work in 3.6. This is consistent with other Axes classes.
      大概意思是说,在matplotlib库3.4版本之后,AXes3D自动添加到Figure画布对象中这一过程被弃用了,要想免除该警告,需要在实例化Axes3D时将其auto_add_to_figure参数设置为False,然后使用fig.add_axes(ax)手动将实例化的Axes3D对象添加到Figure画布中

    三维散点图

    结果演示

    在这里插入图片描述

    代码

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    plt.ion()
    fig = plt.figure(figsize=(4.5,3))
    ax = Axes3D(fig, auto_add_to_figure=False)  # 创建3D图像
    fig.add_axes(ax)
    
    ax.set_xlim3d(0, 20)  # 指定x轴坐标值范围
    ax.set_ylim3d(0, 20)  # 指定y轴坐标值范围
    ax.set_zlim3d(0, 100)  # 指定z轴坐标值范围
    
    for i in range(20):
        x = np.random.randint(0,20,20)
        y = np.random.randint(0,20,20)
        z = np.random.randint(0,100,20)  # numpy分别生成三个维度数据
    
        ax.scatter(x, y, z, 'go')  
        plt.show()
        plt.pause(0.3)
    plt.ioff()
    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
  • 相关阅读:
    useEffect、useMemo、useCallback使用场景分析
    Invertible Image Signal Processing 可逆图像信号处理
    重磅发布 , 阿里云全链路数据湖开发治理解决方案
    卷积神经网络 图像识别,卷积神经网络图像处理
    基于SSM的旅游网站系统
    gRPC服务的定义和服务的种类
    【TS】类和接口
    三.STM32F030C8T6 MCU开发之UART配置例程
    C++基础知识3
    linux下通过利用qcreator实现简单界面编程
  • 原文地址:https://blog.csdn.net/m0_54510474/article/details/127710220