establecer matplotlib 3d plot relación de aspecto?

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D 

La configuración de la relación de aspecto funciona para gráficos 2d:

 ax = plt.axes() ax.plot([0,1],[0,10]) ax.set_aspect('equal','box') 

Pero no lo hace por 3d:

 ax = plt.axes(projection='3d') ax.plot([0,1],[0,1],[0,10]) ax.set_aspect('equal','box') 

¿Hay una syntax diferente para el caso 3d, o no está implementado?

Mi entendimiento es básicamente que esto no está implementado todavía. También espero que sea implementado pronto. Vea este enlace para una posible solución (no lo he probado yo mismo).

No probé todas estas respuestas, pero este kludge lo hizo por mí:

 def axisEqual3D(ax): extents = np.array([getattr(ax, 'get_{}lim'.format(dim))() for dim in 'xyz']) sz = extents[:,1] - extents[:,0] centers = np.mean(extents, axis=1) maxsize = max(abs(sz)) r = maxsize/2 for ctr, dim in zip(centers, 'xyz'): getattr(ax, 'set_{}lim'.format(dim))(ctr - r, ctr + r) 

Parece que esta característica se ha agregado desde entonces, así que pensé que agregaría una respuesta para las personas que vengan por este hilo en el futuro como lo hice yo:

 fig = plt.figure(figsize=plt.figaspect(0.5)*1.5) #Adjusts the aspect ratio and enlarges the figure (text does not enlarge) ax = fig.gca(projection='3d') 

figaspect(0.5) hace que la figura sea dos veces más ancha que alta. Entonces el *1.5 aumenta el tamaño de la figura. Las tags, etc. no boostán, por lo que esta es una forma de hacer que el gráfico se vea menos saturado por las tags.

Si conoces los límites, por ejemplo. + -3 centrado alrededor (0,0,0), puede agregar puntos invisibles como este:

 import numpy as np import pylab as pl from mpl_toolkits.mplot3d import Axes3D fig = pl.figure() ax = fig.gca(projection='3d') ax.set_aspect('equal') MAX = 3 for direction in (-1, 1): for point in np.diag(direction * MAX * np.array([1,1,1])): ax.plot([point[0]], [point[1]], [point[2]], 'w') 

Si conoce los límites, también puede establecer la relación de aspecto de esta manera:

 ax.auto_scale_xyz([minbound, maxbound], [minbound, maxbound], [minbound, maxbound])