在matplotlib basemap中设置数据限制

3 投票
1 回答
4246 浏览
提问于 2025-04-18 06:19

我正在努力理解 matplotlibbasemap 接口。我想做的是在一个非常小的区域(大约几公里)上绘制经纬度数据,并使用圆柱投影。

问题是,我不太明白 Basemap 构造函数中的 llcrnrlonllcrnrlaturcrnrlonurcrnrlat 这些参数是怎么工作的。

根据我的理解,llcrnrlon 是最西边的经度,llcrnrlat 是最南边的纬度,而 urcrnrlonurcrnrlat 则分别是最东边和最北边的经度和纬度。

在所有这些情况下,给定一组坐标,数值上最小的经度是最西边的,最小的纬度是最南边的,反之亦然。我的理解正确吗?

我可以通过在底层的 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 工具栏放大时,它变成了第二张图。

注意右侧图像中的点 右侧图像放大

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) 是一样的)。

撰写回答