搬迁阿拉斯加和夏威夷,美国的专题地图上GGPLOT2(Relocating Alaska and H

2019-07-04 17:08发布

我试图创建一个显示美国50个州专题地图,但我有麻烦迁往阿拉斯加和夏威夷以可靠的方式。 我有一对夫妇的想法,但他们没有工作。 现在我将演示他们。

首先,我们需要导入的数据; 在使用数据maps包是不够的,因为它不包括夏威夷和阿拉斯加。

setwd(tempdir())
download.file("https://dl.dropbox.com/s/wl0z5rpygtowqbf/states_21basic.zip?dl=1", 
              "usmapdata.zip", 
              method = "curl")
# This is a mirror of http://www.arcgis.com/home/item.html?
# id=f7f805eb65eb4ab787a0a3e1116ca7e5
unzip("usmapdata.zip")

require(rgdal)
all_states <- readOGR("states_21basic/", "states")

require(ggplot2); require(maptools); require(rgeos); require(mapproj);
all_states <- fortify(all_states, region = "STATE_NAME")

现在我们定义一些情节美学:

p <- ggplot() + geom_polygon( 
  aes(x=long, y=lat, group = group, fill = as.numeric(as.factor(id))), 
  colour="white", size = 0.25
) + coord_map(projection="azequalarea") + 
scale_fill_gradient(limits = c(1,50))

现在我们删除所有的背景等,使他们当我们重叠的不连续的状态不冲突:

p <-   p + 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(),
            panel.background=element_blank(),
            panel.border=element_blank(),
            panel.grid.major=element_blank(),
            panel.grid.minor=element_blank(),
            plot.background=element_blank())

使用视口

我的第一个想法是使用视口:

AK <- p %+% subset(all_states, id == "Alaska") + theme(legend.position = "none")
HI <- p %+% subset(all_states, id == "Hawaii") + theme(legend.position = "none")
contiguous <- p %+% subset(all_states, id != "Alaska" & id != "Hawaii")

grid.newpage()
vp <- viewport(width = 1, height = 1)
print(contiguous, vp = vp)
subvp1 <- viewport(width = 0.25, height = 0.25, x = 0.18, y = 0.33)
print(AK, vp = subvp1)
subvp2 <- viewport(width = 0.12, height = 0.12, x = 0.32, y = 0.27)
print(HI, vp = subvp2)

这看起来不错,但因为它是在图中的微小变化非常敏感,例如调整大小或图例的大小和形状的变化是不能令人满意的。

手动移动阿拉斯加和夏威夷

all_states_AKHImoved <- within(all_states, {
  lat[id == "Alaska"] <- lat[id == "Alaska"] - 45
  long[id == "Alaska"] <- long[id == "Alaska"] + 40
  lat[id == "Hawaii"] <- lat[id == "Hawaii"] + 0
  long[id == "Hawaii"] <- long[id == "Hawaii"] + 70
})
p %+% all_states_AKHImoved

这是不令人满意的,因为阿拉斯加通常是不按比例在大多数美国的地图,所以它看起来很大。 也搬迁阿拉斯加和夏威夷改变由地图投影引入的失真。

没有人有任何更好的方法?

Answer 1:

下面介绍如何通过投影和转化做到这一点。 你会需要:

require(maptools)
require(rgdal)

fixup <- function(usa,alaskaFix,hawaiiFix){

  alaska=usa[usa$STATE_NAME=="Alaska",]
  alaska = fix1(alaska,alaskaFix)
  proj4string(alaska) <- proj4string(usa)

  hawaii = usa[usa$STATE_NAME=="Hawaii",]
  hawaii = fix1(hawaii,hawaiiFix)
  proj4string(hawaii) <- proj4string(usa)

  usa = usa[! usa$STATE_NAME %in% c("Alaska","Hawaii"),]
  usa = rbind(usa,alaska,hawaii)

  return(usa)

}

fix1 <- function(object,params){
  r=params[1];scale=params[2];shift=params[3:4]
  object = elide(object,rotate=r)
  size = max(apply(bbox(object),1,diff))/scale
  object = elide(object,scale=size)
  object = elide(object,shift=shift)
  object
}

然后在你的shape文件读取。 使用rgdal

us = readOGR(dsn = "states_21basic",layer="states")

现在转变为等面积,并运行修正功能:

usAEA = spTransform(us,CRS("+init=epsg:2163"))
usfix = fixup(usAEA,c(-35,1.5,-2800000,-2600000),c(-35,1,6800000,-1600000))
plot(usfix)

参数分别为旋转,缩放,x和阿拉斯加和夏威夷Y移位,并通过试验和错误得到。 仔细调整它们。 即使改变夏威夷的尺度参数,以0.99999寄出去了地球,因为涉及到大量。

如果你想要把这个回LAT-长:

usfixLL = spTransform(usfix,CRS("+init=epsg:4326"))
plot(usfixLL)

但我不知道你是否需要使用转换在ggplot因为我们做到了这一点与spTransform

您现在可以通过跳ggplot2巩固业务。 我不知道,如果它的事项你,但请注意状态的顺序是不同的usfix版本-阿拉斯加和夏威夷现在是最后两个状态。



Answer 2:

我已经出版了fiftystater上CRAN [R包提供一个简单的解决方案。 它是基于Spacedman的答案的步骤(将链接,但代表不足),并发布为ggplot2::geom_map命名的准备形状数据帧fifty_states去除需要安装的依赖关系,追查来源形状文件,或者调整的Elid值。

library(ggplot2)
library(mapproj)
library(fiftystater)

crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)

p <- ggplot(crimes, aes(map_id = state)) + 
  geom_map(aes(fill = Assault), map = fifty_states) + 
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  coord_map()
p

情节噪声可以用通常的方式进行清理,而且里面还有fifty_states_inset_boxes在包中添加插图盒功能:

p + scale_x_continuous(breaks = NULL) + 
  scale_y_continuous(breaks = NULL) +
  labs(x = "", y = "") +
  theme(panel.background = element_blank()) +
  fifty_states_inset_boxes()



Answer 3:

一旦你开始转向周围像这样的事情,你可能也只是在墨西哥湾代表阿拉斯加和夏威夷为方框地方。 它必须使其能够告诉夏威夷是什么颜色的额外优势。

你很可能然后就一路过关斩将,并使用一个扭曲的系统,其中每个州都有平等的区域,那么你可以看到罗德岛。

美国示意地图例子在谷歌的图像显示了这样的事情。 不知道他们有多少与他们shape文件或数据虽然。

你在美国的相对大小真的有兴趣,或者你想要的表示,让人们看到事情的价值是一个状态?



文章来源: Relocating Alaska and Hawaii on thematic map of the USA with ggplot2
标签: r ggplot2