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

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

14
задан Serenity 26 July 2016 в 04:28
поделиться

2 ответа

Аргумент «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.

3
ответ дан 1 December 2019 в 15:01
поделиться

В принципе, ответ @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 не сработает.

8
ответ дан 1 December 2019 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: