如何在 R 中的地图中添加一列基于圆圈的大小?

问题描述

我有两个名为 ab 的数据集。

ab 的类如下:

> class(a)
[1] "SpatialpolygonsDataFrame"

attr(,"package")
[1] "sp"
> class(b)
[1] "data.frame"

我在 b添加了一列 a,然后将它们合并。

然后使用 plot(a) 绘制地图:

但我需要一张地图,其中包含不同大小的圆圈作为人口。

解决方法

由于您的 dput 仅显示 dput(head(covid)) 的结果,因此我决定仅绘制提供的 6 个省份的地图。

您可以尝试使用包 sfggplot2

library(rnaturalearth) #get SA map
library(sf)
library(tidyverse)

#Covid data
covid <- structure(list(Province = c("EC","FS","GT","KZ","LM","MP"),Cases = c(2748L,208L,2993L,1882L,132L,103L),Population = c(11.56,2.75,12.27,10.27,5.4,4.04)),row.names = c(NA,6L),class = "data.frame")                                                                     
#Map as an sf object
map <- st_as_sf(ne_states(country="South Africa"))

#Modify the covid dataframe before merging 
covid <- covid %>%
  mutate(name = case_when(Province=="EC" ~ "Eastern Cape",Province=="FS" ~ "Free State",Province=="GT" ~ "Gauteng",Province=="KZ" ~ "KwaZulu-Natal",Province=="LM" ~ "Limpopo",Province=="MP" ~ "Mpumalanga"))

#Merging covid data + map
covid <- st_as_sf(left_join(covid,map,by="name"))

#We want to create breaks in order to have the desired legend
covid <- covid %>%
  mutate(breaks = case_when(Cases > 45 & Cases < 107 ~ "45 to 107",Cases > 107 & Cases < 147 ~ "107 to 147",Cases > 147 & Cases < 1547 ~ "147 to 1547",Cases > 1547 & Cases < 2846 ~ "1547 to 2846",Cases > 2846 & Cases < 15396 ~ "2846 or + "))

covid %>%
  mutate(breaks=fct_relevel(breaks,"45 to 107","107 to 147","147 to 1547","1547 to 2846","2846 or + ")) %>% #we reorder the labels
  ggplot() + 
  geom_sf(aes(fill=breaks)) +
  scale_fill_manual(values=c("#feedde","#fdd0a2","#fd8d3c","#f16913","#d94801")) +
  geom_point(aes(x=longitude,y=latitude,size=Population),colour="grey70") +
  labs(fill="Cases") +
  theme_void()

enter image description here

您当然可以通过使用适当的坐标参考系统来改进结果(查看 sf 包的文档)。