当前位置:   article > 正文

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

python 实时 三维 动图

最近利用 python 想绘制三维点的空间轨迹的增长的一个动图,于是到处去搜索好的方法。
想到两个办法,一是不断的刷新绘图曲的fig,每刷新一次就加入新增点的位置信息,但是没成功,可能是内存占用太大。
第一种办法就是参考了博客的二维gif图代码。
在他的基础上导入三维绘图包就可以了。

from mpl_toolkits.mplot3d import Axes3D
  • 1

方法一:利用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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

楼主是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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/115556
推荐阅读
相关标签
  

闽ICP备14008679号