Включить масштаб карты и стрелку севера только к одному аспекту ggplot

Я строю карту, используя пакеты ggplot2 и sf, и я хотел бы включить масштаб карты и стрелку севера в фигуру, используя ggsn пакет. Вот в чем проблема. Я хочу показать фигуру с двумя или более facets, но я хотел бы добавить масштаб и стрелку севера только к одной из граней фигуры.

Любая идея о том, как это сделать?

Воспроизводимый пример:

library(UScensus2000tract)
library(ggplot2)
library(spdep)
library(sf)
library(ggsn)

# load data
  data("oregon.tract")

# convert spatial object to sf class
  oregon_sf_A <- st_as_sf(oregon.tract)
  oregon_sf_B <- st_as_sf(oregon.tract)

# organize data for facetting
  oregon_sf_A$cat <- "A"
  oregon_sf_B$cat <- "B"
  oregon_sf <- rbind(oregon_sf_A, oregon_sf_B)

# create a second variable for facetting
  oregon_sf$var2 <- sample(c("C","D"), nrow(oregon_sf), replace=T)

# Map
  ggplot() +
    geom_sf(data=oregon_sf, aes(fill=hispanic.t), color=NA) +
    scale_fill_viridis(option = "inferno", direction=-1) +
    facet_grid(~cat) +
    north(data=oregon_sf, symbol=4, location="bottomleft", scale=.2) +
    scalebar(data=oregon_sf, dist = 200, st.size=3, height=0.02, dd2km = TRUE, location="bottomright" , model = 'WGS84')

введите здесь описание изображения

Проблема немного усложнится, если мы попытаемся использовать две переменные в facet_grid:

# Map 2
  ggplot() +
    geom_sf(data=oregon_sf, aes(fill=hispanic.t), color=NA) +
    scale_fill_viridis(option = "inferno", direction=-1) +
    facet_grid(cat~var2) +
    north(data=oregon_sf, symbol=4, location="bottomleft", scale=.2) +
    scalebar(data=oregon_sf, dist = 200, st.size=3, height=0.02, dd2km = TRUE, location="bottomright" , model = 'WGS84')

введите здесь описание изображения


person rafa.pereira    schedule 06.06.2018    source источник


Ответы (2)


Используйте аргументы facet.var и facet.lev в масштабной линейке для добавления к одному фасету. Используйте функцию north2(), чтобы добавить одну стрелку на север. Вы можете настроить положение/масштаб и т. д. в соответствии с вашими потребностями. Если вы используете facet_grid с двумя переменными, вы можете передать вектор в facet.var и facet.lev.

 ggp <- ggplot(data = oregon_sf) +
  geom_sf(aes(fill=hispanic.t), color=NA) +
  scale_fill_viridis(option = "inferno", direction=-1) +
  facet_grid(cat~var2) +
  scalebar(data=oregon_sf, dist = 200, st.size=3, height=0.02, dd2km = TRUE, location="bottomright" , model = 'WGS84',
           facet.var = c('cat', 'var2'), facet.lev = c('B', "C"))
north2(ggp = ggp, scale = 0.1, x = 0.05, y = 0.3, symbol = 4)

введите здесь описание изображения

person sebdalgarno    schedule 06.06.2018
comment
oregon.tract является частью пакета UScensus2000tract, с которым связан OP - person Tung; 06.06.2018
comment
Спасибо! Я обновил свой ответ, чтобы использовать данные OP - person sebdalgarno; 06.06.2018
comment
Спасибо @sebdalgarno, это очень полезно. Однако я заметил, что facet.var и facet.lev, похоже, не работают, когда я использую facet_grid с двумя переменными, поэтому я расширил вопрос, чтобы решить и эту ситуацию. - person rafa.pereira; 08.06.2018
comment
см. правки... вы можете просто передать вектор в facet.var и facet.lev - person sebdalgarno; 08.06.2018
comment
@rafa.pereira, пожалуйста, отметьте вопрос как ответ, если эти изменения действительно сработали для вас. - person sebdalgarno; 14.06.2018
comment
это действительно блестящий пакет. Спасибо ! - person rafa.pereira; 14.06.2018

если вы еще не обнаружили его, в пакете ggspatial есть решение для этого здесь. https://github.com/paleolimbot/ggspatial/issues/25

person Dan Strobridge    schedule 16.03.2021