2

我想在填充轮廓中绘制一些经纬度数据,然后在顶部覆盖全球地图。我正在尝试这样的事情:

filled.contour(lons, lats, glb.data,
plot.axes={axis(1);axis(2);map(projection='rectangular',parameters=0,add=T)}
)

等高线绘制得很好,地图也显示出来了,但只是在等高线图的一小块区域中显示为一个非常小的黑色矩形。当然,我希望地图能够覆盖填充等高线图的整个区域。

我也尝试过类似的东西:

filled.contour(lons, lats, glb.data,
plot.axes={axis(1);axis(2);map(projection='rectangular',x=lons,y=lats,parameters=0,add=T)}
)

在这种情况下,地图根本没有绘制,并且我收到一条错误消息“没有可绘制的内容:所有区域超出范围”人们显然一直都成功地做到了这一点,但我无法让它工作。谁能告诉我我做错了什么?顺便说一句,我不想​​使用 lattice 包。它不适用于我小组正在做的其他事情。谢谢。

4

2 回答 2

3

好的。对于任何关心的人,我有一个答案。也许不是最好的答案,而是一个答案。问题是有两种常用的方式来表示纬度和经度:度数和弧度。还有第三种常用的表示经度的方式:本地时间,即时区时间一般化为浮点数。然后,为了让生活更有趣,经度通常被指定为 -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 限制。)但是如果我到目前为止所说的有道理,那么您将能够处理它们。

于 2012-08-14T00:41:07.357 回答
1

为什么不直接使用image

image(lons, lats, glb.data)
library(maps)
map(add = TRUE)

您从哪里得到尝试提出论点map()的想法?plot.axes

于 2012-08-09T22:26:39.477 回答