我想绘制3D图的不同视角,每个图都有一组相同的数据,这些数据根据组的不同而不同。但是以下方法似乎只绘制最后一组数据,而不保留前一组数据。
fig = plt.figure()
# group_id is a group-id map, eg {'A': 0, 'B': 1, ...}
for k, v in group_id.items():
# data_id indicates id of each data
subset_idx = data_id == v # obtain idx of data belonging to group k
d = data[subset_idx] # get the data subset
for i, angle in enumerate([45, 90, 135, 180]):
ax = fig.add_subplot(1, 4, i + 1, projection='3d')
ax.view_init(azim=angle)
ax.scatter(d[:, 0], d[:, 1], d[:, 2], c=colors[v], label=k)
该示例遇到警告:
MatplotlibDeprecationWarning:
Adding an axes using the same arguments as a previous axes currently
reuses the earlier instance. In a future version, a new instance will
always be created and returned. Meanwhile, this warning can be
suppressed, and the future behavior ensured, by passing a unique label
to each axes instance.
"Adding an axes using the same arguments as a previous axes "
应该不会造成任何严重的问题。但是,结果似乎只绘制了最后一组数据(group_id中的最后一项),表明ax = fig.add_subplot
可能创建了与警告中的描述不匹配的新轴。更让我感到困惑的是,二维绘图完全相同的方法有效(尽管它给出了相同的警告)。
答案 0 :(得分:0)
您可以使用列表理解功能在for循环之前创建所有4轴实例,然后使用索引i
绘制到for循环中的每个子图。您的代码不是MCVE,因此我无法对其进行测试,但这应该可以工作。如果没有,请在下面发表评论。
fig = plt.figure()
angles = [45, 90, 135, 180]
axes = [fig.add_subplot(1, 4, i+1, projection='3d') for i in range(len(angles))]
for k, v in group_id.items():
subset_idx = data_id == v
d = data[subset_idx]
for i, angle in enumerate(angles):
axes[i].view_init(azim=angle)
axes[i].scatter(d[:, 0], d[:, 1], d[:, 2], c=colors[v], label=k)