使用 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