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

Matplotlib Backend Различия между Agg и Cairo

Хей,

Я хотел бы создавать высококачественные PDF файлы из графиков matplotlib. Используя другой код, я создал большой массив чисел, который я рисую на фигуре с помощью plt.imshow. Если я теперь создаю PDF файл с использованием plt.savefig, я замечаю сильные различия в зависимости от того, какой бэкэнд я использую. Самое главное, что созданные файлы становятся огромными с бэкэндом Agg или MacOSX, в то время как они достаточно малы с Каиром (см. Примеры ниже). С другой стороны, база данных Cairo создает странный текст в сочетании с рендерингом меток TeX. Это выглядит ужасно в документе TeX. Поэтому мой вопрос двоякий:

  • Возможно ли создать небольшой PDF (т.е. предположительно без интерполяции растрового изображения на более высокое разрешение) с использованием Agg-сервера?
  • Можно ли изменить некоторые настройки текста для бэкэнда Cairo так, чтобы он выглядел так же, как обычный TeX (что имеет место для бэкэнда Agg).

Вот пример кода для тестовых целей:

import matplotlib as mpl
mpl.use( "cairo" )

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True

data = np.random.rand( 50, 50 )

plt.imshow( data, interpolation='nearest' )
plt.xlabel( 'X Label' )
plt.savefig( 'cairo.pdf' )

создает PDF файл размером 15 КБ с плохо выглядящей xlabel.

import matplotlib as mpl
mpl.use( "agg" )

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True

data = np.random.rand( 50, 50 )

plt.imshow( data, interpolation='nearest' )
plt.xlabel( 'X Label' )
plt.savefig( 'agg.pdf' )

создает PDF 986Kb, который выглядит хорошо.

Я должен добавить, что я использую matplotlib 1.0.1 с python 2.6.7 на OSX 10.6.8. В комментариях кто-то запросил вывод grep -a Font agg.pdf:

/Shading 6 0 R /Font 3 0 R >>
<< /FontFile 16 0 R /Descent -285 /FontBBox [ -174 -285 1001 953 ]
/StemV 50 /Flags 4 /XHeight 500 /Type /FontDescriptor
/FontName /NimbusSanL-Regu /CapHeight 1000 /FontFamily (Nimbus Sans L)
%!PS-AdobeFont-1.0: NimbusSanL-Regu 1.05a
FontDirectory/NimbusSanL-Regu known{/NimbusSanL-Regu findfont dup/UniqueID known{dup
/UniqueID get 5020902 eq exch/FontType get 1 eq and}{pop false}ifelse
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
/FontName /NimbusSanL-Regu def
/FontBBox [-174 -285 1001 953 ]readonly def
/FontInfo 9 dict dup begin
/BaseFont /NimbusSanL-Regu /Type /Font /Subtype /Type1
/FontDescriptor 15 0 R /Widths 13 0 R /LastChar 255 /FirstChar 0 >>
<< /FontFile 20 0 R /Descent -251 /FontBBox [ -34 -251 988 750 ] /StemV 50
/Flags 4 /XHeight 500 /Type /FontDescriptor /FontName /CMR12
/CapHeight 1000 /FontFamily (Computer Modern) /ItalicAngle 0 /Ascent 750 >>
%!PS-AdobeFont-1.0: CMR12 003.002
%Copyright:  (<http://www.ams.org>), with Reserved Font Name CMR12.
% This Font Software is licensed under the SIL Open Font License, Version 1.1.
FontDirectory/CMR12 known{/CMR12 findfont dup/UniqueID known{dup
/UniqueID get 5000794 eq exch/FontType get 1 eq and}{pop false}ifelse
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
/FontName /CMR12 def
/FontBBox {-34 -251 988 750 }readonly def
/FontInfo 9 dict dup begin
 /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMR12.) readonly def
<< /BaseFont /CMR12 /Type /Font /Subtype /Type1 /FontDescriptor 19 0 R
4b9b3361

Ответ 1

Как было предложено steabert в комментариях выше, обходным путем является экспорт графики в другом формате, а затем преобразование в PDF впоследствии. При настройке моего примера сверху рабочий процесс может выглядеть примерно так:

import os
import matplotlib as mpl
mpl.use("Agg")

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True

data = np.random.rand(50, 50)

plt.imshow(data, interpolation='nearest')
plt.xlabel('X Label')
plt.savefig('agg.eps')

os.system('epspdf agg.eps agg.pdf')

создает файл размером 16 Kb, который выглядит хорошо. По-прежнему существует одна разница с приведенными выше примерами: использование (E) PS-конвейера, по-видимому, игнорирует интерполяцию = "ближайший" вариант, то есть изображение выглядит размытым в конечном PDF файле. К счастью, я могу жить с этим, но было бы интересно изучить этот вопрос.