好的。对于任何关心的人,我有一个答案。也许不是最好的答案,而是一个答案。问题是有两种常用的方式来表示纬度和经度:度数和弧度。还有第三种常用的表示经度的方式:本地时间,即时区时间一般化为浮点数。然后,为了让生活更有趣,经度通常被指定为 -180(东)到 180(西)或 0 到 360。
现在,当您尝试显示地图时,R 会根据地图包的内部结构自动选择显示的纬度单位。如果您在一组单位中工作,但 R 想要在另一组中显示地图,您会遇到麻烦。另一个问题是不同的地图投影要以不同的单位显示。正如我所发现的,“默认”投影喜欢度数;它希望显示在一个绘图矩形中,经度限制为 -180 到 180,纬度限制为 -90 到 90。但是,“矩形”投影虽然看起来很像默认投影,但它喜欢弧度;它希望显示在一个将 -pi 拉伸到 pi(经度)和 -pi/2 到 pi/2(纬度)的矩形中。 这些绘图限制在 ?mapproject 中根本没有讨论。
所以这就是你需要做的:1)确定你想要的地图投影,然后确定它的绘制范围:
> map(projection=foo,parameters=foo)
> par('usr') # will return vector of plot limits
2)知道你自己的数据所用的单位。如果你刚刚抓取了别人的数据集,你可能会在这里感到惊讶。
3)当你绘制......
filled.contour(lons, lats, glb.data)
如果您的“lons”和“lats”的单位与您的投影预期的限制一致,那么您应该没问题,您应该能够简单地添加一张地图
filled.contour(lons, lats, glb.data,
plot.axes={axis(1,...);axis(2,...);map(projection=foo,parameters=foo,add=T)})
但是,如果您的 lons 和 lats不是投影所需的,那么您还有更多工作要做。您必须通过调用 par() 重新定义绘图的限制。这对我有用:
filled.contour(lons, lats, glb.data,
plot.axes={axis(1,...);axis(2,...);par(usr=c(-180,180,-90,90));
map(add=T)})
当我需要绘图左端的本初子午线时(即,x 轴上的经度从 0 到 360 增加)我对 par() 和 map() 进行了两次调用:
filled.contour(lons, lats, glb.data,
plot.axes={axis(1,...);axis(2,...);
par(usr=c(0,360,-90,90));map(add=T); #eastern hemisphere
par(usr=c(-360,0,-90,90));map(add=T)} #western
)
还有一些其他的皱纹。(例如,“矩形”投影没有精确的 -pi 和 +pi 限制。)但是如果我到目前为止所说的有道理,那么您将能够处理它们。