geom_polygon + map projection =莫名其妙地切成两个形状?

时间:2016-08-16 01:59:23

标签: r ggplot2 maps

我试图使用ggplot2在Winkel Tripel投影中绘制世界地图;它最终会有一些数据。本土方面,据我所知,ggplot不能做Winkel Tripel,所以我用手动投影来解决这个问题。除了海洋层之外,我得到了所有东西,它不会出现。代码:

Parent1

  --- build_x

   ---build_y


Parent2

-- build_x

-- build_y

渲染:

world map drawn correctly except that the blue ocean fill only covers the "end caps" of the map, not the region in the middle

你可以看到,单个多边形填充意味着被切成两个单独的多边形,它们只覆盖了#34;端盖"地图,而不是中间。如何在整个地图下填写?我认为问题在于" boundary"的定义,但我在geom_polygon文档中没有看到任何内容来解释可能出错的地方。

1 个答案:

答案 0 :(得分:0)

使用' ggalt'这是一个正确的答案",这里是获得你想要的东西的方法 - 首先裁剪出南极洲(虽然我不支持这个,但它真的很糟糕),以及使用' scale_y_discrete'。我不知道为什么要知道这个gg-verse,但我收集了南边界连续的突破,并以某种方式再次绕过两半。离散裁剪可能会选择最近的" coords等保持南边界。

我们确实需要更好的工具来跨越sp / ggplot2鸿沟,虽然我们有一个针对局部问题的局部修复动物园,但两者之间没有正确的统一。 ' ggalt'是最好的之一。

suppressPackageStartupMessages({
library(ggplot2)
library(sp)
library(rworldmap)
library(rgdal)
})
ll.to.wt <- function (points)
as.data.frame(spTransform(SpatialPoints(points, CRS("+proj=longlat")),
                        CRS("+proj=wintri")))

## not much of a "world" without Antarctica . . 
badworld <- subset(spTransform(getMap(), CRS("+proj=wintri")), 
               !NAME == "Antarctica")
world <- fortify(badworld)
xlimits <- ll.to.wt(matrix(c(-180,180,0,0), nrow=2))$coords.x1
ylimits <- ll.to.wt(matrix(c(0,0,-60,85), nrow=2))$coords.x2
lseq = seq(-60, 85, by=.25)
boundary <- ll.to.wt(data.frame(
long = c(rep(-180, length(lseq)), rep(180, length(lseq)), -180),
 lat  = c(lseq,                    rev(lseq),          lseq[1])))

ggplot() +
geom_polygon(data=boundary, aes(x=long, y=lat), fill="#9AC5E3") + 
 geom_map(data=world, map=world, aes(x=long, y=lat, map_id=id),
       color="#888888", fill="#f2caae", size=0.25) +
scale_x_continuous(limits=xlimits, expand=c(0,0)) +
scale_y_discrete(limits=ylimits, expand=c(0,0)) +
coord_equal() +
theme(
axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.justification = c(0,0), # bottom of box
legend.position      = c(0,0), # bottom of picture
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.margin=unit(0, "lines"),
plot.background=element_blank())