Экспорт в формат Matplotlib PDF использует неправильный шрифт

Я хочу создать высококачественные диаграммы для презентации. Я использую matplotlib Python для генерации графики. К сожалению, экспорт 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.

  • Как защитить мою кодовую базу Python, чтобы гости не могли видеть определенные модули, но так оно и работает?
  • Python - Тестирование абстрактного базового класса
  • Pandas - Заменить выбросы с помощью группового
  • Python: поиск ключей с уникальными значениями в словаре?
  • Невозможно загрузить изображение в моем шаблоне django.
  • Члены класса Python
  • Есть ли лучший редактор StringCollection для использования в PropertyGrids?
  • Как создать массив numpy из генератора?
  • 2 Solutions collect form web for “Экспорт в формат Matplotlib PDF использует неправильный шрифт”

    Аргумент «family» и соответствующий параметр rc не предназначены для указания, что имя шрифта действительно может быть использовано таким образом. Есть (возможно, барочная) CSS-подобная система выбора шрифтов, которая помогает тому же скрипту работать на разных компьютерах, выбирая ближайший доступный шрифт. Обычно рекомендуется использовать, например, Gill Sans, чтобы добавить его в начало значения параметра rc font.sans-serif (см. Образец файла rc ), а затем установить font.family в sans-serif.

    Это может раздражать, если менеджер шрифтов решает по какой-то неясной причине, что Gill Sans не подходит ближе к вашей спецификации. Способ обойти логику выбора шрифтов – использовать FontProperties(fname='/path/to/font.ttf') ( docstring ).

    В вашем случае я подозреваю, что сервер MacOSX использует шрифты с помощью механизмов операционной системы и поэтому автоматически поддерживает все виды шрифтов, но в бэкенде pdf есть собственный код поддержки шрифтов, который не поддерживает вашу версию Gill Sans.

    По сути, @ Jouni's – правильный ответ, но поскольку у меня все еще были проблемы с работой, вот мое окончательное решение:

     #!/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 ключа fontproperties . По-видимому, для свойства fname нет значения rc (по крайней мере, я его не нашел).

    Предоставление family ключа в создании font здесь не является строго необходимым, оно будет игнорироваться PDF-файлом.

    Этот код работает только с cairo данных cairo . Использование MacOSX не будет работать.

    Python - лучший язык программирования в мире.