matplotlib: итеративное построение подмножества данных в трехмерных осях - PullRequest
0 голосов
/ 14 марта 2019

Я хочу построить разные углы обзора трехмерных графиков, каждый из которых имеет один и тот же набор данных, окрашенных по-разному в зависимости от групп.Но следующий подход, по-видимому, отображает только последнюю группу данных вместо сохранения предыдущих групп.

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-сюжета работает (хотя и дает то же предупреждение).

1 Ответ

0 голосов
/ 14 марта 2019

Вы можете создать все 4 экземпляра оси перед циклом for, используя, скажем, понимание списка, а затем нанести график на каждый подплот в цикле for, используя индекс i.Ваш код не 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)
...