Я хочу генерировать высококачественные схемы для презентации. Я использую matplotlib Python для генерации графики. К сожалению, экспорт PDF, кажется, игнорирует мои параметры шрифта.
Я пытался установить шрифт оба путем передачи a FontProperties
возразите против текста, тянущего функции и путем установки опции глобально. Для записи вот MWE для репродуцирования проблемы:
import scipy
import matplotlib
matplotlib.use('cairo')
import matplotlib.pylab as pylab
import matplotlib.font_manager as fm
data = scipy.arange(5)
for font in ['Helvetica', 'Gill Sans']:
fig = pylab.figure()
ax = fig.add_subplot(111)
ax.bar(data, data)
ax.set_xticks(data)
ax.set_xticklabels(data, fontproperties = fm.FontProperties(family = font))
pylab.savefig('foo-%s.pdf' % font)
В обоих случаях произведенный вывод идентичен и использует Helvetica (и да, у меня действительно есть оба шрифта установленными).
Только, чтобы быть уверенным, следующее не помогает также:
matplotlib.rc('font', family = 'Gill Sans')
Наконец, если я заменяю бэкенд, вместо этого с помощью собственного средства просмотра:
matplotlib.use('MacOSX')
Я действительно отображал правильный шрифт – но только в средстве просмотра GUI. Вывод PDF является еще раз неправильным.
Чтобы быть уверенным – я могу установить другие шрифты – но только другие классы семейств шрифтов: Я могу установить serif
шрифты или fantasy
или monospace
. Но все шрифты гротескового шрифта, кажется, принимают значение по умолчанию к Helvetica.
Аргумент «family» и соответствующий параметр rc не предназначены для указания имени шрифта. на самом деле может использоваться таким образом. Существует (возможно, барочная) система выбора шрифтов в стиле CSS, которая помогает одному и тому же сценарию работать на разных компьютерах, выбирая ближайший из доступных шрифтов. Обычно рекомендуемый способ использования, например Гилл Санс должен добавить его перед значением параметра rc font.sans-serif (см. пример файла rc ), а затем установить font.family на sans-serif.
Это может раздражать, если диспетчер шрифтов по какой-то непонятной причине решит, что Gill Sans не наиболее соответствует вашей спецификации. Способ обойти логику выбора шрифта - использовать FontProperties (fname = '/ path / to / font.ttf')
( docstring ).
В вашем случае, я подозреваю, что серверная часть MacOSX использует шрифты через механизмы операционной системы и поэтому автоматически поддерживает все виды шрифтов, но серверная часть pdf имеет собственный код поддержки шрифтов, который не поддерживает вашу версию Gill Sans.
В принципе, ответ @Jouni правильный, но поскольку у меня все еще были проблемы с тем, чтобы заставить его работать, вот мое окончательное решение:
#!/usr/bin/env python2.6
import scipy
import matplotlib
matplotlib.use('cairo')
import matplotlib.pylab as pylab
import matplotlib.font_manager as fm
font = fm.FontProperties(
family = 'Gill Sans', fname = '/Library/Fonts/GillSans.ttc')
data = scipy.arange(5)
fig = pylab.figure()
ax = fig.add_subplot(111)
ax.bar(data, data)
ax.set_yticklabels(ax.get_yticks(), fontproperties = font)
ax.set_xticklabels(ax.get_xticks(), fontproperties = font)
pylab.savefig('foo.pdf')
Обратите внимание, что шрифт должен быть установлен явно с помощью ключа fontproperties
. Очевидно, что для свойства rc
fname
нет настройки rc
(по крайней мере, я ее не нашел).
Передача ключа family
при инстанцировании font
здесь не является строго необходимой, она будет проигнорирована бэкендом PDF.
Этот код работает только с бэкендом cairo
. Использование MacOSX
не сработает.