失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python_matplotlib绘制三维空间动态图两种方法

python_matplotlib绘制三维空间动态图两种方法

时间:2022-06-08 08:41:27

相关推荐

python_matplotlib绘制三维空间动态图两种方法

最近利用python想绘制三维点的空间轨迹的增长的一个动图,于是到处去搜索好的方法。

想到两个办法,一是不断的刷新绘图曲的fig,每刷新一次就加入新增点的位置信息,但是没成功,可能是内存占用太大。

第一种办法就是参考了博客的二维gif图代码。

在他的基础上导入三维绘图包就可以了。

from mpl_toolkits.mplot3d import Axes3D

方法一:利用FuncAnimation函数不断调用更新的数据

下面给出代码:

import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib.animation import FuncAnimationimport numpy as npfig=plt.figure(figsize=(10,10))ax1 = Axes3D(fig)ax1.plot3D([0,1],[0,1],[0,1], 'red')x_track = np.zeros((1, 3))x_track_s = np.array([.0,.0,.0])theta = 0def gen_path():global x_track_s,x_track,thetatheta += 10*np.pi/180x = 6*np.sin(theta)y = 6*np.cos(theta)x_track_s +=[x,y,0.1]x_track = np.append(x_track, [x_track_s],axis=0)return x_trackdef update(i):label = 'timestep {0}'.format(i)print(label)# 更新直线和x轴(用一个新的x轴的标签)。# 用元组(Tuple)的形式返回在这一帧要被重新绘图的物体x_track = gen_path()ax1.set_xlabel(label)ax1.plot3D(x_track[:, 0], x_track[:, 1], x_track[:, 2], 'blue')return ax1if __name__ == '__main__':# FuncAnimation 会在每一帧都调用“update” 函数。# 在这里设置一个10帧的动画,每帧之间间隔200毫秒anim = FuncAnimation(fig, update, frames=np.arange(0, 10), interval=200)if len(sys.argv) > 1 and sys.argv[1] == 'save':anim.save('line.gif', dpi=80, writer='imagemagick')else:# plt.show() 会一直循环播放动画plt.show()

楼主是0.01基础代码学者,所以代码中肯定有一些不合理的内存浪费等等,还请见谅。运行效果:

方法二:利用matplotlib.pyplot中的的plt.ion()打开交互模式,进而实时更新figure中的图像。

第二种方法参考了博客

下面给出代码

#!/usr/bin/env python# -*- coding: utf-8 -*-import mathimport numpy as npimport matplotlib.pyplot as pltfrom itertools import countfrom mpl_toolkits.mplot3d import Axes3Dx_track = np.zeros((1, 3))x_track_s = np.array([.0,.0,.0])theta = 0def gen_path(): # 生成螺旋global x_track_s,x_track,thetatheta += 10*np.pi/180x = 6*np.sin(theta)y = 6*np.cos(theta)x_track_s +=[x,y,0.1]x_track = np.append(x_track, [x_track_s],axis=0)return x_trackax = plt.axes(projection = '3d')ax.set_xlabel('x')ax.set_ylabel('y')ax.set_title('3d_mobile_obs')#ax.set_xlim([0,70])#ax.set_ylim([-60,-70])plt.grid(True)plt.ion() # interactive mode on!!!! 很重要,有了他就不需要plt.show()了for t in count():if t == 2500:break# plt.cla() # 此命令是每次清空画布,所以就不会有前序的效果ax.plot3D(x_track[:, 0], x_track[:, 1], x_track[:, 2], 'blue')x_track = gen_path()plt.pause(0.001)

如果觉得《python_matplotlib绘制三维空间动态图两种方法》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。