2013-04-17 9 views
12

में साजिश कैनवास का आकार सेट करना मैं मैटलप्लिब/पाइपप्लॉट को लगातार कैनवास आकार के साथ प्लॉट जेनरेट करना चाहता हूं। यही है, आंकड़े अक्ष विवरणों को समायोजित करने के लिए अलग-अलग आकार हो सकते हैं, लेकिन साजिश क्षेत्र (आयताकार जिसमें घुमाव खींचा जाता है) हमेशा एक ही आकार होना चाहिए।Matplotlib

क्या यह हासिल करने का कोई आसान तरीका है? Pyplot.figure() का विकल्प अंजीर आंकड़े का समग्र आकार सेट करता है, कैनवास की नहीं, इसलिए जब भी अक्ष विवरण में कम या ज्यादा जगह होती है तो मुझे एक अलग कैनवास आकार मिलता है।

+0

यह संभव है कि 'gridspec' आपको जो भी चाहिए उसे नियंत्रित करने की अनुमति देता है (अंतिम 3 [यहां उदाहरण देखें] (http://matplotlib.org/examples/pylab_examples/demo_tight_layout.html))। क्या आप कुछ उदाहरण जोड़ सकते हैं जो विभिन्न अक्ष विवरण दिखाते हैं जो समस्याएं पैदा करते हैं? – Bonlenfum

+0

यह एक तरीका है कि एमपीएल डी-जोड़ों को क्या आकर्षित करना है और इसे आकर्षित करने के लिए _how_ का वर्णन करता है। बहुत यकीन है कि हाथ से यह कर रहे हैं, और 'tight_layout' से बचने के लिए अध्ययन कर रहे हैं, इसके साथ जाने का सबसे अच्छा तरीका है। – tacaswell

उत्तर

12

यह मैटलप्लिब के साथ मेरी सबसे बड़ी निराशाओं में से एक है। मैं अक्सर रास्टर डेटा के साथ काम करता हूं जहां उदाहरण के लिए मैं एक रंगरूप, किंवदंती और कुछ शीर्षक जोड़ना चाहता हूं। ऐसा करने के लिए matplotlib गैलरी से कोई भी सरल उदाहरण परिणामस्वरूप एक अलग संकल्प होगा और इसलिए डेटा को दोबारा बदल दिया जाएगा। विशेष रूप से जब छवि विश्लेषण करते हैं तो आप किसी भी (अवांछित) resampling नहीं चाहते हैं।

यहां मैं आमतौर पर ऐसा करता हूं, हालांकि मुझे यह जानना अच्छा लगेगा कि सरल या बेहतर तरीके हैं या नहीं।

import matplotlib.pyplot as plt 
import urllib2 

# load the image 
img = plt.imread(urllib2.urlopen('http://upload.wikimedia.org/wikipedia/en/thumb/5/56/Matplotlib_logo.svg/500px-Matplotlib_logo.svg.png')) 

# get the dimensions 
ypixels, xpixels, bands = img.shape 

# get the size in inches 
dpi = 72. 
xinch = xpixels/dpi 
yinch = ypixels/dpi 

# plot and save in the same size as the original 
fig = plt.figure(figsize=(xinch,yinch)) 

ax = plt.axes([0., 0., 1., 1.], frameon=False, xticks=[],yticks=[]) 
ax.imshow(img, interpolation='none') 

plt.savefig('D:\\mpl_logo.png', dpi=dpi, transparent=True) 

ध्यान दें कि मैं स्वयं कुल्हाड़ियों स्थिति परिभाषित ताकि पूरे आंकड़ा तक फैला:

एक तस्वीर लोड हो रहा है और यह सिर्फ outputting के रूप में यह एक ही संकल्प के साथ है के साथ शुरू करते हैं।

उसी तरह से ऊपर के रूप में आप लेबल या colorbars आदि

यह उदाहरण के लिए अनुमति देने के लिए छवि के चारों ओर कुछ मार्जिन जोड़ सकता है में छवि है, जो तब एक शीर्षक की साजिश रचने के लिए प्रयोग किया जाता है ऊपर एक 20% मार्जिन कहते हैं:

fig = plt.figure(figsize=(xinch,yinch/.8)) 

ax = plt.axes([0., 0., 1., .8], frameon=False, xticks=[],yticks=[]) 
ax.imshow(img, interpolation='none') 
ax.set_title('Matplotlib is fun!', size=16, weight='bold') 

plt.savefig('D:\\mpl_logo_with_title.png', dpi=dpi) 

तो आंकड़ा वाई-आकार (ऊंचाई) बढ़ी है और अक्ष का वाई-आकार समान रूप से कम हो गया है। यह एक बड़ी (समग्र) आउटपुट छवि देता है, लेकिन अक्ष क्षेत्र अभी भी वही आकार होगा।

यह अच्छा हो सकता है कि एक वास्तविक 1-ऑन-एक्स आउटपुट को मजबूर करने के लिए .set_scale() जैसी आकृति या अक्ष गुण हो।

+0

क्या आप इसके बजाय कुछ वेक्टर प्रारूप का उपयोग कर सकते हैं? यह _should_ (मुझे लगता है) प्रत्येक पिक्सेल को एक आयताकार के रूप में खींचें। या नमूना पर सिर्फ _way_। – tacaswell

+2

धन्यवाद, आपका सुझाव काम किया! वैसे, मुझे लगता है कि मुझे चित्र() को कॉल करने के तुरंत बाद subplot_adjust (0,0,1,1) का उपयोग करके थोड़ा अधिक सुरुचिपूर्ण तरीका मिला। फिर, आपको अक्ष की स्थिति को परिभाषित करने की आवश्यकता नहीं है क्योंकि वे पहले से ही आंकड़े के रूप में बड़े हैं। अंत में, यदि आप मार्जिन मैन्युअल रूप से निर्दिष्ट नहीं करना चाहते हैं तो आप savefig() को तर्क bbox_inches = 'tight' के साथ कॉल कर सकते हैं। इस मामले में, साजिश क्षेत्र वास्तव में परिभाषित किया जाएगा (xinch, yinch) और यह आंकड़ा अक्ष विवरणों को समायोजित करने के लिए पर्याप्त होगा। (जैसा कि टीसीएसवेल द्वारा इंगित किया गया है, tight_layout का उपयोग न करें!) – Dario

+0

यह वास्तव में आसान लगता है, सुझावों के लिए धन्यवाद। मैं बाद में आपके सुझावों का प्रयास करूंगा। @tcaswell, धन्यवाद, यह कुछ स्थितियों में काम कर सकता है, मुझे लगता है कि रंगीन आसानी से ऐसा करने में सक्षम होना चाहिए। हालांकि कोई अन्य पोस्ट-प्रोसेसिंग अधिक कठिन होगी। –