zoukankan      html  css  js  c++  java
  • matplotlib动态绘图

    package

    import numpy as np
    import matplotlib
    import matplotlib.pyplot as plt
    import matplotlib.font_manager as fm
    from mpl_toolkits.mplot3d import Axes3D
    

    Process

    在matplotlib中画图有两种显示模式:

    (1)阻塞模式,即必须利用plt.show()显示图片,且图片关闭之前代码将阻塞在该行。

    (2)交互模式,即plt.plot()后立马显示图片,且不阻塞代码的继续运行。

    Matplotlib中默认是使用阻塞模式。看一下这里用到的matplotlib中的几个函数:

    plt.ion():打开交互模式
    plt.ioff():关闭交互模式
    plt.clf():清除当前的Figure对象
    plt.cla():清除当前的Axes对象
    plt.pause():暂停功能
    

    若只利用plt.show()绘图时,程序会停止执行之后的程序,所以通过plt.ion()开启画图窗口进入交互模式,利用程序plt.plot()实时绘图,中间会有暂停绘制完成后,再利用plt.ioff()退出交互模式,并使用plt.show()显示最后的图片数据,若最后不加入plt.show()会闪退

    解决中文乱码问题

    myfont = fm.FontProperties(fname="/Library/Fonts/Songti.ttc", size=14)
    matplotlib.rcParams["axes.unicode_minus"] = False
    

    simple_plot()

    two curve are fitting

    def simple_plot():
        """
        simple plot
        """
        # 生成画布
        plt.figure(figsize=(8, 6), dpi=80)
    
        # 打开交互模式
        plt.ion()
    
        # 循环
        for index in range(100):
            # 清除原有图像
            plt.cla()
    
            # 设定标题等
            plt.title("动态曲线图", fontproperties=myfont)
            plt.grid(True)
    
            # 生成测试数据
            x = np.linspace(-np.pi + 0.1*index, np.pi+0.1*index, 256, endpoint=True)
            y_cos, y_sin = np.cos(x), np.sin(x)
    
            # 设置X轴
            plt.xlabel("X轴", fontproperties=myfont)
            plt.xlim(-4 + 0.1*index, 4 + 0.1*index)
            plt.xticks(np.linspace(-4 + 0.1*index, 4+0.1*index, 9, endpoint=True))
    
            # 设置Y轴
            plt.ylabel("Y轴", fontproperties=myfont)
            plt.ylim(-1.0, 1.0)
            plt.yticks(np.linspace(-1, 1, 9, endpoint=True))
    
            # 画两条曲线
            plt.plot(x, y_cos, "b--", linewidth=2.0, label="cos示例")
            plt.plot(x, y_sin, "g-", linewidth=2.0, label="sin示例")
    
            # 设置图例位置,loc可以为[upper, lower, left, right, center]
            plt.legend(loc="upper left", prop=myfont, shadow=True)
    
            # 暂停
            plt.pause(0.1)
    
        # 关闭交互模式
        plt.ioff()
    
        # 图形显示
        plt.show()
        return
    # simple_plot()
    

    scatter_plot()

    def scatter_plot():
        """
        scatter plot
        """
        # 打开交互模式
        plt.ion()
    
        # 循环
        for index in range(50):
            # 清除原有图像
            # plt.cla()
    
            # 设定标题等
            plt.title("动态散点图", fontproperties=myfont)
            plt.grid(True)
    
            # 生成测试数据
            point_count = 5
            x_index = np.random.random(point_count)
            y_index = np.random.random(point_count)
    
            # 设置相关参数
            color_list = np.random.random(point_count)
            scale_list = np.random.random(point_count) * 100
    
            # 画散点图
            plt.scatter(x_index, y_index, s=scale_list, c=color_list, marker="o")
    
            # 暂停
            plt.pause(0.2)
    
        # 关闭交互模式
        plt.ioff()
    
        # 显示图形
        plt.show()
        return
    # scatter_plot()
    

    three_dimension_scatter()

    def three_dimension_scatter():
        """
        3d scatter plot
        """
        # 生成画布
        fig = plt.figure()
    
        # 打开交互模式
        plt.ion()
    
        # 循环
        for index in range(50):
            # 清除原有图像
            fig.clf()
    
            # 设定标题等
            fig.suptitle("三维动态散点图", fontproperties=myfont)
    
            # 生成测试数据
            point_count = 100
            x = np.random.random(point_count)
            y = np.random.random(point_count)
            z = np.random.random(point_count)
            color = np.random.random(point_count)
            scale = np.random.random(point_count) * 100
    
            # 生成画布
            ax = fig.add_subplot(111, projection="3d")
    
            # 画三维散点图
            ax.scatter(x, y, z, s=scale, c=color, marker=".")
    
            # 设置坐标轴图标
            ax.set_xlabel("X Label")
            ax.set_ylabel("Y Label")
            ax.set_zlabel("Z Label")
    
            # 设置坐标轴范围
            ax.set_xlim(0, 1)
            ax.set_ylim(0, 1)
            ax.set_zlim(0, 1)
    
            # 暂停
            plt.pause(0.2)
    
        # 关闭交互模式
        plt.ioff()
    
        # 图形显示
        plt.show()
        return
    # three_dimension_scatter()
    

    Jupyter notebook

    有些时候matplotlib 的绘图没法显示在notebook中,或者显示不了。这与backend有关。

    首先启动你的notebook,输入

    %pylab
    查看你的matplotlib后端,我的输出为:

    Qt5Agg
    这是后端的渲染方式,使用的是qt5渲染。激活方式为在绘图之前插入代码段:

    %matplotlib qt5
    这样就能显示出图,但是是显示在notebook之外的,如果我使用%matplotlib inline,图的显示并不正常。如果你输出的后端为其他类型,建议查看下面的资料,直接输入对应的绘图激活方式。

    matplotlib 常用backend

    Reference: jupyter notebook matplotlib绘制动态图并显示在notebook中

  • 相关阅读:
    java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml'
    generate failed: Cannot resolve classpath entry: mysql-connector-java-5.1.38.jar
    Spring boot 零配置开发微服务
    【ABAP系列】SAP ABAP BAPI_REQUISITION_CREATE创建采购申请
    【ABAP系列】SAP ABAP 字符编码与解码、Unicode
    【ABAP系列】ABAP CL_ABAP_CONV_IN_CE
    【Fiori系列】浅谈SAP Fiori的设计美感与发展历程
    【Fiori系列】为什么SAP Fiori活的如此精致
    【ABAP系列】SAP ABAP下载带密码的Excel文件
    【ABAP系列】SAP ABAP 高级业务应用程序编程(ABAP)
  • 原文地址:https://www.cnblogs.com/icodeworld/p/11296575.html
Copyright © 2011-2022 走看看