在ggplot2中转换rworldmap

在ggplot2中转换rworldmap,r,ggplot2,rworldmap,R,Ggplot2,Rworldmap,我有一张ggplot地图(由几何多边形、直线、点和线段组成)。最初的单位是WGS,所有单位都是纬度/经度。所有附加数据(直线和点)也以度为单位。我想把整个物体重新转换成一个等面积投影(Mollweide)。第一步(变换底层rworldmap多边形)相当轻松,尽管有一些奇怪的水平线贯穿其中。然而,我不知道下一步该怎么做。正如我所说,所有数据都以度为单位,我想以度为单位指定xlim/ylim、轴标签和(曲线)网格线。我是否需要将所有的东西都转换成Mollweide米,或者是否有可能在一个无痛的步骤中

我有一张ggplot地图(由几何多边形、直线、点和线段组成)。最初的单位是WGS,所有单位都是纬度/经度。所有附加数据(直线和点)也以度为单位。我想把整个物体重新转换成一个等面积投影(Mollweide)。第一步(变换底层rworldmap多边形)相当轻松,尽管有一些奇怪的水平线贯穿其中。然而,我不知道下一步该怎么做。正如我所说,所有数据都以度为单位,我想以度为单位指定xlim/ylim、轴标签和(曲线)网格线。我是否需要将所有的东西都转换成Mollweide米,或者是否有可能在一个无痛的步骤中重塑我的最终贴图对象

这就是我到目前为止所做的,来演示这些奇怪的水平线

library(rworldmap)
library(rgdal)
library(ggplot2)

moll_crs<-CRS("+proj=moll +R=10567000 +lon_0=0 +x_0=0 +y_0=0 +units=m +towgs84=0,0,0,0,0,0,0 +no_defs")

ggplot() + 
  geom_polygon(data = spTransform(getMap(resolution = 'low'), CRSobj = moll_crs), 
               aes(x = long, 
                   y = lat, 
                   group = group),
               fill = 'gray90', 
               colour = 'gray10', 
               size = 0.3) +
  coord_fixed()
xlim
参数把事情搞砸了,添加了水平行。我以为
coord_***(xlim)
参数只是改变了可视区域,但它似乎影响了地图的绘制方式。有什么想法吗?

你可以让ggplot帮你完成,你也可以通过使用更好的地图来消除线条。下面我引用的GeoJSON文件是从shapefile创建的,您可以从那里使用shapefile(或者我使用的优化GeoJSON)

为了显示它如何处理附加点,我为USA和AUS添加了闭合质心

library(sp)
library(ggplot2)
library(rgdal)
library(rgeos)

world <- readOGR("ne_50m_admin_0_countries.geojson", "OGRGeoJSON")
outline <- bbox(world)
outline <- data.frame(xmin=outline["x","min"],
                      xmax=outline["x","max"],
                      ymin=outline["y","min"],
                      ymax=outline["y","max"])

world <- fortify(world)

points <- data.frame(lon=c(-98.35, 134.21), lat=c(39.5, -25.36))

gg <- ggplot()
gg <- gg + geom_rect(data=outline, 
                     aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), 
                     color=1, fill="white", size=0.3)
gg <- gg + geom_map(data=world, map=world,
                    aes(x=long, y=lat, map_id=id), 
                    fill="gray90", color="gray10", size=0.3)
gg <- gg + geom_point(data=points, aes(x=lon, y=lat), size=3)
gg <- gg + labs(x=NULL, y=NULL)
gg <- gg + coord_map("mollweide")
gg <- gg + theme_bw()
gg <- gg + theme(panel.grid=element_blank())
gg <- gg + theme(panel.border=element_blank())
gg <- gg + theme(axis.ticks=element_blank())
gg <- gg + theme(axis.text=element_blank())
gg


gg
(注意:为了避免混乱,我没有包含上面的所有代码)。也可以使用相同的边界框代码在剪裁贴图周围放置投影边框


你可以让ggplot帮你完成,你也可以通过使用更好的地图来消除线条。下面我引用的GeoJSON文件是从shapefile创建的,您可以从那里使用shapefile(或者我使用的优化GeoJSON)

为了显示它如何处理附加点,我为USA和AUS添加了闭合质心

library(sp)
library(ggplot2)
library(rgdal)
library(rgeos)

