2011-09-08 9 views
17

Hej के बीच matplotlib बैकएंड मतभेद,Agg और काहिरा

मैं matplotlib भूखंडों से उच्च गुणवत्ता पीडीएफ़ का उत्पादन करना चाहते हैं। अन्य कोड का उपयोग करके, मैंने बड़ी संख्या में संख्याएं बनाई हैं, जिन्हें मैं plt.imshow का उपयोग करके एक आकृति में प्लॉट करता हूं। अगर मैं अब plt.savefig का उपयोग करके पीडीएफ उत्पन्न करता हूं, तो मैं उस बैकएंड के उपयोग के आधार पर मजबूत अंतर देखता हूं। सबसे महत्वपूर्ण बात यह है कि उत्पादित फाइलें एजीजी या मैकॉक्स बैकएंड के साथ बड़ी हो जाती हैं, जबकि वे काइरो के साथ काफी कम हैं (नीचे उदाहरण देखें)। दूसरी ओर, काहिरा बैकएंड लेबल के टीएक्स प्रतिपादन के संयोजन के साथ अजीब पाठ उत्पन्न करता है। यह टीएक्स दस्तावेज़ में भयानक लग रहा है। मेरा सवाल इसलिए दो गुना है:

  1. क्या एजीजी बैकएंड का उपयोग करके छोटे पीडीएफ (यानी संभवतः रास्टर छवि को उच्च रिज़ॉल्यूशन में इंटरपोल किए बिना) उत्पन्न करना संभव है?
  2. एक काहिरा बैकएंड के लिए कुछ पाठ सेटिंग में बदलाव कर सकते हैं ऐसी है कि वह साधारण टेक्स के समान दिखता है

यहाँ परीक्षण प्रयोजनों के लिए कुछ उदाहरण कोड है (जो 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') 

खराब दिखने वाले xlabel के साथ 15 केबी का पीडीएफ उत्पन्न करता है।

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

986 केबी का एक पीडीएफ तैयार करता है जो अच्छा दिखता है।

मुझे शायद यह जोड़ना चाहिए कि मैं matplotlib 1.0.1 का उपयोग ओएसएक्स 10.6.8 पर पायथन 2.6.7 के साथ करता हूं।

/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

मुझे जवाब नहीं पता, लेकिन क्या आप कृपया 'grep -a font agg.pdf' पोस्ट करेंगे? – unutbu

+0

मैंने आउटपुट को मुख्य पोस्ट में रखा है, क्योंकि टिप्पणी अनुभाग इसे पकड़ने के लिए बहुत छोटा है। प्रयास करने के लिए धन्यवाद! मुझे यह भी संदेह था कि फोंट के साथ कोई समस्या हो सकती है। मैं अपने टीएक्स दस्तावेज़ से मेल खाने के लिए मूल रूप से कंप्यूटर मॉडर्न का उपयोग करने की कोशिश करता हूं। –

+0

matplotlib और cairo के बारे में इस प्रश्न को देखें, यह आपको कुछ संकेत दे सकता है। http://stackoverflow.com/questions/2797525/matplotlib-pdf-export-uses-wrong-font –

उत्तर

5

ऊपर टिप्पणी में steabert ने सुझाव दिया के रूप में, एक समाधान के किसी अन्य प्रारूप में ग्राफिक्स के निर्यात और फिर पीडीएफ करने के लिए इसे बाद में परिवर्तित किया जाता है: टिप्पणी में, किसी grep -a Font agg.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 की एक फ़ाइल उत्पादन: ऊपर से मेरी उदाहरण समायोजन, कार्यप्रवाह कुछ इस तरह दिखाई सकता है। ऊपर प्रस्तुत उदाहरणों में अभी भी एक अंतर है: (ई) पीएस पाइपलाइन का उपयोग इंटरपोलेशन = 'निकटतम' विकल्प को अनदेखा करना प्रतीत होता है, यानी अंतिम पीडीएफ में छवि धुंधली दिखाई देती है। सौभाग्य से, मैं इसके साथ रह सकता हूं, लेकिन इस मुद्दे को देखना दिलचस्प हो सकता है।

संबंधित मुद्दे