赞
踩
最近利用 python 想绘制三维点的空间轨迹的增长的一个动图,于是到处去搜索好的方法。
想到两个办法,一是不断的刷新绘图曲的fig,每刷新一次就加入新增点的位置信息,但是没成功,可能是内存占用太大。
第一种办法就是参考了博客的二维gif图代码。
在他的基础上导入三维绘图包就可以了。
from mpl_toolkits.mplot3d import Axes3D
方法一:利用FuncAnimation函数不断调用更新的数据
下面给出代码:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.animation import FuncAnimation import numpy as np fig=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 = 0 def gen_path(): global x_track_s,x_track,theta theta += 10*np.pi/180 x = 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_track def 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 ax1 if __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 math import numpy as np import matplotlib.pyplot as plt from itertools import count from mpl_toolkits.mplot3d import Axes3D x_track = np.zeros((1, 3)) x_track_s = np.array([.0,.0,.0]) theta = 0 def gen_path(): # 生成螺旋 global x_track_s,x_track,theta theta += 10*np.pi/180 x = 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_track ax = 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。