Matplotlib: дополнительная ось при повторной прорисовке 3D фигуры с помощью canvas.draw () - PullRequest
4 голосов
/ 31 октября 2011

У меня есть, вероятно, очень простая проблема с пересчетом некоторых 3D-данных с помощью Matplotlib. Изначально у меня есть фигура с 3D-проекцией на холсте:

self.fig = plt.figure()
self.canvas = FigCanvas(self.mainPanel, -1, self.fig)
self.axes = self.fig.add_subplot(111, projection='3d')

enter image description here

Затем я добавляю некоторые данные и использую canvas.draw () для обновления. Сам график обновляется, как и ожидалось, но я получаю дополнительную 2D-ось снаружи фигуры (от -0,05 до 0,05), и я не могу понять, как ее остановить:

self.axes.clear()
self.axes = self.fig.add_subplot(111, projection='3d')

xs = np.random.random_sample(100)
ys = np.random.random_sample(100)
zs = np.random.random_sample(100)

self.axes.scatter(xs, ys, zs, c='r', marker='o')
self.canvas.draw()

enter image description here

Есть идеи? Я иду в кругах прямо сейчас!

Ответы [ 2 ]

3 голосов
/ 31 октября 2011

Вместо axes.clear() + fig.add_subplot, используйте метод remove объекта mpl_toolkits.mplot3d.art3d.Patch3DCollection:

In [31]: fig = plt.figure()

In [32]: ax = fig.add_subplot(111, projection='3d')

In [33]: xs = np.random.random_sample(100)

In [34]: ys = np.random.random_sample(100)

In [35]: zs = np.random.random_sample(100)

In [36]: a = ax.scatter(xs, ys, zs, c='r', marker='o')   #draws

In [37]: a.remove()                                      #clean

In [38]: a = ax.scatter(xs, ys, zs, c='r', marker='o')   #draws again

Если у вас все еще есть проблемы, вы можете поиграть с этим:

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import interactive
interactive(True)

xs = np.random.random_sample(100)
ys = np.random.random_sample(100)
zs = np.random.random_sample(100)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

a = ax.scatter(xs, ys, zs, c='r', marker='o')

plt.draw()

raw_input('press for new image')

a.remove()

xs = np.random.random_sample(1000)
ys = np.random.random_sample(1000)
zs = np.random.random_sample(1000)

a = ax.scatter(xs, ys, zs, c='r', marker='o')

plt.draw()

raw_input('press to end')
2 голосов
/ 31 октября 2011

Предложения Джокина работали хорошо и подчеркивали, что я, вероятно, собирался придумать неправильный способ начать с.Однако для полноты картины я в конечном итоге обнаружил, что вы можете избавиться от 2D-оси, просто используя:

self.axes.get_xaxis().set_visible(False)
self.axes.get_yaxis().set_visible(False)

Это кажется одним из способов, по крайней мере, удалить 2D-метки из 3D-графиков, еслиони появляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...