Использование лигатур в matplotlib

#python #matplotlib #text #spyder #figure

Вопрос:

Есть ли способ заставить matplotlib (в Spyder или иначе) поддерживать лигатуры?

Моя конечная цель-создать таблицы стилей mpl, чтобы мне не нужно было постоянно обновлять параметры rcParams при переключении с одной работы на другую (например, для плаката требуется шрифт без засечек, взвешенный по отображению, но шрифт с засечками, взвешенный по заголовкам, для бумаги).

МВЕ:

 import matplotlib.pyplot as plt
from pathlib import Path

fig,ax=plt.subplots(figsize=(3,3),dpi=600)
fpath=Path("C:WindowsFontsGaramondPremrPro.otf")
ax.set_title(f'{fpath.name}', font=fpath, fontsize=15)
ax.set_xlabel('Default matplotlib font', fontsize=15)

ax.annotate(
   'Th fi fl ft',
   xy=(0.2,0.45),
   textcoords='data',
   font=fpath,
   fontsize=30)

plt.show()
fig.savefig(r'C:Picturesgaramond.png', bbox_inches='tight')
 

Это результирующий график, а это эталонная фотография того, как должны выглядеть лигатуры.

Я был бы признателен за предложения, которые можно было бы адаптировать как к одноразовым фигурам, так и к постоянным таблицам стилей. Спасибо!

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

1. Для лигатур, вероятно, можно использовать латекс. matplotlib.org/stable/tutorials/text/usetex.html

2. Как ни странно, добавление usetex на самом деле ухудшает ситуацию, по крайней мере, без дальнейших шагов, которые не очевидны. Первое, что делает»text.usetex»: True, — это типографская мерзость, так как цифры на осях в Computer Modern, но основной текст написан без ДежаВю; это также перезаписывает изменения шрифта, которые я сделал в своем MWE. Вы можете указать, используя определенный шрифт (Palatino, Helvetica), встроенный в matplotlib, но не любые другие (лучшие) шрифты.

3. Текстовый движок Matplotlib, насколько мне известно, не пытается идентифицировать лигатуры. Латекс делает это. Если вы хотите использовать нестандартные шрифты в latex, вы можете установить и изменить преамбулу на usepackage{myawesomefonts}.

Ответ №1:

Вы можете создавать объекты, которым принадлежат различные таблицы стилей, а затем импортировать соответствующие один или несколько в вашу текущую работу по мере необходимости. Класс также может потенциально изменить настройки matplotlib по умолчанию, если это удобно.

 class StyleSheetPaper:
    def __init__(self):
        self.fpath = <...>
        self.font = <...>

...
 
 import matplotlib.pyplot as plt
from pathlib import Path
from stylesheets import StyleSheetPaper, StyleSheetPoster


styler = StyleSheetPaper()

fig,ax=plt.subplots(figsize=(3,3),dpi=600)
ax.set_title(f'{styler.fpath.name}', font=styler.fpath, fontsize=15)
ax.set_xlabel('Default matplotlib font', fontsize=15)

ax.annotate(
   'Th fi fl ft',
   xy=(0.2,0.45),
   textcoords='data',
   font=styler.fpath,
   fontsize=30)

plt.show()
fig.savefig(r'C:Picturesgaramond.png', bbox_inches='tight')