Установить соотношение сторон 3D-графика matplotlib?

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-кода или он не реализован?

Ответ 1

Мое понимание в основном состоит в том, что это еще не реализовано. Я также надеюсь, что это будет реализовано в ближайшее время. См. Эта ссылка для возможного решения (я сам ее не тестировал).

Ответ 2

Я не пробовал все эти ответы, но этот 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)

Ответ 3

Похоже, эта функция была добавлена, поэтому я подумал, что добавлю ответ для людей, которые приходят по этой теме в будущем, как я:

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 увеличивает размер фигуры. Ярлыки и т.д. Не будут увеличиваться, поэтому это способ сделать график менее загроможденным ярлыками.

Ответ 4

Если вы знаете границы, например. + -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')

Ответ 5

Если вы знаете границы, вы также можете установить соотношение сторон следующим образом:

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