2015-11-26 13 views
11

Bir alt örnek örneği (matplotlib.axes._subplots.AxesSubplot) alan ve projeksiyonunu başka bir projeksiyona, örneğin cartopy.crs.CRS projeksiyonlarından birine dönüştüren basit bir işlev oluşturmaya çalışıyorum.Matplotlib'in varolan bir eksenin alt alan projeksiyonunu nasıl değiştiririm?

fikri Tabii bu

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) 

gibi bir şey, sadece fig.add_subplot() işlevini kullanabilirsiniz görünür:

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

ama subplot eksenini değiştirmek için uygun bir matplotlib yöntem olup olmadığını merak'dan sonra projeksiyon tanımlanmıştır. Matplotlib API okuma maalesef yardımcı olmadı.

cevap

14

Varolan bir eksenin projeksiyonunu değiştiremezsiniz, nedeni aşağıda verilmiştir. Ancak, temel sorununuza çözüm, here matplotlib belgelerinde açıklanan plt.subplots()subplot_kw bağımsız değişkenini kullanmaktır. tüm subplots isteseydi Örneğin, bir eksenler seti her biri için farklıdır almak eksenleri sınıfını belirler oluştururken bir projeksiyon belirterek, gerçek soruya gelince

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()}) 

yapabilirdi cartopy.crs.PlateCarree çıkıntıya sahip olması projeksiyon tipi. Örneğin

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

için bu kod her eksenler aslında farklı bir sınıfının bir örneğidir nasıl takip

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

Bildirimi yazdırılır.

+3

Teşekkürler! Ve sadece onaylamak için, 'projection' anahtar sözcüğü, tüm subplots için bir kerede sınıf belirler, bu yüzden' subplot_kw' içinde birkaç projeksiyon geçmek için bir yolu yoktur? E.g. 'plt.subplots (ncols = 2)' tarafından oluşturulan bir alt-küme kümesinin ikinci sütunu için projeksiyon = 'polar' 've ilk sütun ve' projection = ccrs.PlateCarree() '? –

+0

'subplot_kw''deki anahtar kelimeler her bir eksene aktarılır, bu yüzden açıkladığınız şeyi yapabileceğinizi düşünmüyorum. 'Subplots' işlevi, temel kullanım durumunu karşılamak için bir kolaylık sağlayan bir sarıcıdır, eğer daha fazla bir şeye ihtiyacınız varsa,' add_subplot' veya benzeri kullanılarak kendi sarmalayıcı fonksiyonunuzu yazabilirsiniz. – ajdawson

+0

ImageGrid ile bunu yapmanın bir yolu var mı? ImageGrid'in izin verdiği harita aralığı ve colorbar yerleşimi üzerinde denetim sahibi olmak güzel olurdu, ancak kılavuzdaki alt piksellerin projeksiyonunu ayarlamanın bir yolunu görmüyorum. –

İlgili konular