Проблема
Мое приложение matplotlib генерирует пользовательские динамические изображения, поэтому такие вещи, как текст заголовка страницы, могут иметь различную длину.Я хочу иметь возможность указать ограничивающий прямоугольник для matplotlib, а затем автоматически масштабировать размер шрифта, чтобы текст помещался в этом ограничивающем прямоугольнике.В моем приложении используется только серверная часть AGG.
Мое решение для взлома
Я наименее острый инструмент в наборе инструментов, но вот что я нашел для решенияк этой проблеме.Я начинаю с грубой силы с размером шрифта 50
, а затем выполняю итерацию вниз, пока не решу, что смогу разместить текст в поле.
def fitbox(fig, text, x0, x1, y0, y1, **kwargs):
"""Fit text into a NDC box."""
figbox = fig.get_window_extent().transformed(
fig.dpi_scale_trans.inverted())
# need some slop for decimal comparison below
px0 = x0 * fig.dpi * figbox.width - 0.15
px1 = x1 * fig.dpi * figbox.width + 0.15
py0 = y0 * fig.dpi * figbox.height - 0.15
py1 = y1 * fig.dpi * figbox.height + 0.15
# print("px0: %s px1: %s py0: %s py1: %s" % (px0, px1, py0, py1))
xanchor = x0
if kwargs.get('ha', '') == 'center':
xanchor = x0 + (x1 - x0) / 2.
yanchor = y0
if kwargs.get('va', '') == 'center':
yanchor = y0 + (y1 - y0) / 2.
txt = fig.text(
xanchor, yanchor, text,
fontsize=50, ha=kwargs.get('ha', 'left'),
va=kwargs.get('va', 'bottom'),
color=kwargs.get('color', 'k')
)
for fs in range(50, 1, -2):
txt.set_fontsize(fs)
tbox = txt.get_window_extent(fig.canvas.get_renderer())
# print("fs: %s tbox: %s" % (fs, str(tbox)))
if (tbox.x0 >= px0 and tbox.x1 < px1 and tbox.y0 >= py0 and
tbox.y1 <= py1):
break
return txt
Итак, я могу вызвать эту функцию примерно так:
fitbox(fig, "Hello there, this is my title!", 0.1, 0.99, 0.95, 0.99)
Вопрос / Запрос обратной связи
- Предлагает ли matplotlib лучшее встроенное решение для этой проблемы?
- Есть ли существенные недостатки этого подхода?Спектакль не похож на игровой автомат.Скорее всего, мне следует разрешить этой функции указывать координаты в пределах одного
axes
, а не общую цифру.Возможно, это уже работает:)
Кроме того, мне нравится, как некоторые другие графические приложения позволяют указывать размер шрифта в безразмерных координатах отображения.Например, PyNGL.Например, вы можете установить его на fontsize=0.04
.
Спасибо.