Итеративное добавление точек к трехмерному графику рассеяния в matplotlib
Мой текущий код не дает ожидаемого результата:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
colors = cm.rainbow(np.linspace(0, 1, len(gt_x)))
for i in range(len(gt_x)):
ax.scatter(gt_x[i], gt_y[i], gt_z[i], s=50, marker='o', c=colors[i], label='gt')
ax.scatter(pred_x[i], pred_y[i], pred_z[i], s=50, marker='x', c=colors[i], label='predicted')
fig.canvas.draw()
data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="")
data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))
imgs.append([plt.imshow(data, animated=True)])
clip = animation.ArtistAnimation(fig, imgs, interval=100, blit=False, repeat_delay=1000)
name = os.path.join("../data", "scatter_plot") + ".gif"
clip.save(name, writer='imagemagick')
Я хочу использовать ту же логику, т. Е. Итеративно добавлять трехмерные точки в график рассеяния с FuncAnimation
и смещения, которые, кажется, правильный способ сделать то, что я хочу.
Тем не менее, это включает в себя использование трехмерных смещений и функций обновления топора, которые я не знаю, как использовать для этой цели, так как многие функции кажутся частными и поэтому не документированы, например, ax._3doffsets()
,
1 ответ
Решение для итеративного добавления точек к анимированному трехмерному графику рассеяния с различными маркерами и цветами с использованием частных функций matplotlib в моем примере заключается в следующем:
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.markers as mmarkers
import matplotlib.cm as cm
import matplotlib.animation
colors = cm.tab10(np.linspace(0, 1, len(pos_gt)))
def update_graph(num):
x_updated = np.concatenate([pos_gt.x[:num+1].tolist(), pos_pred.x[:num+1].tolist()])
y_updated = np.concatenate([pos_gt.y[:num+1].tolist(), pos_pred.y[:num+1].tolist()])
z_updated = np.concatenate([pos_gt.z[:num+1].tolist(), pos_pred.z[:num+1].tolist()])
paths_gt = []
paths_ped = []
for i in range(num+1):
marker_gt = mmarkers.MarkerStyle('o')
marker_ped = mmarkers.MarkerStyle('x')
path_gt = marker_gt.get_path().transformed(marker_gt.get_transform())
path_ped = marker_ped.get_path().transformed(marker_ped.get_transform())
paths_gt.append(path_gt)
paths_ped.append(path_ped)
graph._paths = np.concatenate([paths_gt, paths_ped])
graph._facecolor3d = np.concatenate([colors[:num+1],colors[:num+1]])
graph._edgecolor3d = np.concatenate([colors[:num+1],colors[:num+1]])
graph._offsets3d = (x_updated, y_updated, z_updated)
fig = plt.figure(dpi=200)
ax = fig.add_subplot(111, projection='3d')
title = ax.set_title('plot title')
graph = ax.scatter([], [], [], s=70)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_zlim(0, 1)
graph.set_alpha(1)
ani = matplotlib.animation.FuncAnimation(fig, update_graph, frames=9, interval=600, repeat_delay=5000, blit=False)
plt.show()