Буквы разной высоты после аффинного преобразования

Мне нужно построить строку и преобразовать ее высоту без изменения ширины. Я нашел класс Scale здесь, который помогает. Но я обнаружил, что между разными буквами есть разница в высоте (см. рисунок: G, O, C выше, чем T, H, A, и превышают нижний предел).

Как я могу сделать все буквы одинаковой высоты и начинаться с y_axis?

Я пытался использовать txt1.get_window_extent() для получения координат строки bbox, но bbox не масштабируется (серые прямоугольники) после аффинного преобразования.

    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
    import matplotlib.patheffects
    # import matplotlib.patches as patches

    #-----------------------------------------------------------

    class Scale(matplotlib.patheffects.RendererBase):
        def __init__(self, sx, sy = None):
            self._sx = sx
            self._sy = sy

        def draw_path(self, renderer, gc, tpath, affine, rgbFace):
            affine = affine.identity().scale(self._sx, self._sy) + affine
            renderer.draw_path(gc, tpath, affine, rgbFace)

    #-----------------------------------------------------------

    N=12
    fig = plt.figure(figsize = (N+1, 4))
    ax = fig.add_subplot(111)

    font = FontProperties()
    font.set_size(80)
    font.set_weight('bold')
    font.set_family('monospace')

    bbox_props = dict(boxstyle = "square, pad = 0.0", fill = 0, lw = 1, alpha = 0.5)

    ax.plot((0.0, 1.0), (0.1, 0.1), linestyle = '--') # dashed line
    ax.plot((0.0, 1.0), (0.9, 0.9), linestyle = '--')

    txt1 = ax.text(0.3, 0.1, 'GOTCHA', 
                    fontproperties = font,
                    ha = 'center',
                    va = 'baseline', 
                    bbox = bbox_props)
    txt2 = ax.text(0.8, 0.1, 'GOTCHA', 
                    fontproperties = font,
                    ha = 'center',
                    va = 'baseline',
                    color = 'blue', 
                    bbox = bbox_props)

    txt1.set_path_effects([Scale(1.0, 3.0)]) # 3X in height
    ax.set_ylim(0.0, 1.0)
    plt.savefig('test.png')

Чёрный 'GOTCHA' - масштабированный


person Fei-man Hsu    schedule 07.07.2018    source источник
comment
в чем именно проблема?: Вроде все буквы действительно одного размера или нет?   -  person ImportanceOfBeingErnest    schedule 07.07.2018
comment
@ImportanceOfBeingErnest Красные и синие пунктирные линии отмечают верхнюю и базовую линии. Черная шкала «GOTCHA» превышает пунктирные линии букв «G», «O» и «C», а «T», «H» и «A» имеют точную высоту.   -  person Fei-man Hsu    schedule 07.07.2018
comment
Э-э... так что вы, конечно, можете адаптировать масштабирование (и перевод) для каждой буквы индивидуально. Но, возможно, более рациональным решением было бы найти шрифт, в котором буквы имеют одинаковую высоту.   -  person ImportanceOfBeingErnest    schedule 07.07.2018
comment
Я действительно нахожу это интересным вопросом, поэтому я спросил об этом на сайте графического дизайна.   -  person ImportanceOfBeingErnest    schedule 07.07.2018
comment
Этот вопрос может быть каким-то образом связан.   -  person ImportanceOfBeingErnest    schedule 07.07.2018
comment
@ImportanceOfBeingErnest Спасибо за помощь. Я заглянул в пост и кажется, что круглые символы изначально предназначены для визуализации немного крупнее. Возможно, мне следует масштабировать каждую букву по отдельности...   -  person Fei-man Hsu    schedule 08.07.2018
comment
Также у меня есть еще один вопрос ... когда я устанавливаю область заполнения bbox равной 0, почему внизу все еще остается место?   -  person Fei-man Hsu    schedule 08.07.2018
comment
Пространство внизу — это пространство, необходимое для букв, выходящих за пределы базовой линии, например Q, y, j, p, q, g.   -  person ImportanceOfBeingErnest    schedule 09.07.2018