Читайте высоту легенды в Python - PullRequest
2 голосов
/ 20 марта 2019

У меня есть несколько сюжетов с большим количеством информации и линий, поэтому иногда я склонен размещать легенду вне самого сюжета using bbox_to_anchor.Я также предпочитаю иметь название сюжета, но это будет позиционно совпадать с легендой в этом случае.Следующий пример ниже является лишь иллюстрацией проблемы.

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
r = 1 + np.sin(4 * np.pi * t)
q = 1 + np.sin(6 * np.pi * t)

fig, ax = plt.subplots()
ax.plot(t, s, label='S')
ax.plot(t, r, label='R')
ax.plot(t, q, label='Q')
leg = ax.legend(loc=3, ncol=3, bbox_to_anchor=(.0, 1.02, 1., .102), borderaxespad=0., mode='expand')
ax.set_title('SIMPLE PLOT', y=1.1)
plt.show()

Чтобы избежать этого, я установил какое-то значение y (например, y=1.1).Я хотел бы автоматизировать этот процесс, потому что я продолжаю обновлять тот же график новыми данными, чтобы легенда увеличивалась в размере, и мне нужно соответствующим образом изменить положение заголовка.

  • Есть ли способ автоматизировать этот процесс?
  • Есть ли в Python функция, которая может считывать высоту легенды, чтобы ее можно было использовать для регулировки положения заголовка?

1 Ответ

1 голос
/ 21 марта 2019

Высота легенды определяется во время розыгрыша.Вы можете получить его, нарисовав фигуру через legend.get_window_extent().Результирующая ограничивающая рамка в единицах пикселей.Чтобы найти смещение заголовка, вам необходимо вычесть верхнюю границу легенды из верхней границы осей.Таким образом, вам необходимо получить положение осей в пикселях.

Заголовок может быть смещен либо в координатах рисунка (y=1.1), либо в точках (pad=20).Я бы предложил использовать точки здесь, чтобы они не зависели от размера осей.Таким образом, вы можете вычислить разницу в верхних позициях, преобразовать пиксели в точки (то есть distance [pixels] * ppi / dpi) и добавить некоторое постоянное смещение в точках (поскольку обычно вы не хотите, чтобы заголовок располагался точно на границе легенды).Затем используйте это число как pad.

import numpy as np
import matplotlib.pyplot as plt


fig, ax = plt.subplots(constrained_layout=True)

ax.plot([1,2,3], np.random.rand(3,5), label='Label')

leg = ax.legend(loc="lower center", ncol=3, bbox_to_anchor=(.0, 1.02, 1., 1.02),
                borderaxespad=0, mode='expand')

fig.canvas.draw()
leg_box = leg.get_window_extent()
ax_box = ax.get_position().transformed(fig.transFigure)
pad = (leg_box.y1 - ax_box.y1)*72./fig.dpi + 6
ax.set_title('SIMPLE PLOT', pad=pad)

plt.show()

enter image description here

Обратите внимание, что здесь я также использовал constrained_layout, чтобы заголовок не был обрезанГраницы фигуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...