Экспорт в формат Matplotlib PDF использует неправильный шрифт
Я хочу создать высококачественные диаграммы для презентации. Im использует Pythons matplotlib для генерации графики. К сожалению, экспорт PDF, кажется, игнорирует мои настройки шрифта.
Я попытался установить шрифт, передав объект 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
. Но все шрифты sans-serif, по-видимому, не соответствуют Helvetica.
Ответы
Ответ 1
Аргумент "family" и соответствующий параметр rc не предназначены для указания, что имя шрифта действительно может быть использовано таким образом. Там (возможно барочная) CSS-подобная система выбора шрифтов, которая помогает тому же script работать на разных компьютерах, выбирая ближайший доступный шрифт. Обычно рекомендуемый способ использования, например, Gill Sans должен добавить его в начало значения параметра rc font.sans-serif (см. образец файла rc), а затем установите font.family в sans-serif.
Это может раздражать, если менеджер шрифтов решает по какой-то неясной причине, что Gill Sans не соответствует ближайшей спецификации. Способ обхода логики выбора шрифта заключается в использовании FontProperties(fname='/path/to/font.ttf')
(docstring).
В вашем случае я подозреваю, что сервер MacOSX использует шрифты с помощью механизмов операционной системы и поэтому автоматически поддерживает все виды шрифтов, но в бэкенде pdf есть собственный код поддержки шрифтов, который не поддерживает вашу версию Gill Sans.
Ответ 2
В принципе, @Jounis - правильный ответ, но, поскольку у меня все еще были проблемы с работой, это окончательное решение:
#!/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
. По-видимому, theres no rc
для свойства fname
(по крайней мере, я его не нашел).
Предоставление ключа family
в создании font
не обязательно здесь, оно будет проигнорировано файлом PDF.
Этот код работает только с бэкэнд cairo
. Использование MacOSX
не работает.