我正在try 制作一张罗宾逊投影 map ,该 map not以经度0为中心,并横跨180°线的两侧.
我的代码如下:
library("rnaturalearthdata")
world <- ne_countries(scale = "medium", returnclass = "sf")
robinson = "+proj=robin +lon_0=-90 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"
transformed = st_transform(world, robinson)
ggplot(data=transformed) + geom_sf(fill = "gray", colour = "black")+theme_bw()
这将生成该 map ,该 map 的方向是正确的,只是所有分割的边界都是"由内而外"的,并覆盖整个 map .
这是9年前的related question,但我希望随着最近的包更新,有一个不那么复杂的解决方案,它将允许我们使用geom_point()
绘制我们的经纬度/经度数据点,而不需要额外的转换.
编辑#2:L.Tyrone的解决方案很适合我.要使用此方法绘制点,您必须将它们从数据框转换为具有相同坐标参考系的SF对象,否则经度/经度将被解释为米,最终与0,0无法区分:
# Transform with fake data...
fakedata=data.frame(lat=c(-10,-20,80),lon=c(45,-100,120),tag=c("indian","tropical","arctic"))
transpoint = st_as_sf(fakedata,coords=c("lon","lat"),crs=4326)
dtran = st_transform(transpoint,robinson)
然后,您可以通过将特殊的geometry=
和stat=
声明添加到geom_point
甚至geom_text_repel
来绘制它们:
geom_point(data=dtran,aes(geometry=geometry,color=tag),stat="sf_coordinates") +
geom_text_repel(data=dtran,aes(geometry=geometry,label=tag),stat="sf_coordinates")