matplotlib 在3D轴中迭代绘制数据子集

ou6hu8tu  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(137)

我想绘制不同视角的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可能已经创建了与警告中的描述不匹配的新轴。对我来说更令人困惑的是,2d plot的方法完全相同(尽管它给出了相同的警告)。

6ojccjat

6ojccjat1#

你可以在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)

相关问题