Легенда Matplotlib + тугой_слой = раздавленные сюжеты - PullRequest
0 голосов
/ 14 мая 2018

Рассмотрим следующий пример:

import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np

x = np.linspace(0, 10, 100)
y = 2*x + 0.5

plt.figure(figsize=(6, 4))
gs = gridspec.GridSpec(2, 2)

plt.subplot(gs[0, 0])
plt.plot(x, y, "o")

plt.subplot(gs[0, 1])
plt.plot(x, y, "o")

plt.subplot(gs[1, :])
plt.plot(x, y, "o", label="test")
plt.legend(loc="upper center", bbox_to_anchor=(0.5, 2.7))

plt.subplot(gs[2, :])
plt.plot(x, y, "o")

plt.tight_layout()
plt.show()

Когда я удаляю bbox_to_anchor из plt.legend, приведенный выше код должен выглядеть примерно так:

enter image description here

Но когда я размещаю легенду за пределами субплота, используя bbox_to_anchor (как в коде выше), субплоты сдавливаются:

enter image description here

Очевидно, что это нежелательно.Кажется, существует конфликт между bbox_to_anchor и tight_layout() (если вы удалите любой из кода выше, получится что-то разумное).Есть ли что-то, что я делаю не так, или это известное / ожидаемое поведение?

Эта проблема воспроизводится в различных бэкэндах.Я не получаю никаких предупреждений или ошибок.Я использую Matplotlib версии 2.2.2.

1 Ответ

0 голосов
/ 14 мая 2018

Результат ожидаемый, хотя явно нежелательный.Поскольку легенда является частью нижнего сюжета, она примет участие в механизме tight_layout и, следовательно, перенесет все на верх.

Сначала вы можете позвонить tight_layout,

plt.tight_layout()
plt.legend(loc="upper center", bbox_to_anchor=(0.5, 2.3))

чтобы получить узкий интервал, а затем создать легенду.

Вы также можете создать легенду фигуры,

fig = plt.figure(figsize=(6, 4))
# ...
fig.legend(loc="upper center", bbox_to_anchor=(0.5, .9))
plt.tight_layout()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...