当前位置:  开发笔记 > 编程语言 > 正文

Matplotlib 3D散射动画

如何解决《Matplotlib3D散射动画》经验,为你挑选了1个好方法。



1> ImportanceOf..:

3D中的散点图是一个mpl_toolkits.mplot3d.art3d.Path3DCollection对象.这提供了一个_offsets3d托管元组的属性,(x,y,z)可用于更新散点的坐标.因此,不在动画的每次迭代中创建整个绘图可能是有益的,而是仅更新其点.

以下是如何执行此操作的工作示例.

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation
import pandas as pd


a = np.random.rand(2000, 3)*10
t = np.array([np.ones(100)*i for i in range(20)]).flatten()
df = pd.DataFrame({"time": t ,"x" : a[:,0], "y" : a[:,1], "z" : a[:,2]})

def update_graph(num):
    data=df[df['time']==num]
    graph._offsets3d = (data.x, data.y, data.z)
    title.set_text('3D Test, time={}'.format(num))


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
title = ax.set_title('3D Test')

data=df[df['time']==0]
graph = ax.scatter(data.x, data.y, data.z)

ani = matplotlib.animation.FuncAnimation(fig, update_graph, 19, 
                               interval=40, blit=False)

plt.show()

该解决方案不允许blitting.但是,根据使用情况,可能根本不需要使用散点图; 使用法线plot可能同样可能,允许blitting - 如下例所示.

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation
import pandas as pd


a = np.random.rand(2000, 3)*10
t = np.array([np.ones(100)*i for i in range(20)]).flatten()
df = pd.DataFrame({"time": t ,"x" : a[:,0], "y" : a[:,1], "z" : a[:,2]})

def update_graph(num):
    data=df[df['time']==num]
    graph.set_data (data.x, data.y)
    graph.set_3d_properties(data.z)
    title.set_text('3D Test, time={}'.format(num))
    return title, graph, 


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
title = ax.set_title('3D Test')

data=df[df['time']==0]
graph, = ax.plot(data.x, data.y, data.z, line, marker="o")

ani = matplotlib.animation.FuncAnimation(fig, update_graph, 19, 
                               interval=40, blit=True)

plt.show()


这是个好的观点.上层解决方案使用`_offsets3d`这是一个私有方法(由前面的`_`表示).那些没有记录.只有通过查看[源代码](https://github.com/matplotlib/matplotlib)或在线查找用法示例,才能找到它们.如果文档没有提供解决方案,我经常发现查看源代码很有帮助.不要忘记,像你一样问一个特定的问题也有助于找到像`_offsets3d`这样的隐藏宝石.;-)但是,由于私有函数也可能在版本之间发生变化,因此通常应避免使用它们.
推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有