在 "maps" 包的 R 中使用带有 xlim/ylim 的投影会产生更大的地图
Using a projection with xlim/ylim in R with the "maps" package results in a bigger map
我将 R 与 maps/mapproject/maptools 包一起使用来绘制一些地图,并注意到一种行为对我来说似乎违反直觉,实际上限制了我的能力。
绘制欧洲地图(使用 ETRS89 / ETRS-LCC 的限制,因此不包括冰岛并且也在东部剪裁)但不指定任何投影:
library(maps)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T)
结果符合预期,正在使用限制,生成的地图也遵循这些限制。
根据帮助,地图默认使用的投影是:
The default is to use a rectangular projection with the aspect ratio
chosen so that longitude and latitude scales are equivalent at the
center of the picture.
这不是满足我需求的好投影,我将使用 LCC 投影和上面所示的平行线 spatialreference.org link:
library(maps)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65))
box()
结果出乎意料,因为它包含了更大的区域(向北很远,包括俄罗斯),基本上使地图无法使用。
奇怪的是,使用网格时会清楚地考虑原始限制:
library(maps)
library(mapproj)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65))
map.grid(cex=0.1 , col="grey30")
box()
我想要的(我假设是上述代码的结果)是一个矩形裁剪,其中包括我指定的限制(由于使用的投影进行了调整,因此比矩形的面积更大以上将是预期的)。此外,地图和边界周围有一个白色 space,每当使用 map() 进行投影时,它就会出现。
问题是:有没有办法在使用map/mapproj/maptools时得到这个结果?我试图人为地改变 xlim/ylim 但没有很好的结果,因为它似乎在很大的间隔内起作用(即改变它们不会产生效果,直到欧洲的一半突然随着下一次减少而消失)。
spatialreference.org 上给出的边界为 "bottom left, top right coordinate",巧合的是,它与您写的非常接近。正确地,这些坐标将是:
xlim=c(-10.6700,31.5500), ylim=c(34.5000,71.0500)
但这似乎不是这里的问题。
研究第二个 xlim
参数,似乎 map()
试图包括相邻的线,只要其中一些线的坐标在限制范围内。俄罗斯国家(这导致第二个 xlim
参数在 29-31 左右大幅跃升)以及一些非洲和东欧国家。打开和关闭 boundary
在某种程度上证实了这一点,但这隐藏了很多国家的边界。
我发现的一个解决方法是首先明确排除邻国。然后使用 add=T
再次绘制地图。在第一张图上使用col="white"
,不要在同一个地方画两次,这样会使线条变粗。
library(maps)
library(mapproj)
map("world",regions="(?!Russia|Morocco|Algeria|Tunisia|Turkey|Ukraine)",col="white",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775))
map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775),add=T)
map.grid(cex=0.1, col="grey30")
box()
由于 xlim
和 ylim
,似乎仍然缺少一些行,删除这些行将再次包括冰岛和其他国家和岛屿。或者也许有更好的方法。
"map()" 的基本行为是提取 xlim 和 ylim 中的所有行,但也会从数据库中提取部分在域中的行。当没有投影时,xlim和ylim也被用作绘图的限制,但是当数据被投影时,这显然不起作用。 (您不能简单地投影 xlim 和 ylim,因为这不是矩形域)。地图代码不够复杂,无法找到一个好的解决方案,只是将绘图限制设置为数据范围(包括任何不需要的线条)。作为 'maps' 的(最近)维护者,这实际上是我可能会尝试修复的问题。不幸的是,mapproj 不包括逆向投影,而逆向投影需要像您期望的那样正确地进行。将地图限制在底部(而不是在顶部扩展)要容易得多。
作为解决方法,您还可以尝试以下操作(使用地图的输出值):
mymap <- map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), projection="lambert", parameters=c(10.44,52.775), plot=FALSE)
现在可以查看mymap$x和mymap$y的范围了:
range(mymap$x, na.rm=TRUE)
或 plot(mymap)
查看范围并决定您需要的间隔。
然后,最后,您可以绘制一张具有您想要的限制的地图,例如
plot(mymap, type="l", asp=1,xaxt="n",yaxt="n",xlab="",ylab="", xlim=c(-0.2,0.15), ylim=c(-0.75,-0.35))
不理想,但希望足够好。 "asp=1" 是为了保持地图上的纵横比正确,即使您调整图的大小 window。
我将 R 与 maps/mapproject/maptools 包一起使用来绘制一些地图,并注意到一种行为对我来说似乎违反直觉,实际上限制了我的能力。
绘制欧洲地图(使用 ETRS89 / ETRS-LCC 的限制,因此不包括冰岛并且也在东部剪裁)但不指定任何投影:
library(maps)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T)
结果符合预期,正在使用限制,生成的地图也遵循这些限制。
根据帮助,地图默认使用的投影是:
The default is to use a rectangular projection with the aspect ratio
chosen so that longitude and latitude scales are equivalent at the
center of the picture.
这不是满足我需求的好投影,我将使用 LCC 投影和上面所示的平行线 spatialreference.org link:
library(maps)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65))
box()
结果出乎意料,因为它包含了更大的区域(向北很远,包括俄罗斯),基本上使地图无法使用。
奇怪的是,使用网格时会清楚地考虑原始限制:
library(maps)
library(mapproj)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65))
map.grid(cex=0.1 , col="grey30")
box()
我想要的(我假设是上述代码的结果)是一个矩形裁剪,其中包括我指定的限制(由于使用的投影进行了调整,因此比矩形的面积更大以上将是预期的)。此外,地图和边界周围有一个白色 space,每当使用 map() 进行投影时,它就会出现。
问题是:有没有办法在使用map/mapproj/maptools时得到这个结果?我试图人为地改变 xlim/ylim 但没有很好的结果,因为它似乎在很大的间隔内起作用(即改变它们不会产生效果,直到欧洲的一半突然随着下一次减少而消失)。
spatialreference.org 上给出的边界为 "bottom left, top right coordinate",巧合的是,它与您写的非常接近。正确地,这些坐标将是:
xlim=c(-10.6700,31.5500), ylim=c(34.5000,71.0500)
但这似乎不是这里的问题。
研究第二个 xlim
参数,似乎 map()
试图包括相邻的线,只要其中一些线的坐标在限制范围内。俄罗斯国家(这导致第二个 xlim
参数在 29-31 左右大幅跃升)以及一些非洲和东欧国家。打开和关闭 boundary
在某种程度上证实了这一点,但这隐藏了很多国家的边界。
我发现的一个解决方法是首先明确排除邻国。然后使用 add=T
再次绘制地图。在第一张图上使用col="white"
,不要在同一个地方画两次,这样会使线条变粗。
library(maps)
library(mapproj)
map("world",regions="(?!Russia|Morocco|Algeria|Tunisia|Turkey|Ukraine)",col="white",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775))
map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775),add=T)
map.grid(cex=0.1, col="grey30")
box()
由于 xlim
和 ylim
,似乎仍然缺少一些行,删除这些行将再次包括冰岛和其他国家和岛屿。或者也许有更好的方法。
"map()" 的基本行为是提取 xlim 和 ylim 中的所有行,但也会从数据库中提取部分在域中的行。当没有投影时,xlim和ylim也被用作绘图的限制,但是当数据被投影时,这显然不起作用。 (您不能简单地投影 xlim 和 ylim,因为这不是矩形域)。地图代码不够复杂,无法找到一个好的解决方案,只是将绘图限制设置为数据范围(包括任何不需要的线条)。作为 'maps' 的(最近)维护者,这实际上是我可能会尝试修复的问题。不幸的是,mapproj 不包括逆向投影,而逆向投影需要像您期望的那样正确地进行。将地图限制在底部(而不是在顶部扩展)要容易得多。
作为解决方法,您还可以尝试以下操作(使用地图的输出值):
mymap <- map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), projection="lambert", parameters=c(10.44,52.775), plot=FALSE)
现在可以查看mymap$x和mymap$y的范围了:
range(mymap$x, na.rm=TRUE)
或 plot(mymap)
查看范围并决定您需要的间隔。
然后,最后,您可以绘制一张具有您想要的限制的地图,例如
plot(mymap, type="l", asp=1,xaxt="n",yaxt="n",xlab="",ylab="", xlim=c(-0.2,0.15), ylim=c(-0.75,-0.35))
不理想,但希望足够好。 "asp=1" 是为了保持地图上的纵横比正确,即使您调整图的大小 window。