Здесь, чтобы задать вопрос об основных инструментах 3D-графики matplotlib. Теперь позвольте мне создать несколько фиктивных данных, чтобы объяснить мою проблему:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 1000)
y = x
X, Y = np.meshgrid(x, y)
f = np.exp(-(X**2 / 0.5) - Y**2 / 0.5)
У меня есть несколько графиков, которые я хочу сложить рядом, потому что они связаны параметром, здесь я просто собираюсь повторно использовать одни и те же данные, поскольку это не сильно меняет мою проблему. Итак, мой основной сюжет выглядит следующим образом:
fig, ax = plt.subplots(1, 1, subplot_kw = {"projection": "3d"})
for i in range(5):
ax.contourf(x, y, f, zdir = "z", offset=i)
ax.view_init(elev=15, azim=45, roll=-90)
ax.set_zlim3d(-0.5, 3.5)
ax.set_box_aspect((3, 3, 7), zoom=1)
Где я вижу красивый сюжет сбоку:
Теперь, поскольку этот график в конечном итоге будет включен в более крупный рисунок, я постарался уменьшить количество пустого пространства вокруг него. Это вопрос такой же старый, как matplotlib, видимо, к сожалению, мне не удалось найти простого решения, изменение соотношения сторон помогло лучше охватить пространство. Теперь моя проблема: если я попытаюсь увеличить масштаб, измените ax.set_box_aspect((3, 3, 7), zoom=1) на ax.set_box_aspect((3, 3, 7), zoom=2):
Сюжеты появляются только в центре. Несмотря на то, что это слишком большой масштаб, с эстетической точки зрения я не понимаю, почему график, который должен появиться при z = 3, не отображается, а график при 0 обрезается. Я не могу добавить видео, но если я попытаюсь использовать инструмент перетаскивания, я увижу, что мои данные будут отображаться только в центре фигуры (там, где текущая фигура вырезана) и при любой попытке переместить ее. в конечном итоге получим аналогичный результат: данные отображаются только в центре 3D-оси.
Теперь мне интересно: почему это происходит? Это из-за реализации 3D-осей в matplotlib? Есть ли причина, по которой это было закодировано таким образом? Могу ли я что-нибудь с этим сделать?
Спасибо.






Попробуйте увеличить фигуру (может быть, (12, 6) или около того) и установите обрезку каждого заполненного контура на False:
# your code
fig, ax = plt.subplots(1, 1, figsize=(12, 6), subplot_kw = {"projection": "3d"})
# your code
for i in range(5):
c = ax.contourf(x, y, f, zdir = "z", offset=i, cmap=plt.cm.coolwarm)
c.set_clip_on(False)
# your code
Вывод для zoom=1:
Вывод для zoom=2: