Сжатие вертикальной протяженности в трехмерных фигурах MatPlotLib

Я работаю с двумерными матрицами, где записи представляют собой высоту, и пытаюсь построить их с помощью MatPlotLib mplot3d. Как я могу настроить вертикальную высоту полученной фигуры? Чтобы привести пример, извлечение из кода в учебнике по mplot3d:

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


fig = plt.figure()
ax = fig.gca(projection='3d')

# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

# Plot the surface.
surf = ax.plot_surface(X, Y, Z, linewidth=0, antialiased=False)

# Configure z-axis.
ax.set_zlim(-1.01, 1.01)

plt.show()

Это дает:

Рисунок 1

Я хотел бы сжать изображение по вертикали, чтобы отметка 1.00 по оси Z была сдвинута вниз до текущей позиции -0.75.

Изменение z-предела с помощью ax.set_zlim(-1.01, 10.01) сглаживает данные, но сохраняет ту же высоту фигуры. Я также экспериментировал с такими операторами, как plt.figure(figsize=(20,5)), но это меняет размер фигуры и мешает вращению полученного графика в 3D.

Рисунок 2

Как сжать только ось Z?


person Andreas Yankopolus    schedule 19.02.2020    source источник
comment
Попробуйте это и это   -  person Sheldore    schedule 19.02.2020


Ответы (1)


Благодаря @sheldore—этот ответ помогает.

Добавление:

scale_x = 1
scale_y = 1
scale_z = 0.25

ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([scale_x, scale_y, scale_z, 1]))

Дает следующий график, который будет делать именно то, что я хочу, после возни с нумерацией осей.

Рисунок 3

person Andreas Yankopolus    schedule 19.02.2020