2010-05-09 18 views
14

मैं प्रस्तुति के लिए उच्च गुणवत्ता वाले आरेख उत्पन्न करना चाहता हूं। मैं ग्राफिक्स उत्पन्न करने के लिए पाइथन के matplotlib का उपयोग कर रहा हूँ। दुर्भाग्यवश, पीडीएफ निर्यात मेरी फ़ॉन्ट सेटिंग्स को अनदेखा करता है।Matplotlib पीडीएफ निर्यात गलत फ़ॉन्ट का उपयोग करता है

मैंने पाठ ड्राइंग कार्यों में FontProperties ऑब्जेक्ट पास करके और वैश्विक स्तर पर विकल्प सेट करके फ़ॉन्ट को सेट करने का प्रयास किया। रिकॉर्ड के लिए, यहाँ समस्या को पुन: करने के लिए एक मेगावाट है:

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

मैं कर प्राप्त सही फ़ॉन्ट प्रदर्शित - लेकिन केवल दर्शक जीयूआई में। पीडीएफ आउटपुट एक बार फिर गलत है।

यह सुनिश्चित हो - मैं कर सकते हैं अन्य फोंट सेट - लेकिन फ़ॉन्ट परिवारों के ही अन्य वर्गों: मैं serif फोंट या fantasy या monospace सेट कर सकते हैं। लेकिन सभी सैन्स-सेरिफ़ फोंट हेल्वेटिका के लिए डिफ़ॉल्ट लगते हैं।

उत्तर

3

"परिवार" तर्क और संबंधित आरसी पैरामीटर फ़ॉन्ट का नाम निर्दिष्ट करने के लिए नहीं है वास्तव में इस तरह से उपयोग किया जा सकता है। एक (तर्कसंगत बारोक) सीएसएस जैसी फ़ॉन्ट चयन प्रणाली है जो विभिन्न कंप्यूटरों पर एक ही स्क्रिप्ट कार्य को उपलब्ध कराता है, उपलब्ध निकटतम फ़ॉन्ट का चयन करता है। उदाहरण के लिए आमतौर पर अनुशंसित तरीका गिल सैन्स इसे आरसी पैरामीटर font.sans-serif के मान के सामने जोड़ना है (sample rc file देखें), और उसके बाद font.family sans-serif पर सेट करें।

यह फ़ॉन्ट परेशान हो सकता है कि फ़ॉन्ट प्रबंधक कुछ अस्पष्ट कारणों का निर्णय लेता है कि गिल सैन्स आपके विनिर्देश के निकटतम मैच नहीं है। फ़ॉन्ट चयन तर्क को बाईपास करने का एक तरीका FontProperties(fname='/path/to/font.ttf') (docstring) का उपयोग करना है।

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

+0

आपने कहा, "परिवार" तर्क [फ़ॉन्ट] का नाम निर्दिष्ट करने के लिए नहीं है "- क्षमा करें लेकिन [प्रलेखन] (http://matplotlib.sourceforge.net/api/font_manager_api.html# matplotlib.font_manager.FontProperties) अलग-अलग कहता है: "आइटम ** ** में एक सामान्य फ़ॉन्ट परिवार का नाम शामिल हो सकता है [...]। ** उस मामले में **, उपयोग करने के लिए वास्तविक फ़ॉन्ट देखा जाएगा ... "(जोर मेरा)। इसके अलावा, * यह जीयूआई में * काम करता है। वैसे भी, मैं आपके प्रस्तावित समाधानों का प्रयास करूंगा। धन्यवाद। –

+1

'fname = ...' का उपयोग करके मुझे 'savefig'' कॉल करते समय 'embedTTFType3' में बैकएंड_पीडीएफटीवी की लाइन 776 में" ट्रूटाइप फ़ॉन्ट गायब है "पंक्ति में एक रनटाइम त्रुटि प्राप्त करें। मैं टीटीएफ और पीडीएफ के साथ घर पर नहीं हूं लेकिन मैंने * पहले से ही अन्य मार्गों के माध्यम से पीडीएफ में गिल सैन्स को एम्बेड किया है, इसलिए मुझे यकीन नहीं है कि यहां क्या अस्वस्थ है। –

+0

आप वास्तविक फ़ॉन्ट नामों को परिवार के तर्क के रूप में उपयोग करने के बारे में सही हैं। त्रुटि संदेश एक बग की तरह लगता है। कृपया Sourceforge ट्रैकर पर फ़ाइल करें, सटीक फ़ॉन्ट, matplotlib संस्करण और पूर्ण ट्रेसबैक का जिक्र करें। –

8

असल में, @ 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 कुंजी का उपयोग कर स्पष्ट रूप से सेट हो गया है कि। जाहिर है, fname संपत्ति के लिए rc सेटिंग नहीं है (कम से कम मुझे यह नहीं मिला)।

font के तत्काल में family कुंजी देना कड़ाई से जरूरी नहीं है, इसे पीडीएफ बैकएंड द्वारा अनदेखा किया जाएगा।

यह कोड केवल cairo बैकएंड के साथ काम करता है। MacOSX का उपयोग करना काम नहीं करेगा।

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