Подтвердить что ты не робот

Как установить "положение камеры" для трехмерных графиков с использованием python/matplotlib?

Я изучаю, как использовать mplot3d для создания хороших графиков 3d-данных, и пока я доволен. То, что я пытаюсь сделать в данный момент, - небольшая анимация вращающейся поверхности. Для этого мне нужно установить положение камеры для 3D-проекции. Я предполагаю, что это должно быть возможно, так как поверхность может вращаться с помощью мыши при использовании matplotlib в интерактивном режиме. Но как я могу сделать это с помощью script? Я нашел много преобразований в mpl_toolkits.mplot3d.proj3d, но я не мог узнать, как использовать их для моей цели, и я не нашел никакого примера для того, что я пытаюсь сделать.

4b9b3361

Ответ 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])     #...