在地理空间中结合分类填充和渐变填充-R

时间:2018-11-02 22:38:53

标签: r ggplot2 geospatial sf

我正在尝试在地图上填充组合的分类变量和连续变量。因此,举例来说,在下面的示例中,我想显示每个县的KrispyKreme Donut商店数量,这通常是一个连续变量,我想在渐变中填充。但是我也有一些县禁止以“ -1”表示的KrispyKremes县和那些正在建设中的“ -2”的县。我想以未映射在渐变上的其他颜色显示这些。我的真实数据中也没有NA。

-到目前为止我所拥有的:

library(sf)
library(ggplot2)

nc <- st_read(system.file("shape/nc.shp", package="sf"))
nc$Status<-rep(c(-2,-1,runif(8)), 10)

ggplot(nc) + 
  geom_sf(aes(fill=Status),color = "black") + 
  coord_sf(datum = NA) + 
  theme_minimal()

很明显,如果我添加以下行,它会中断。所以,我知道我的语法有误,但这表明我想尽最大努力做到这一点

  scale_fill_manual(breaks= c("-2","-1", >=0),values = c("blue", "yellow", scale_fill_viridis()))

非常感谢您的帮助,我整天都在工作。

2 个答案:

答案 0 :(得分:1)

非常感谢。上面构造Status2的方式使其成为字符变量。我想绘制一个类别变量来代替。以下代码改为生成一个因子变量(Status3)并将其绘制在地图中。可以。

library(sf) 
library(ggplot2) 
library(dplyr)

nc <- st_read(system.file("shape/nc.shp", package="sf")) 
nc$Status<-rep(c(-2,-1,runif(8)), 10)

nc3 <- nc %>%
  mutate(Status3 = factor(ifelse(Status>0,1,0)))

ggplot(nc3) + 
  geom_sf(aes(fill=Status3),color = "black") + 
  coord_sf(datum = NA) + 
  theme_minimal()

但是,当我尝试对我的代码应用相同的原理(基于连续变量构造一个因子变量并绘制其映射图)时,出现错误。

if(type ==“ point”){时错误:参数的长度为零

我的代码如下。该代码在绘制连续变量时有效,但在绘制因子变量时无效。有人知道为什么吗?

# plotting continuous variable: WORKS FINE
ggplot(CS_mun_shp)+
  geom_sf(aes(geometry=geometry,
              fill=ppc_sih),
          color=NA) 

# constructing factor variable
CS_mun_shp2 <- CS_mun_shp %>%
  mutate(cs_above40=factor(ifelse(ppc_sih>=0.4,1,0), 
                           levels=c(0:1), 
                           labels=c('below 40%','above 40%')))

# plotting factor variable: GENERATES ERROR  
ggplot(CS_mun_shp2)+
  geom_sf(aes(geometry=geometry,
              fill=cs_above40),
          color=NA)

我的代码与上面的可重现示例之间的唯一区别是,我需要在geometry中指定aes(),否则会出现另一个错误。

答案 1 :(得分:0)

您需要将连续变量分为不同的类别。

library(sf)
library(ggplot2)
library(dplyr)

# Set seed for reproducibility
set.seed(122)

nc <- st_read(system.file("shape/nc.shp", package="sf"))
nc$Status<-rep(c(-2,-1,runif(8)), 10)

首先,检查变量的分布。

nc %>%
  filter(Status >= 0) %>%
  pull("Status") %>%
  summary()
#     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
# 0.002789 0.153144 0.602395 0.491287 0.735787 0.906851

我决定根据分位数如下切割变量。

nc2 <- nc %>%
  mutate(Status2 = case_when(
    Status == -2 ~ "-2",
    Status == -1 ~ "-1",
    Status >= 0 & Status < 0.15 ~ "0 - 0.15",
    Status >= 0.15 & Status < 0.6 ~ "0.15 - 0.6",
    Status >= 0.6 & Status < 0.75 ~ "0.6 - 0.75",
    Status >= 0.75                ~ "0.75 - 0.91"
  ))

现在Status2是一个分类变量。我们可以绘制它并使用scale_fill_manual提供颜色。注意,我们需要在values参数中提供颜色代码。 viridis::viridis(4)将基于绿色生成四种颜色。

ggplot(nc2) + 
  geom_sf(aes(fill=Status2),color = "black") + 
  coord_sf(datum = NA) + 
  theme_minimal() +
  scale_fill_manual(values = c("blue", "yellow", viridis::viridis(4)))

enter image description here