¿Dos ejes de ordenadas? (Parte 1/n)

gráficos
2021
Author

jlcr

Published

August 18, 2021

Anoche me iba a ir a la cama tras escuchar un podcast, pero al final estuve entretenido debatiendo con Raúl Vaquerizo, Alberto González Almuiña y Jesús Lagos , sobre los gráficos con dos ejes de ordenadas. Aquí os dejo el tweet que puso Raúl.

Pues yendo al post que puso Raúl construía el siguiente gráfico.

library(tidyverse)
library(magrittr)
library(insuranceData)
library(ggplot2)


# url='http://www.businessandeconomics.mq.edu.au/our_departments/Applied_Finance_and_Actuarial_Studies/acst_docs/glms_for_insurance_data/data/claimslong.csv'
# df <- read.csv(url)

data("ClaimsLong")
df <- ClaimsLong

resumen <- df %>% group_by(period) %>%
  summarise(pct_exposicion = n(),
            frecuencia = sum(claim)/n())


g2 <- ggplot(resumen,aes(x = period)) + 
  geom_col(aes(y = pct_exposicion), fill="yellow",alpha=0.7) + 
  geom_line(aes(y=frecuencia * 500000 ), group = 1,color="red") + 
  geom_text(aes(y = frecuencia * 500000, label = paste(round(frecuencia*100),'%')),
            vjust = 1.4, color = "red", size = 2) +
  scale_y_continuous(sec.axis = sec_axis(~.* 500000, name = "Frecuencia [%]")) 

g2

Y bueno, no está mal, pero no me acaba de gustar, sobre todo porque al fin y al cabo todos sus períodos tienen el mismo valor

resumen
#> # A tibble: 3 × 3
#>   period pct_exposicion frecuencia
#>    <int>          <int>      <dbl>
#> 1      1          40000      0.131
#> 2      2          40000      0.141
#> 3      3          40000      0.156

Ahora que lo pienso, casi que con la tabla valdría. Pero que pasaría si tenemos diferentes valores

set.seed(155)
resumen %<>% 
  mutate(pct_exposicion = pct_exposicion * 10*runif(3))
resumen
#> # A tibble: 3 × 3
#>   period pct_exposicion frecuencia
#>    <int>          <dbl>      <dbl>
#> 1      1        315266.      0.131
#> 2      2        173523.      0.141
#> 3      3        304162.      0.156
ggplot(resumen,aes(x = period)) + 
  geom_col(aes(y = pct_exposicion), fill="yellow",alpha=0.7) + 
  geom_line(aes(y=frecuencia * 500000 , group=), group = 1,color="red") + 
  geom_text(aes(y = frecuencia * 500000, label = paste(round(frecuencia*100),'%')),
            vjust = 1.4, color = "red", size = 2) +
  scale_y_continuous(sec.axis = sec_axis(~.* 500000, name = "Frecuencia [%]")) 

Me gusta aún menos este gráfico, yo propongo el siguiente en su lugar.

resumen %>% 
  ggplot(aes(x = period, y = frecuencia)) +
  geom_point(aes(size=pct_exposicion)) + 
  geom_line() +
  scale_size_continuous(range=c(4, 10)) +
  scale_y_continuous(labels = scales::percent, limits = c(0,0.2))

Dónde representamos la variable frecuencia en el eje de ordenadas y con el tamaño de los puntos representamos la otra variable.