Почему Matplotlib не использует указанный шрифт здесь? - PullRequest
0 голосов
/ 17 апреля 2019

(Использование Python 3.6.1 на Win10, в virtualenv, в котором, как правило, просто установлен numpy / pandas / matplotlib, для обработки чисел. Я не установил Tkinter и предпочел бы оставить его таким.)

У меня есть следующий тестовый код, пытающийся визуализировать текст MathML статически:

import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plot


def render(mathml):
    plot.clf()
    plot.rc('font', family='monospace', size=72)
    plot.axis('off')
    plot.text(0, 0, f'{mathml}')
    plot.savefig(f'hax.png')


render('$lorem^{ipsum}$')

В результате test.png показывает текст шрифтом по умолчанию (DejaVu Sans Oblique), а не в моноширинном пространстве.шрифт:

improperly rendered text

Явное указание шрифта (например, family='Courier New') также не оказывает никакого влияния, а также не изменяет формат вывода.Размер текста должным образом изменяется, и не появляется никаких ошибок или предупреждений - вывод не показывает правильный шрифт.

Что здесь происходит?Как я могу это исправить?

1 Ответ

2 голосов
/ 17 апреля 2019

Параметры для математических шрифтов соответствуют учебному пособию

DejaVu Sans (по умолчанию), DejaVu Serif, шрифты Computer Modern (из (La) TeX), шрифты STIX(with предназначены для хорошего сочетания с Times) или предоставленный вами шрифт Unicode

Придерживаясь значения по умолчанию, вы можете получить ощущение, похожее на пишущую машинку, используя \mathtt

import matplotlib.pyplot as plt


def render(mathml):
    plt.clf()
    plt.rc('font', size=72)
    plt.axis('off')
    plt.text(0, 0, f'$\\mathtt{{{mathml}}}$')
    plt.show()

render('lorem^{ipsum}')

enter image description here

Использовать пользовательский набор шрифтов для математического текста можно через параметр mathtext.fontset rc.

plt.rcParams["mathtext.fontset"] = "custom"

Для нового шрифта курьераэто может выглядеть как

import matplotlib.pyplot as plt

def render(mathml):
    plt.clf()
    plt.rc('font', size=72)
    plt.rc('mathtext', fontset="custom", tt="Courier New")
    plt.axis('off')
    plt.text(0, 0, f'$\\mathtt{{{mathml}}}$')
    plt.show()

render('lorem^{ipsum}')

enter image description here

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