Я изучаю, как использовать mplot3d для создания хороших графиков 3d-данных, и пока я доволен. То, что я пытаюсь сделать в данный момент, - небольшая анимация вращающейся поверхности. Для этого мне нужно установить положение камеры для 3D-проекции. Я предполагаю, что это должно быть возможно, так как поверхность может вращаться с помощью мыши при использовании matplotlib в интерактивном режиме. Но как я могу сделать это с помощью script? Я нашел много преобразований в mpl_toolkits.mplot3d.proj3d, но я не мог узнать, как использовать их для моей цели, и я не нашел никакого примера для того, что я пытаюсь сделать.
Как установить "положение камеры" для трехмерных графиков с использованием python/matplotlib?
Ответ 1
"Положение камеры" звучит так, как будто вы хотите отрегулировать высоту и угол азимута, которые вы используете для просмотра трехмерного графика. Вы можете установить это с помощью ax.view_init
. Я использовал ниже сценарий, чтобы сначала создать сюжет, то я определил хорошую высоту, или elev
, из которого, чтобы посмотреть мой участок. Затем я отрегулировал угол азимута или azim
, чтобы изменить полные 360 градусов вокруг моего графика, сохраняя фигуру в каждом случае (и отмечая, какой угол азимута при сохранении графика). Для более сложного панорамирования камеры вы можете отрегулировать высоту и угол наклона для достижения желаемого эффекта.
from mpl_toolkits.mplot3d import Axes3D
ax = Axes3D(fig)
ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6)
for ii in xrange(0,360,1):
ax.view_init(elev=10., azim=ii)
savefig("movie%d.png" % ii)
Ответ 2
Что было бы удобно, чтобы применить положение камеры к новому сюжету. Поэтому я рисую, а затем перемещаю сюжет с помощью мыши, изменяя расстояние. Затем попытайтесь воспроизвести представление, включая расстояние на другом участке. Я нахожу, что axx.ax.get_axes() возвращает мне объект со старыми .azim и .elev.
В ПИТОНЕ...
axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev
dst=axx.dist # ALWAYS GIVES 10
#dst=ax1.axes.dist # ALWAYS GIVES 10
#dst=ax1.dist # ALWAYS GIVES 10
Поздний трехмерный график...
ax2.view_init(elev=ele, azim=azm) #Works!
ax2.dist=dst # works but always 10 from axx
ИЗМЕНИТЬ 1... ОК, позиция камеры - неправильный способ мышления относительно значения .dist. Он превосходит все как своего рода сканирующий множитель хаки для всего графика.
Это работает для увеличения/масштабирования вида:
xlm=ax1.get_xlim3d() #These are two tupples
ylm=ax1.get_ylim3d() #we use them in the next
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing
axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev
Поздний график...
ax2.view_init(elev=ele, azim=azm) #Reproduce view
ax2.set_xlim3d(xlm[0],xlm[1]) #Reproduce magnification
ax2.set_ylim3d(ylm[0],ylm[1]) #...
ax2.set_zlim3d(zlm[0],zlm[1]) #...