当前位置: 首页 > 面试题库 >

Matplotlib 3D散点动画

亢胤运
2023-03-14
问题内容

我正在绘制星团中的位置,我的数据在具有x,y,z位置以及时间索引的数据框中。

我能够生成3d散点图,并试图生成旋转图-我虽然取得了一些成功,但是却在动画API方面苦苦挣扎。

如果我的“
update_graph”函数仅返回一个新的ax.scatter(),则除非我重建整个图,否则旧图将保持绘制状态。看来效率低下。同样,我必须将间隔设置得很高,否则我的动画每隔一帧就会“跳过”,所以这表示我的表现很差。最后,由于无法获得3D散点图的迭代器,我被迫使用“
blit = False”。显然“ graph.set_data()”不起作用,我可以使用“
graph.set_3d_properties”,但这只允许我使用新的z坐标。

所以我将一个簇集在一起-(我使用的数据在 https://www.kaggle.com/mariopasquato/star-cluster-
simulations
滚动到底部)

我也只画了100个点(data = data [data.id <100])

我的(工作)代码如下:

def update_graph(num):
     ax = p3.Axes3D(fig)
     ax.set_xlim3d([-5.0, 5.0])
     ax.set_xlabel('X')
     ax.set_ylim3d([-5.0, 5.0])
     ax.set_ylabel('Y')
     ax.set_zlim3d([-5.0, 5.0])
     ax.set_zlabel('Z')
     title="3D Test, Time="+str(num*100)
     ax.set_title(title)
     sample=data0[data0['time']==num*100]
     x=sample.x
     y=sample.y
     z=sample.z
     graph=ax.scatter(x,y,z)
     return(graph)

fig = plt.figure()
ax = p3.Axes3D(fig)

# Setting the axes properties
ax.set_xlim3d([-5.0, 5.0])
ax.set_xlabel('X')
ax.set_ylim3d([-5.0, 5.0])
ax.set_ylabel('Y')
ax.set_zlim3d([-5.0, 5.0])
ax.set_zlabel('Z')
ax.set_title('3D Test')
data=data0[data0['time']==0]
x=data.x
y=data.y
z=data.z
graph=ax.scatter(x,y,z)

# Creating the Animation object
line_ani = animation.FuncAnimation(fig, update_graph, 19, 
                               interval=350, blit=False)
plt.show()

问题答案:

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()

该解决方案不允许产生斑点。但是,根据使用情况,可能根本不需要使用散点图。使用 法线plot可能同样有可能,这会产生斑点-如以下示例所示。

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, linestyle="", marker="o")

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

plt.show()


 类似资料:
  • 散点图沿 X 和 Y 轴放置的各个数据点来绘制数据。 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 不透明度 设置背景颜色的不透明度。 显示边框 显示图表外部边框。 边界颜色 设置图表外部边框的颜色。 显示标题 显示图表的主要标题。 标题 指定图表的标题。 标题字体 设置标题的字体样式。 位置 设置标题的位置。 对齐 设置标题的水平对

  • 散点图沿 X 和 Y 轴放置的各个数据点来绘制数据。 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 显示边框 显示图表外部边框。 边界颜色 设置图表外部边框的颜色。 显示标题 显示图表的主要标题。 标题 指定图表的标题。 标题字体 设置标题的字体样式。 位置 设置标题的位置。 对齐 设置标题的水平对齐方式。 数据 颜色 设置数据系列的

  • 散点图沿 X 和 Y 轴放置的各个数据点来绘制数据。 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 不透明度 设置背景颜色的不透明度。 显示边框 显示图表外部边框。 边界颜色 设置图表外部边框的颜色。 显示标题 显示图表的主要标题。 标题 指定图表的标题。 标题字体 设置标题的字体样式。 位置 设置标题的位置。 对齐 设置标题的水平对

  • 后果 我有这个数据框 代码是 但它不渲染。为什么啊?

  • 这是一个非常特殊的绘图请求,但我有数据要以非常特殊的方式查看。情况如下: 1) 我拥有的数据分为25个数据箱,每个数据箱包含不同数量的数据点。仓位值越大,粗略地说,仓位中的数据点数量就越少(这只是数据处理的结果)。 2)我可以访问bin值。 我可以在matplotlib中轻松生成“errorbar”类型的绘图(y轴从半径缩放到以下度数): 但是,对于我想研究的内容来说,这并不是特别有见地。我真的很

  • 散点图用于在水平轴和垂直轴上绘制数据点,它表示了因变量随自变量变化的趋势。通俗地讲,它反映的是一个变量受另一个变量的影响程度。 散点图将序列显示为一组点,其中每个散点值都由该点在图表中的坐标位置表示。对于不同类别的点,则由图表中不同形状或颜色的标记符表示。同时,您也可以设置标记符的颜色或大小。 下面示例,绘制了学生考试成绩的散点图,其中蓝色代表男孩成绩,红色表示女孩的成绩。 代码执行后,输出结果如