world <- readOGR("ne_50m_admin_0_countries.geojson", "OGRGeoJSON")
outline <- bbox(world)
outline <- data.frame(xmin=outline["x","min"],
                      xmax=outline["x","max"],
                      ymin=outline["y","min"],
                      ymax=outline["y","max"])

world <- fortify(world)

points <- data.frame(lon=c(-98.35, 134.21), lat=c(39.5, -25.36))

gg <- ggplot()
gg <- gg + geom_rect(data=outline, 
                     aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), 
                     color=1, fill="white", size=0.3)
gg <- gg + geom_map(data=world, map=world,
                    aes(x=long, y=lat, map_id=id), 
                    fill="gray90", color="gray10", size=0.3)
gg <- gg + geom_point(data=points, aes(x=lon, y=lat), size=3)
gg <- gg + labs(x=NULL, y=NULL)
gg <- gg + coord_map("mollweide")
gg <- gg + theme_bw()
gg <- gg + theme(panel.grid=element_blank())
gg <- gg + theme(panel.border=element_blank())
gg <- gg + theme(axis.ticks=element_blank())
gg <- gg + theme(axis.text=element_blank())
gg


gg
(注意:为了避免混乱,我没有包含上面的所有代码)。也可以使用相同的边界框代码在剪裁贴图周围放置投影边框


将南极洲排除在世界地图之外是纠正恼人的水平线的一种方法。另外请注意,您只需要从
rworldmap::getMap()
中的默认值
resolution
获得的粗略分辨率贴图

这里是问题的第一部分的解决方案,只需对代码进行最小的更改

moll_crs<-CRS("+proj=moll +ellps=WGS84")
#first get countries excluding Antarctica which can crash spTransform
#for a world plot you only need coarse resolution which is the default for getMap()
sPDF <- getMap()[getMap()$ADMIN!='Antarctica',]

ggplot() + 
  geom_polygon(data = spTransform(sPDF, CRSobj = moll_crs), 
               aes(x = long, 
                   y = lat, 
                   group = group),
               fill = 'gray90', 
               colour = 'gray10', 
               size = 0.3) +
  coord_fixed()

moll_crs从世界地图中排除南极洲是纠正恼人的水平线的一种方法。另外请注意,您只需要从
rworldmap::getMap()
中的默认值
resolution
获得的粗略分辨率贴图

这里是问题的第一部分的解决方案,只需对代码进行最小的更改

moll_crs<-CRS("+proj=moll +ellps=WGS84")
#first get countries excluding Antarctica which can crash spTransform
#for a world plot you only need coarse resolution which is the default for getMap()
sPDF <- getMap()[getMap()$ADMIN!='Antarctica',]

ggplot() + 
  geom_polygon(data = spTransform(sPDF, CRSobj = moll_crs), 
               aes(x = long, 
                   y = lat, 
                   group = group),
               fill = 'gray90', 
               colour = 'gray10', 
               size = 0.3) +
  coord_fixed()

moll\u crs注意,在没有背景显示世界边缘的情况下,绝不能使用这样的投影。制图员将哭泣。OP将使用
xlim
/
ylim
放大某处,因此我认为这对于示例来说并不重要,但您是对的。我会修好的。谢谢你-非常整洁。不过,使用
xlim
(在
coord_-map
内部)存在一个问题。如果限制加起来等于0(例如,
xlim=c(-40,40)
它可以正常工作,但是
xlim=c(-50,40)
我又得到了水平线(使用@hrbrmstr的GeoJSON)。如果你先裁剪,ylim不会有问题--你应该很好注意,你永远不应该在没有背景的情况下使用这样的投影来显示世界的边缘。制图师会哭的。OP将使用
xlim
/
ylim
来放大某处,所以我认为这对示例来说并不重要,但你是好的。会解决的。谢谢这个-非常好。但是使用
xlim
(在
coord_map
内部)有一个问题。如果限制加起来是0(例如
xlim=c(-40,40)
它工作得很好,但是使用
xlim=c(-50,40)
我又得到了水平线(使用@hrbrmstr的GeoJSON)。如果您先进行裁剪,则不会出现
ylim问题-您应该进行fineAnswer更新以显示如何预剪裁更新以显示如何预剪裁