matplotlib: Как автоматически масштабировать размер шрифта, чтобы текст помещался в ограничивающий прямоугольник - PullRequest
0 голосов
/ 17 апреля 2019

Проблема

Мое приложение 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)

Вопрос / Запрос обратной связи

  1. Предлагает ли matplotlib лучшее встроенное решение для этой проблемы?
  2. Есть ли существенные недостатки этого подхода?Спектакль не похож на игровой автомат.Скорее всего, мне следует разрешить этой функции указывать координаты в пределах одного axes, а не общую цифру.Возможно, это уже работает:)

Кроме того, мне нравится, как некоторые другие графические приложения позволяют указывать размер шрифта в безразмерных координатах отображения.Например, PyNGL.Например, вы можете установить его на fontsize=0.04.

Спасибо.

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