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

时间:2019-03-14 03:08:55

标签: python matplotlib subplot

我想绘制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可能创建了与警告中的描述不匹配的新轴。更让我感到困惑的是,二维绘图完全相同的方法有效(尽管它给出了相同的警告)。

1 个答案:

答案 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)