Ggplot y SF: problemas en los labels


#1

Buen día! Confieso que soy bastante novato en R así que seguramente esta pregunta tenga una respuesta sencilla, pero busqué en internet y no encontré una respuesta.

Tengo dos datasets que son capas distintas: “argentina”, que es el mapa, y “mapa”, que contiene una serie de tasas y valores extraídos a partir de la EPH y otras cosas. La cuestión es que quiero asignar dos variables y no encuentro manera de que sea legible: que con el color se vea el porcentaje de la tasa, y que el tamaño del punto sea la población. A lo que no le encontré la vuelta es a cómo modificar las etiquetas del tamaño de población, que se ven totalmente erróneos (por curiosidad probé asignarle shape en vez de size y es lo mismo, las labels se muestran erróneamente).

Este es el código:
ggplot()+
geom_sf(data=argentina)+
geom_sf(data=mapa, aes(color=Tasa_total*100, size=poblacion))+
scale_color_continuous(low = “#34a853”, high = “#ea4335”, name=“Porcentaje”,
breaks=c(20, 30, 40, 50),
labels=c(“20%”, “30%”, “40%”, “50%”))

Y adjunto la imagen del resultado.adaddasd

Muchísimas gracias por la ayuda!


#2

Hola! Seria posible -por temas de reproducibilidad- adjuntar algunos datos? Asi se reproduce directamente con el ejemplo.


#3

Claro! Acá adjunto los datos en cuestión, van al Google Drive porque no me deja adjuntar los .geojson desde acá. Muchas gracias por tu tiempo!

https://drive.google.com/file/d/1xsz1Shf2CR0PpFgY-v3WKwN5uZKLpVXn/view?usp=sharing


#4

@hernanescu me gustaria probar esto mas tarde a ver si te puedo dar una mano, pero no tengo idea como cargaste los datos “.geojson” en data frames que usa ggplot, podrias pasarnos un script que cargue todas las librerias y muestre como cargaste los datos de los datasets argentina y mapa que son los que estas usando? Nunca use geom_sf pero si lo pruebo quizas puedo darte una mano

Saludos :slight_smile:


#5

Acá te copio y pego todo, decime si así te funciona! geom_sf es una de las cosas del paquete SF, que trabaja con datos geolocalizados. Te paso otro link de Google Drive en el que está la base de la EPH que usé y un cálculo previo que armé a efectos del gráfico.
https://drive.google.com/open?id=1ush1AnG8jPksO85F0dX5AIrnEj-mBedM

library(sf)
library(tidyverse)

argentina <- read_sf(‘mapaARG.geojson’)
agloEPH <- read_sf(‘mapaEPH2.geojson’)
t218 <- read.table("…/usu_individual_T218.txt", sep = “;”, dec=",", header=TRUE, fill = TRUE)

options(scipen = 999)
asd <- t218 %>%
group_by(AGLOMERADO) %>%
summarise(poblacion=sum(PONDERA))

base218 <- left_join(agloEPH, asd, by=“AGLOMERADO”)

mapa <- left_join(base218, previo, by=“AGLOMERADO”)

ggplot()+
geom_sf(data=argentina)+
geom_sf(data=mapa, aes(color=Tasa_total*100), size=2)+
scale_color_continuous(low = “#34a853”, high = “#ea4335”, name=“Porcentaje”,
breaks=c(20, 30, 40, 50),
labels=c(“20%”, “30%”, “40%”, “50%”))+
labs(title=“Cantidad de individuos bajo la línea de pobreza en los aglomerados de la EPH”,
subtitle=“Segundo trimestre del 2018”,
caption=“Fuente: EPH, INDEC, indec.gob.ar”)


#6

Que hacés Hernán!

Creo que encontraste un bug en geom_sf, que yo no conocía. Para esquivarlos, podés extraer las coordenadas del dataframe de aglomerados (en forma de dataframe con una columna para lat y otra para long) y proyectar los datos en el mismo plot usando geom_point en vez de geom_sf

Va un ejemplo con los datos que mandaste (tuve que inventar el valor de la “Tasa_total” porque me parece que no está en los datasets que nos compartiste).

library(sf)
library(tidyverse)

argentina <- read_sf("provincia.geojson")
agloEPH <- read_sf("mapaEPH2.geojson") 
t218 <- read.table("usu_individual_t218.txt", sep = ";", dec= ",", header=TRUE, fill = TRUE)

options(scipen = 999)

asd <- t218 %>%
    group_by(AGLOMERADO) %>%
    summarise(poblacion=sum(PONDERA))

base218 <- left_join(agloEPH, asd)

set.seed(666)

mapa <- base218 %>% 
    mutate(Tasa_total = runif(nrow(.), 18, 55) / 100)

ggplot()+
    geom_sf(data=argentina)+
    geom_sf(data=mapa, aes(color=Tasa_total*100, size=poblacion)) +
    scale_color_continuous(low = "#34a853", high = "#ea4335", name="Porcentaje",
                           breaks=c(20, 30, 40, 50),
                           labels=c("20%", "30%", "40%", "50%")) +
    labs(title="Cantidad de individuos bajo la línea de pobreza en los aglomerados de la EPH",
         subtitle="Segundo trimestre del 2018",
         caption="Fuente: EPH, INDEC, indec.gob.ar") +
    coord_sf(xlim = c(-50, -80), ylim = c(-21, -58))



## ALTERNATIVA: extraer las coordenadas de los aglomerados, 
## y agregarlos al plot  via geom_point

# Pequeño obstáculo: El GBA tiene una geometría multipunto (y todos los demás aglomerados 
# están representados por un único punto)
GBA <- mapa %>% 
    filter(AGLOMERADO == 33)

plot(GBA)

# Extraemos las coordenadas de los aglomerados

aglo_coords <- mapa %>% 
    st_coordinates() %>% 
    as.data.frame()

# Nos quedamos sólo con las filas hasta la 32 (así tomamos las coordendas de un
# sólo de los puntos en el GBA, al resto no los necesitamos) 

aglo_coords <- aglo_coords[1:32,]

#Le agregamos una columna con la población y tasa que le corresponde a cada aglomerado

aglo_coords <- cbind(aglo_coords, 
                     poblacion = mapa$poblacion,
                     Tasa_total = mapa$Tasa_total)

# Y cuando lo usamos para graficar:

ggplot()+
    geom_sf(data=argentina)+
    geom_point(data=aglo_coords, 
               aes(x = X, y = Y, color=Tasa_total*100, size = poblacion)) +
    scale_color_continuous(low = "#34a853", high = "#ea4335", name="Porcentaje",
                           breaks=c(20, 30, 40, 50),
                           labels=c("20%", "30%", "40%", "50%")) +
    labs(title="Cantidad de individuos bajo la línea de pobreza en los aglomerados de la EPH",
         subtitle="Segundo trimestre del 2018",
         caption="Fuente: EPH, INDEC, indec.gob.ar") +
    coord_sf(xlim = c(-50, -80), ylim = c(-21, -58))

El resultado:


#7

Muchísimas gracias! Me sirve además saber cómo solucionar esto en caso de que me vuelva a pasar con otros datasets. =)