2015-11-26 8 views
11

मैं एक सरल फ़ंक्शन बनाने की कोशिश कर रहा हूं जो एक सबप्लॉट उदाहरण (matplotlib.axes._subplots.AxesSubplot) लेता है और इसके प्रक्षेपण को दूसरे प्रक्षेपण में बदलता है, उदाहरण के लिए, cartopy.crs.CRS अनुमानों में से एक के लिए।मैं मौजूदा अक्ष के matplotlib के सबप्लॉट प्रोजेक्शन को कैसे बदलूं?

विचार लग रहा है इस

import cartopy.crs as ccrs 
import matplotlib.pyplot as plt 

def make_ax_map(ax, projection=ccrs.PlateCarree()): 
    # set ax projection to the specified projection 
    ... 
    # other fancy formatting 
    ax2.coastlines() 
    ... 

# Create a grid of plots 
fig, (ax1, ax2) = plt.subplots(ncols=2) 
# the first subplot remains unchanged 
ax1.plot(np.random.rand(10)) 
# the second one gets another projection 
make_ax_map(ax2) 

बेशक तरह कुछ, मैं सिर्फ fig.add_subplot() फ़ंक्शन का उपयोग कर सकते हैं:

fig = plt.figure(figsize=(10,5)) 
ax1 = fig.add_subplot(121) 
ax1.plot(np.random.rand(10)) 

ax2 = fig.add_subplot(122,projection=ccrs.PlateCarree()) 
ax2.coastlines() 

लेकिन अगर वहाँ एक उचित matplotlib एक subplot अक्ष बदलने की विधि मैं सोच रहा था प्रक्षेपण के बाद इसे परिभाषित किया गया था। Matplotlib एपीआई पढ़ना दुर्भाग्य से मदद नहीं की थी।

उत्तर

14

आप मौजूदा अक्षों के प्रक्षेपण को नहीं बदल सकते हैं, कारण नीचे दिया गया है। हालांकि आपकी अंतर्निहित समस्या का समाधान subplot_kw तर्क plt.subplots() पर मैटलप्लिब दस्तावेज़ here में वर्णित है। उदाहरण के लिए, यदि आप अपने सभी subplots चाहता था cartopy.crs.PlateCarree प्रक्षेपण आप

import matplotlib.pyplot as plt 
import cartopy.crs as ccrs 

# Create a grid of plots 
fig, (ax1, ax2) = plt.subplots(ncols=2, subplot_kw={'projection': ccrs.PlateCarree()}) 

कर सकता है वास्तविक प्रश्न के बारे में है, एक प्रक्षेपण निर्दिष्ट करने के लिए जब आप बनाने के एक कुल्हाड़ियों सेट कुल्हाड़ियों वर्ग आप प्राप्त है, जो प्रत्येक के लिए अलग है निर्धारित करता है प्रक्षेपण प्रकार। उदाहरण

import matplotlib.pyplot as plt 
import cartopy.crs as ccrs 

ax1 = plt.subplot(311) 
ax2 = plt.subplot(312, projection='polar') 
ax3 = plt.subplot(313, projection=ccrs.PlateCarree()) 

print(type(ax1)) 
print(type(ax2)) 
print(type(ax3)) 

के लिए इस कोड को प्रिंट होगा निम्नलिखित

<class 'matplotlib.axes._subplots.AxesSubplot'> 
<class 'matplotlib.axes._subplots.PolarAxesSubplot'> 
<class 'cartopy.mpl.geoaxes.GeoAxesSubplot'> 

सूचना कैसे प्रत्येक कुल्हाड़ियों वास्तव में एक अलग वर्ग का एक उदाहरण है।

+3

धन्यवाद! और बस पुष्टि करने के लिए, 'प्रक्षेपण' कीवर्ड एक ही समय में सभी सबप्लॉट्स के लिए कक्षा निर्धारित करता है, इसलिए 'subplot_kw' में कई अनुमानों को पारित करने का कोई तरीका नहीं है? उदा। 'plt.subplots (ncols = 2) 'द्वारा बनाए गए सबप्लॉट सेट के दूसरे कॉलम के लिए पहले कॉलम के लिए प्रक्षेपण =' ध्रुवीय 'और' projection = ccrs.PlateCarree() '? –

+0

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

+0

क्या ImageGrid के साथ ऐसा करने का कोई तरीका है? मैड स्पेस और कलरबार प्लेसमेंट पर नियंत्रण रखने में सक्षम होना अच्छा होगा, जो कि इमेजग्रिड अनुमति देता है, लेकिन मुझे ग्रिड में सबप्लॉट्स के प्रक्षेपण को सेट करने का कोई तरीका नहीं दिखता है। –

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