Borda num geom_sf - Erro "A continuous variable can not be mapped to shape"

Oi gente, tudo bem?

Estou produzindo um mapa do Estado de São Paulo onde os pontos são escolas. Consegui colorir os pontos segundo uma variável “rede” (os valores são “pública ou conveniada” e “privada”), e colocar o tamanho dos pontos segundo a variável numérica “matriculas_2020”.

Código:

mapa <- df %>%
  ggplot() +
  geom_sf(data = sp, fill = "#CCCCCC", color = "#FFFFFF") +
  geom_sf(aes(geometry=geom,
              color = rede,
          size = matriculas_2020)) +
  scale_color_manual(
    values=c("#3D748F", "#a80000"),
    labels = c("Pública ou conveniada", "Privada não conveniada")
  )

O resultado é esse aqui:

mapa

Mas, pra melhorar a visualização, eu queria que os pontos tivessem alguma borda.

Mas, quando tento definir o ponto com o “shape = 21” pra incluir as opções “fill” e “stroke”, eu recebo o erro: “A continuous variable can not be mapped to shape”.

Queria saber se existe alguma alternativa pra fazer algo parecido com o color/fill/stroke do geom_point, mas num geom_sf. Achei esse capítulo do livro da Curso-R: 13.8 O pacote ggplot2 | Ciência de Dados em R indicando que talvez não tenha como mesmo.

Mas se puderem me ajudar a achar uma solução, por favor, agradeço muito!

1 curtida

Carol, tentei chegar o mais perto possível dos seus dados com uma base disponibilizada pelo pacote sf. Veja se era isso que você estava querendo:

library(ggplot2)
library(sf)

nc <- "shape/nc.shp" |>
  system.file(package = "sf") |>
  st_read(quiet = TRUE) |>
  dplyr::mutate(
    geom = st_centroid(geometry),
    rede = as.character(CNTY_ID > 2000),
    matriculas_2020 = PERIMETER * 1000
  )

nc |>
  ggplot() +
  geom_sf(fill = "#CCCCCC", color = "#FFFFFF") +
  geom_sf(
    aes(geometry = geom, fill = rede, size = matriculas_2020),
    stroke = 1,
    shape = 21
  ) +
  scale_color_manual(
    values = c("#3D748F", "#a80000"),
    labels = c("Pública ou conveniada", "Privada não conveniada")
  )

Created on 2022-11-11 with reprex v2.0.2

Eu não sei a causa exata do erro que você recebeu, mas meu palpite é que você estava tentando colocar o shape = 21 dentro da aes(). Isso dá erro porque essa função especifica os mapeamentos do gráfico, ou seja, quais variáveis viram o quê (rede vira a cor, matriculas_2020 vira tamanho, etc.); sendo assim, ele ia falhar na tentativa de transformar “21” em uma variável.

1 curtida

Deu certo! Coloquei o shape fora da aes() e rodou!

Em vez de “scale_color_manual” eu fiz “scale_fill_manual” e consegui customizar as cores dentro dos pontos.

mapa4

Brigada, Caio!

1 curtida