Ответ 1
Мое понимание в основном состоит в том, что это еще не реализовано. Я также надеюсь, что это будет реализовано в ближайшее время. См. Эта ссылка для возможного решения (я сам ее не тестировал).
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
Настройка соотношения сторон работает для 2d-графиков:
ax = plt.axes()
ax.plot([0,1],[0,10])
ax.set_aspect('equal','box')
Но не для 3d:
ax = plt.axes(projection='3d')
ax.plot([0,1],[0,1],[0,10])
ax.set_aspect('equal','box')
Есть ли другой синтаксис для 3d-кода или он не реализован?
Мое понимание в основном состоит в том, что это еще не реализовано. Я также надеюсь, что это будет реализовано в ближайшее время. См. Эта ссылка для возможного решения (я сам ее не тестировал).
Я не пробовал все эти ответы, но этот kludge сделал это для меня:
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)
Похоже, эта функция была добавлена, поэтому я подумал, что добавлю ответ для людей, которые приходят по этой теме в будущем, как я:
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)
делает фигуру в два раза шире, чем она высока. Затем *1.5
увеличивает размер фигуры. Ярлыки и т.д. Не будут увеличиваться, поэтому это способ сделать график менее загроможденным ярлыками.
Если вы знаете границы, например. + -3 с центром вокруг (0,0,0), вы можете добавить невидимые точки следующим образом:
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')
Если вы знаете границы, вы также можете установить соотношение сторон следующим образом:
ax.auto_scale_xyz([minbound, maxbound], [minbound, maxbound], [minbound, maxbound])