使用 matplotlib 显示3D动画 郝伟 2021/03/15 [TOC]

1. 简介

在AI学习中,为了进行数据展示,需要进行一定的图形显示。可以使用 matplotlib 中的 mpl_toolkits.mplot3d 库进行显示。

2. 示例代码

#encoding=utf-8
"""
创建日期:2021/03/15 
作者信息:郝伟老师
功能简介:不断旋转的3D效果动画。
"""

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import time, threading

def on_close(event): 
    ax.__dict__["done"]=1

if __name__ == '__main__': 
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    X, Y, Z = axes3d.get_test_data(0.1)
    ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5) 

    t0 = time.time() 
    for angle in range(0, 1360):
        if time.time() - t0 > 10: # 显示10秒 
            break
        ax.view_init(20, angle*.2)
        plt.draw()
        plt.pause(.001)

3. 显示效果

图像会随着时间变化而转动。以下两张图片是不同时刻的截图,可见画面的一定的旋转角度的区别。

4. 窗体无法关闭的问题

关于窗体的关闭,这里有这个一个问题需要注意:由于 plt.draw() 的持续更新,会导致窗体一直刷新,所以即使用户点击了窗体的关闭按键,窗体也无法关闭不了。

5. 解决办法

首先,添加窗体关闭事件的响应函数: fig.canvas.mpl_connect('close_event', on_close)

并编写事件处理代码:

def on_close(event): 
    ax.__dict__["done"]=1

这样在窗体处理完成后,就会在ax的字典中添加一个 {'done': 1} 键值。

最后,在循环中对这对键值进行检测,存在则退出。

修改后的代码如下。问题解决。

#encoding=utf-8
"""
创建日期:2021/03/15 
作者信息:郝伟老师
功能简介:不断旋转的3D效果动画,添加了窗体关闭相应处理代码。
"""

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import time, threading

def on_close(event): 
    ax.__dict__["done"]=1

if __name__ == '__main__':
    # 创建画面
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    # 加载并显示数据
    X, Y, Z = axes3d.get_test_data(0.1)
    ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5)

    # 定义关闭事件
    fig.canvas.mpl_connect('close_event', on_close)

    # 也可以使用 lambda 表达式,直接调用窗体销毁函数
    # fig.canvas.mpl_connect('close_event', lambda _: fig.canvas.manager.window.destroy())

    # 旋转并更新
    t0 = time.time() 
    for angle in range(0, 1360):
        if 'done' in ax.__dict__ or time.time() - t0 > 10: # 显示10秒
            print("stopped.")
            break
        ax.view_init(20, angle*.2)
        plt.draw()
        plt.pause(.001)

6. 补充

另外,可以对于一个熟悉的的对象,可以使用 dir, vars, help 等函数进行研究,具体可以参见[2].

7. 参考文献

[1] Close event, matplotlib, https://matplotlib.org/stable/gallery/event_handling/close_event.html [2] 如何查看Python对象的属性, https://www.cnblogs.com/klchang/p/7296058.html

results matching ""

    No results matching ""