将频率添加到ggplot映射中(使用rgdal)

时间:2019-04-10 06:24:28

标签: r ggplot2 maps data-visualization

我最近开始使用地图,现在我感觉“我快到了”。当我们遇到与R有关的问题时,Internet是一个了不起的工具,但是似乎2014/2015年的脚本已过时了,无法满足我的要求。我一直在关注这个link和这个link,但没有成功。

比方说,有一个我可以轻松绘制的“地图”文件

library(tidyverse)
library(rgdal)
map <- readOGR("mapa", "UFEBRASIL", encoding = "utf-8")

ideal_map <- fortify(map)

ggplot() + 
  geom_path(data = ideal_map, 
            aes(x = long, y = lat, group = group),
            colour = "black") )

[仅在您要下载此readOGR文件https://www.dropbox.com/s/vnpwwxh471ttaop/map.zip?dl=0] 的情况下 Brazil -- Map

现在我想在此地图中插入一些其他信息,例如每个州的名称( NM_ESTADO )和中间的特定值( Valor )状态。此信息收集在另一个具有相同列名的数据集中:

> dados %>% names
[1] "NR_REGIAO" "Sigla"     **"NM_ESTADO"** "Valor"    
> head(map@data,1)
  ID CD_GEOCODU **NM_ESTADO** NM_REGIAO
0  1         11  RONDÔNIA     NORTE

现在是主要问题:

当我合并两个数据集然后继续使用forfify函数时,似乎添加的新信息就消失了:

#merge
ideal_map2 <- merge(map, dados,by.x = "NM_ESTADO", by.y = "NM_ESTADO")
ideal_map2@data
ideal_map <- fortify(ideal_map2)
head(ideal_map)

       long       lat order  hole piece id group
1 -63.32721 -7.976720     1 FALSE     1  0   0.1
2 -63.11838 -7.977107     2 FALSE     1  0   0.1

那么,我应该怎么走?

谢谢! 如果您需要我的数据集文件来运行代码,请参见以下内容:

dados <- structure(list(NR_REGIAO = c("NORTE", "NORTE", "NORTE", "NORTE", 
"NORTE", "NORTE", "NORTE", "NORDESTE", "NORDESTE", "NORDESTE", 
"NORDESTE", "NORDESTE", "NORDESTE", "NORDESTE", "NORDESTE", "NORDESTE", 
"CENTRO-OESTE", "CENTRO-OESTE", "CENTRO-OESTE", "CENTRO-OESTE", 
"SUDESTE", "SUDESTE", "SUDESTE", "SUDESTE", "SUL", "SUL", "SUL"
), Sigla = c("AC", "AP", "AM", "PA", "RO", "RR", "TO", "AL", 
"BA", "CE", "MA", "PB", "PE", "PI", "RN", "SE", "DF", "GO", "MT", 
"MS", "ES", "MG", "RJ", "SP", "PR", "SC", "RS"), NM_ESTADO = c("ACRE", 
"AMAPÁ", "AMAZONAS", "PARÁ", "RONDÔNIA", "RORAIMA", "TOCANTINS", 
"ALAGOAS", "BAHIA", "CEARÁ", "MARANHÃO", "PARAÍBA", "PERNAMBUCO", 
"PIAUÍ", "RIO GRANDE DO NORTE", "SERGIPE", "DISTRITO FEDERAL", 
"GOIÁS", "MATO GROSSO", "MATO GROSSO DO SUL", "ESPIRITO SANTO", 
"MINAS GERAIS", "RIO DE JANEIRO", "SÃO PAULO", "PARANÁ", "SANTA CATARINA", 
"RIO GRANDE DO SUL"), Valor = c("16", "13", "5", "40", "60", 
"10", "20", "19", "89", "62", "27", "20", "84", "26", "17", "107", 
"143", "86", "78", "79", "70", "285", "109", "169", "181", "159", 
"322")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-27L))

1 个答案:

答案 0 :(得分:1)

您最好投资sf软件包以获取空间数据。 ggplot2知道如何处理这些数据,您可以像处理data.frame一样处理它们。 只要我无法获取您的数据,以下代码就可以工作,但可以在计算机上的类似数据上工作。希望对您有帮助

library(sf)
library(ggplot2)

map <- read_sf("mapa/UFEBRASIL.shp")
ideal_map <- merge(map, dados,by.x = "NM_ESTADO", by.y = "NM_ESTADO")

ggplot(ideal_map) +
  geom_sf() +
  geom_sf_label(aes(label=paste(NM_ESTADO,Valor,sep="\n"))

# with self avoiding labels using ggrepel package
library(ggrepel)

ggplot(ideal_map) +
  geom_sf() +
  geom_label_repel(
    aes(label = label=paste(NM_ESTADO,Valor,sep="\n"), geometry=geometry),
    stat = "sf_coordinates"
  )