2013-07-17 41 views
0

我已使用該代碼來繪製3個數字與普通彩條:劇情3個數字與普通彩條通過使用底圖

grid_top = ImageGrid(fig, 211, nrows_ncols = (1, 3), 
        cbar_location = "right",  
        cbar_mode="single", 
        cbar_pad=.2) 

for n in xrange(3): 
    im1 = grid_top[n].pcolor(data_top[n], 
         interpolation='nearest', vmin=0, vmax=5) 

plt.show() 

我想使用底圖繪製正投影,我定義爲:

m=Basemap(projection='ortho',lon_0=lon_0,lat_0=lat_0,resolution='l', 
      llcrnrx=0.,‌​llcrnry=0.,urcrnrx=m1.urcrnrx/2.,urcrnry=m1.urcrnry/2.) 

的時候,我改變上面的代碼如下:

im1 = grid_top[n].m.pcolor(data_top[n], interpolation='nearest', vmin=0, vmax=5) 

我得到一個錯誤..

爲了使其與Basemap協同工作,我需要做些什麼改變?

謝謝

回答

2

嗯,這是一個有點難以診斷的具體錯誤沒有看到你得到錯誤信息,但我給它一個去。

當您調用Basemap()時,它將地圖繪製到當前活動的Axes實例,但是當使用ImageGrid()定義座標軸並然後循環時,它們都不會處於活動狀態。您可以隨時使用plt.sca()(設置當前軸)激活現有軸實例。

要最終確定顏色條,您需要在使用pcolor()imshow()實際繪製某些數據之後調用colorbar()實例。

這裏是你想實現我想工作的例子:

data_top = [] 
for i in range(3): 
    data_top.append(np.random.random((5,5))) 


fig = plt.figure(1,(8.,8.)) 

grid_top = ImageGrid(fig, 211, nrows_ncols = (1, 3), 
        cbar_location = "right", 
        cbar_mode="single", 
        cbar_pad=.2) 

for g, d in zip(grid_top,data_top): 
    plt.sca(g) 
    M = Basemap(projection='ortho',lon_0=10.0,lat_0=50.0,resolution='l') 
    M.drawcoastlines() 
    M.drawparallels(np.arange(-90.,120.,30.)) 
    M.drawmeridians(np.arange(0.,360.,60.)) 
    I = M.imshow(d,vmin=0,vmax=1,interpolation="nearest") 
grid_top.cbar_axes[0].colorbar(I) 

Some ugly maps, but you get the idea.

+0

這並不能保證彩條將是足夠寬,不是嗎?如果第一個或第二個繪圖的顏色範圍比最後一個(它變成I)更寬? – naught101

+0

@ naught101根據提問者的代碼,我只用了三個相同的硬編碼'vmin'和'vmax'。你是對的,這並不能保證相對於數據的合理比例,但在三個圖中是一致的。 – Deditos

+0

在沒有硬編碼的情況下,有沒有一種方法可以確保一致性?或者它基本上是手動獲取最小/最大值的問題? – naught101