Проблема с 3D-зумом Matplotlib

Здесь, чтобы задать вопрос об основных инструментах 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? Есть ли причина, по которой это было закодировано таким образом? Могу ли я что-нибудь с этим сделать?

Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте увеличить фигуру (может быть, (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:

Другие вопросы по теме