Почему matplotlib не использует указанный шрифт здесь?

#python #python-3.x #matplotlib

#python #python-3.x #matplotlib

Вопрос:

(Используя 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 без наклонного), а не моноширинным шрифтом:

неправильно отображаемый текст

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

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


Комментарии:

1. У меня не установлен Tkinter, и я предпочел бы сохранить его таким образом , tkinter он уже отделен от стандартной библиотеки Python, поэтому он уже установлен.

2. С помощью установщика Windows standard вполне возможно опустить его (вместе с IDLE).

Ответ №1:

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

DejaVu Sans (по умолчанию), DejaVu Serif, шрифты Computer Modern (из (La) TeX), шрифты STIX (с хорошо сочетаются со временем) или шрифт 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}}}

введите описание изображения здесь

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

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

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

 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}}}

введите описание изображения здесь


Комментарии:

1. Мне даже не приходило в голову, что может потребоваться отдельный метод для выбора шрифта для текста MathML по сравнению с обычным текстом. Я протестировал исходный код с простой 'lorem ipsum' строкой, и это сработало. Попробовав этот подход, сначала я получил ошибку, которая mathtt{ является неизвестным символом. Это вводило в заблуждение - я забыл удалить $ тестовый ввод, поэтому, по-видимому, механизм рендеринга просто увидел $mathtt{$ , что за ним следует мусор. Теперь работает отлично. Спасибо 🙂

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

неправильно отображаемый текст

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

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

Комментарии:

1. У меня не установлен Tkinter, и я предпочел бы сохранить его таким образом , tkinter он уже отделен от стандартной библиотеки Python, поэтому он уже установлен.

2. С помощью установщика Windows standard вполне возможно опустить его (вместе с IDLE).

Ответ №1:

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

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

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


введите описание изображения здесь

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


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


введите описание изображения здесь

Комментарии:

1. Мне даже не приходило в голову, что может потребоваться отдельный метод для выбора шрифта для текста MathML по сравнению с обычным текстом. Я протестировал исходный код с простой 'lorem ipsum' строкой, и это сработало. Попробовав этот подход, сначала я получил ошибку, которая mathtt{ является неизвестным символом. Это вводило в заблуждение - я забыл удалить $ тестовый ввод, поэтому, по-видимому, механизм рендеринга просто увидел $mathtt{$ , что за ним следует мусор. Теперь работает отлично. Спасибо 🙂

)
plt.show()

render('lorem^{ipsum}')

введите описание изображения здесь

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


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


введите описание изображения здесь

Комментарии:

1. Мне даже не приходило в голову, что может потребоваться отдельный метод для выбора шрифта для текста MathML по сравнению с обычным текстом. Я протестировал исходный код с простой 'lorem ipsum' строкой, и это сработало. Попробовав этот подход, сначала я получил ошибку, которая mathtt{ является неизвестным символом. Это вводило в заблуждение - я забыл удалить $ тестовый ввод, поэтому, по-видимому, механизм рендеринга просто увидел $mathtt{$ , что за ним следует мусор. Теперь работает отлично. Спасибо 🙂

)

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

неправильно отображаемый текст

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

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

Комментарии:

1. У меня не установлен Tkinter, и я предпочел бы сохранить его таким образом , tkinter он уже отделен от стандартной библиотеки Python, поэтому он уже установлен.

2. С помощью установщика Windows standard вполне возможно опустить его (вместе с IDLE).

Ответ №1:

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

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

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


введите описание изображения здесь

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


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


введите описание изображения здесь

Комментарии:

1. Мне даже не приходило в голову, что может потребоваться отдельный метод для выбора шрифта для текста MathML по сравнению с обычным текстом. Я протестировал исходный код с простой 'lorem ipsum' строкой, и это сработало. Попробовав этот подход, сначала я получил ошибку, которая mathtt{ является неизвестным символом. Это вводило в заблуждение — я забыл удалить $ тестовый ввод, поэтому, по-видимому, механизм рендеринга просто увидел $mathtt{$ , что за ним следует мусор. Теперь работает отлично. Спасибо 🙂

)
plt.show()

render(‘lorem^{ipsum}’)введите описание изображения здесь

Комментарии:

1. Мне даже не приходило в голову, что может потребоваться отдельный метод для выбора шрифта для текста MathML по сравнению с обычным текстом. Я протестировал исходный код с простой 'lorem ipsum' строкой, и это сработало. Попробовав этот подход, сначала я получил ошибку, которая mathtt{ является неизвестным символом. Это вводило в заблуждение — я забыл удалить $ тестовый ввод, поэтому, по-видимому, механизм рендеринга просто увидел $mathtt{$ , что за ним следует мусор. Теперь работает отлично. Спасибо 🙂

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

неправильно отображаемый текст

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

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

Комментарии:

1. У меня не установлен Tkinter, и я предпочел бы сохранить его таким образом , tkinter он уже отделен от стандартной библиотеки Python, поэтому он уже установлен.

2. С помощью установщика Windows standard вполне возможно опустить его (вместе с IDLE).

Ответ №1:

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

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

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


введите описание изображения здесь

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


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


введите описание изображения здесь

Комментарии:

1. Мне даже не приходило в голову, что может потребоваться отдельный метод для выбора шрифта для текста MathML по сравнению с обычным текстом. Я протестировал исходный код с простой 'lorem ipsum' строкой, и это сработало. Попробовав этот подход, сначала я получил ошибку, которая mathtt{ является неизвестным символом. Это вводило в заблуждение — я забыл удалить $ тестовый ввод, поэтому, по-видимому, механизм рендеринга просто увидел $mathtt{$ , что за ним следует мусор. Теперь работает отлично. Спасибо 🙂

)
plt.show()

render(‘lorem^{ipsum}’)

введите описание изображения здесь

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


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


введите описание изображения здесь

Комментарии:

1. Мне даже не приходило в голову, что может потребоваться отдельный метод для выбора шрифта для текста MathML по сравнению с обычным текстом. Я протестировал исходный код с простой 'lorem ipsum' строкой, и это сработало. Попробовав этот подход, сначала я получил ошибку, которая mathtt{ является неизвестным символом. Это вводило в заблуждение — я забыл удалить $ тестовый ввод, поэтому, по-видимому, механизм рендеринга просто увидел $mathtt{$ , что за ним следует мусор. Теперь работает отлично. Спасибо 🙂

)

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

неправильно отображаемый текст

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

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

Комментарии:

1. У меня не установлен Tkinter, и я предпочел бы сохранить его таким образом , tkinter он уже отделен от стандартной библиотеки Python, поэтому он уже установлен.

2. С помощью установщика Windows standard вполне возможно опустить его (вместе с IDLE).

Ответ №1:

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

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

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


введите описание изображения здесь

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


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


введите описание изображения здесь

Комментарии:

1. Мне даже не приходило в голову, что может потребоваться отдельный метод для выбора шрифта для текста MathML по сравнению с обычным текстом. Я протестировал исходный код с простой 'lorem ipsum' строкой, и это сработало. Попробовав этот подход, сначала я получил ошибку, которая mathtt{ является неизвестным символом. Это вводило в заблуждение — я забыл удалить $ тестовый ввод, поэтому, по-видимому, механизм рендеринга просто увидел $mathtt{$ , что за ним следует мусор. Теперь работает отлично. Спасибо 🙂