我想在填充的轮廓中绘制一些纬度数据,然后在顶部叠加地球地图。 我正在尝试这样的事情:
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)}
)
在这种情况下,地图根本不绘制,我收到一条错误消息"没有什么可画的:所有区域都超出范围"人们显然一直成功地做到这一点,但我无法让它发挥作用。 谁能告诉我我做错了什么? 顺便说一句,我不想使用格子包。 它不适用于我的小组正在做的其他事情。 谢谢。
好的,对于任何关心的人,我有一个答案。 也许不是最好的答案,而是一个答案。 问题是有两种常见的方法来表示纬度和经度:度和弧度。 还有第三种常用的经度表示方式:本地时间,即广义为浮点数的时区时间。 然后,为了使生活更有趣,以度为单位的经度通常为 -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 和 lat 不是投影需要的,那么您还有更多工作要做。 你必须通过调用 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 的限制。 但是,如果我到目前为止所说的是有道理的,你将能够处理它们。
为什么不直接使用 image
?
image(lons, lats, glb.data)
library(maps)
map(add = TRUE)
你从哪里得到尝试将map()
放在plot.axes
论点中的想法?