2011-09-08 82 views
17

Hej,Sự khác biệt về sự khác biệt giữa Matplotlib giữa Agg và Cairo

Tôi muốn tạo các tệp PDF chất lượng cao từ các ô matplotlib. Sử dụng mã khác, tôi đã tạo ra một mảng lớn các số, mà tôi vẽ trong một hình bằng cách sử dụng plt.imshow. Nếu bây giờ tôi tạo ra một tệp PDF bằng cách sử dụng plt.savefig, tôi nhận thấy sự khác biệt lớn tùy thuộc vào phụ trợ mà tôi sử dụng. Quan trọng nhất, các tập tin được sản xuất trở nên rất lớn với phần phụ trợ Agg hoặc MacOSX, trong khi chúng nhỏ gọn hợp lý với Cairo (xem ví dụ bên dưới). Mặt khác, chương trình phụ trợ của Cairo tạo ra văn bản lạ kết hợp với việc hiển thị nhãn của TeX. Điều này có vẻ khủng khiếp trong tài liệu TeX. Câu hỏi của tôi do đó được gấp đôi:

  1. Có thể tạo PDF nhỏ (tức là có thể không nội suy hình ảnh raster với độ phân giải cao hơn) bằng cách sử dụng phụ trợ Agg không?
  2. người ta có thể thay đổi một số thiết lập văn bản cho backend Cairo như vậy mà nó trông giống như TeX bình thường (đó là trường hợp cho backend AGG)

Dưới đây là một số mã ví dụ cho mục đích thử nghiệm:

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') 

tạo một tệp PDF có kích thước 15Kb với nhãn xxabel trông xấu.

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') 

sản xuất PDF có dung lượng 986Kb.

Tôi có lẽ nên thêm rằng tôi sử dụng matplotlib 1.0.1 với python 2.6.7 trên OSX 10.6.8. Trong các ý kiến, ai đó yêu cầu đầu ra của 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 
+0

Tôi không biết câu trả lời, nhưng bạn vui lòng đăng 'grep -a Font agg.pdf'? – unutbu

+0

Tôi đặt đầu ra vào bài chính, vì phần bình luận quá nhỏ để giữ nó. Cảm ơn bạn đã nỗ lực! Tôi cũng nghi ngờ rằng có thể có vấn đề với phông chữ. Về cơ bản, tôi cố gắng sử dụng Computer Modern, để phù hợp với tài liệu TeX của tôi. –

+0

Hãy xem câu hỏi này về matplotlib và cairo, nó có thể cung cấp cho bạn một số gợi ý. http://stackoverflow.com/questions/2797525/matplotlib-pdf-export-uses-wrong-font –

Trả lời

5

Theo đề nghị của steabert trong các ý kiến ​​trên, một workaround được xuất khẩu đồ họa trong một định dạng khác nhau và sau đó chuyển đổi nó sang PDF sau đó. Điều chỉnh ví dụ của tôi từ trên cao, quy trình làm việc có thể trông giống như sau:

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') 

tạo tệp có kích thước 16 Kb. Vẫn có một sự khác biệt với các ví dụ được trình bày ở trên: Sử dụng đường ống (E) PS dường như bỏ qua tùy chọn nội suy = 'gần nhất', tức là hình ảnh bị mờ trong PDF cuối cùng. May mắn thay, tôi có thể sống với điều đó, nhưng nó có thể là thú vị để xem xét vấn đề này.

Các vấn đề liên quan