#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')