Подтвердить что ты не робот

Экспорт в формат 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.

4b9b3361

Ответ 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 не работает.