在Matplotlib Basemap中设置数据限制

3
我正在尝试理解matplotlib的basemap API。我想要做的是在圆柱形投影上绘制一个非常小的区域(每个方向几公里)的纬度和经度数据。
问题是,我无法理解Basemap构造函数中llcrnrlon、llcrnrlat、urcrnrlon和urcrnrlat参数的工作原理。
据我所知,llcrnrlon是最西端的经度,llcrnrlat是最南端的纬度,而urcrnrlon和urcrnrlat则分别是最东端和最北端的经度和纬度。
在所有这些情况下,给定一组坐标,最小的经度是最西端,最小的纬度是最南端,反之亦然。我的理解正确吗?
我可以通过在底层Axes对象上设置xlim和ylim来使绘图正常工作,但是在basemap构造函数中使用相同的值似乎会将我的数据推出图形。
编辑:请参见以下代码以重现问题:
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工具栏进行缩放后变成了第二张图像。 注意右侧图像中的点 右侧图像缩放

关于参数,你是正确的。llcrnrlon代表“左下角经度”,以此类推。另外,“cyl”(圆柱形)是projection关键字的默认值,所以你走在了正确的轨道上。但你需要注意一些事情,比如绘制跨越反子午线(180度东经)的图形。你能发布你要绘制的数值吗? - Thom Chubb
此外,手动设置 ax1.set_xlim(*lat_bounds)ax1.ylim(*long_bounds) 也可以解决问题。 - Chinmay Kanchi
@ThomChubb:请查看已编辑的帖子。 - Chinmay Kanchi
1个回答

4
您的示例代码中存在的问题是您将参数传递给了 Basemap.plot() 的错误位置。Basemap.plot 的参数与 matplotlib.pyplot.plot 的参数完全相同,即:
plot(x,y,*args,**kwargs)

在圆柱坐标系中,经度是x坐标,纬度是y坐标,所以你应该使用 mymap1.plot(data_lons, data_lats)。之所以在第二个示例中似乎可以工作,是因为 ~52 的经度和 ~1 的纬度是有意义的。这些点已经被绘制出来了,但它们位于远离你的领域的某个地方。如果你将 ax1 窗口滚动到足够远的位置,你就可以看到它们(这与执行 ax.set_xlim(lat_bounds)ax.set_ylim(lon_bounds) 是相同的)。

那真是个好发现!我永远也找不到它! - Chinmay Kanchi
是的,在GIS和制图中,惯例是(纬度,经度)的顺序...这曾经让我头疼过。 - Thom Chubb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接