¿Cómo configurar la “posición de la cámara” para diagtwigs 3D utilizando python / matplotlib?

Estoy aprendiendo a usar mplot3d para producir gráficos agradables de datos en 3D y hasta ahora estoy bastante contento. Lo que estoy tratando de hacer en este momento es una pequeña animación de una superficie giratoria. Para ese propósito, necesito establecer una posición de cámara para la proyección 3D. Supongo que esto debe ser posible ya que una superficie puede rotarse usando el mouse cuando se usa matplotlib interactivamente. Pero, ¿cómo puedo hacer esto desde un script? Encontré muchas transformaciones en mpl_toolkits.mplot3d.proj3d pero no pude descubrir cómo usarlas para mi propósito y no encontré ningún ejemplo de lo que estoy tratando de hacer.

Por “posición de la cámara”, suena como si quisiera ajustar la elevación y el ángulo de acimut que usa para ver la gráfica 3D. He usado la siguiente secuencia de comandos para crear primero la ttwig, luego determiné una buena elevación, o elev , desde la cual ver mi ttwig. Luego azim ángulo de azimut, o azim , para variar los 360 grados completos alrededor de mi plot, guardando la figura en cada instancia (y observando qué ángulo de azimut guardé la plot). Para una panorámica de cámara más complicada, puede ajustar tanto la elevación como el ángulo para lograr el efecto deseado.

  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) 

Lo que sería útil sería aplicar la posición de la cámara a una nueva ttwig. Así que trazo, luego muevo la ttwig con el ratón cambiando la distancia. Luego intente replicar la vista incluyendo la distancia en otra plot. Me parece que axx.ax.get_axes () me consigue un objeto con el antiguo .azim y .elev.

EN PITÓN …

 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 

Más tarde gráfico 3d …

 ax2.view_init(elev=ele, azim=azm) #Works! ax2.dist=dst # works but always 10 from axx 

EDITAR 1 … OK, la posición de la cámara es una forma incorrecta de pensar con respecto al valor .dist. Se monta sobre todo como una especie de multiplicador escalar de hackey para todo el gráfico.

Esto funciona para la ampliación / zoom de la vista:

 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 

Gráfica posterior …

 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]) #...