Модификация данных matplotlib patchcollecton3d
Как изменить данные xyz трехмерного точечного графика в matplotlib для быстрой онлайн-анимации? Другими словами, где объекты matplotlib patchcollection3d сохраняют координаты XYZ и как их установить? Например:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
## generate some random data
pts = np.random.uniform(0,10,(10,20,30))
plt.close('all')
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
patch_collection_instance = ax.scatter(pts[:,0],pts[:,1],pts[:,2], c='m', marker='o')
Что мне делать дальше с patch_collection_instance, если, например, я хочу перевести все точки на случайную величину?
1 ответ
Координаты хранятся в атрибуте _offsets3d
, Пока есть get_offsets()
метод и set_offsets()
По-видимому, они унаследованы от 2-й версии и не работают должным образом для 3-й версии. _offsets3d
содержит кортежи координатных кортежей x, y и z Допустим, вы хотите сместить каждую точку на 10 в направлении х. Вы добавите 10 к каждому числу в кортеже x-координаты, а затем установите _offsets3d в новый кортеж.
Я не уверен, что это быстрее, чем просто очистить фигуру и вызвать scatter
снова с новыми координатами, которые должны иметь тот же эффект.
Пример кода:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
from copy import copy
## generate some random data
pts = np.random.uniform(0,10,(10,20,30))
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
patch_collection_instance = ax.scatter(pts[:,0],pts[:,1], pts[:,2], c='m', marker='o')
x, y, z = patch_collection_instance._offsets3d
print x
x = [i + 10 for i in x]
offsets = (x, y, z)
patches2 = copy(patch_collection_instance)
patches2._offsets3d = offsets
patches2._facecolor3d = [[0, 0, 1, 1]]
ax.add_collection3d(patches2)
plt.xlim(0, 20)
plt.show()