2014-05-12 18 views
2

我試圖圍繞matplotlibbasemap API進行打包。我想要做的是在圓柱投影上繪製一個非常小的區域(每個方向幾公里)的緯度和經度數據。在matplotlib底圖中設置數據限制

的問題是,我無法理解如何llcrnrlonllcrnrlaturcrnrlonurcrnrlat參數的構造函數Basemap工作。

據我的理解,llcrnrlon是西部最經度和llcrnrlat是南方最緯度和urcrnrlonurcrnrlat是東部最北和最經度和緯度分別。

在所有這些情況下,給定一組座標後,(數值上)最小的經度是最西部,最小的緯度是最南部,反之亦然。這種理解是否正確?

我可以通過在底層Axes對象上設置xlim和ylim來獲得圖表的工作方式,但是在底圖構造函數中使用相同的值似乎會將我的數據從圖上移開。

EDIT:請參閱以下代碼的問題的再現:

from matplotlib import pyplot 
from mpl_toolkits import basemap 
import random 

lat_bounds = 52.063443, 52.072587 
long_bounds = 1.010408, 1.024502 

ax1 = pyplot.subplot(121) 
ax2 = pyplot.subplot(122) 
ax1.set_title('With ll* rr*') 
ax2.set_title('With default values') 

my_map1 = basemap.Basemap(projection='cyl', llcrnrlat=lat_bounds[0], llcrnrlon=long_bounds[0], 
      urcrnrlat=lat_bounds[1], urcrnrlon=long_bounds[1], ax=ax1) 

my_map2 = basemap.Basemap(projection='cyl', ax=ax2) 

data_lats = [random.uniform(*lat_bounds) for i in xrange(50)] 
data_lons = [random.uniform(*long_bounds) for i in xrange(50)] 

my_map1.plot(data_lats, data_lons) 
my_map2.plot(data_lats, data_lons) 

pyplot.show() 

在下面的圖中,右側圖像通過使用Basemap(projection='cyl')和左手側圖像製作是通過使用由Basemap(projection='cyl', llcrnrlat=lat_bounds[0], llcrnrlon=long_bounds[0], urcrnrlat=lat_bounds[1], urcrnrlon=long_bounds[1], ax=ax1)

注意右側圖像中的點,當使用matplotlib工具欄進行縮放時,點將成爲第二個圖像。

Notice the dot in the right hand side image Right hand side image zoomed

+0

你是對的參數。 'llcrnrlon'代表「左下角經度」等。此外,''cyl''(柱面)是「投影」關鍵字的默認值,因此您處於正確的軌道上。你確實需要注意諸如反斜槓(180E)之類的事情。你可以發佈你想要繪製的值嗎? –

+0

另外,手動設置'ax1.set_xlim(* lat_bounds)'和'ax1.ylim(* long_bounds)'也有訣竅。 –

+0

@ThomChubb:請參閱編輯後。 –

回答

2

在您的示例代碼的問題是,你是在傳遞參數給Basemap.plot()走錯了路。到Basemap.plot的參數是完全一樣的那些matplotlib.pyplot.plot,即:

plot(x,y,*args,**kwargs) 

在圓柱座標,經度是x座標和緯度爲縱座標,所以你應該做mymap1.plot(data_lons, data_lats)。在你的第二個例子中它似乎起作用的原因是〜52的經度和〜1的緯度是有意義的。這些點是繪製的,但遠離你的領域。如果您將ax1的窗口移動得足夠遠,您可能會看到它們(與ax.set_xlim(lat_bounds)ax.set_ylim(lon_bounds)相同)。

+0

那真是個好地方!我永遠不會找到它! –

+0

按照慣例,在GIS和製圖中,順序是(lat,lon)......這讓我很頭疼。 –