Semana 12

Figura semana 12

geom_segment
geom_point
geom_label
Autor

Víctor Gauto

Fecha de publicación

26 de marzo de 2023

Lenguajes de programación y sus comentarios.

Script

Código
# paquetes ----------------------------------------------------------------

library(tidyverse)
library(showtext)
library(here)
library(ggtext)
library(glue)
library(fontawesome)

# fuentes -----------------------------------------------------------------

font_add_google(name = "Share Tech Mono", family = "share") # nombres de programas
font_add_google(name = "Heebo", family = "heebo") # resto del texto
font_add_google(name = "Roboto Mono", family = "roboto") # título

showtext_auto()
showtext_opts(dpi = 300)

# íconos
font_add("fa-reg", here("icon/Font Awesome 5 Free-Regular-400.otf"))
font_add("fa-brands", here("icon/Font Awesome 5 Brands-Regular-400.otf"))
font_add("fa-solid", here("icon/Font Awesome 5 Free-Solid-900.otf"))

# Sys.getenv("GITHUB_PAT")
# Sys.unsetenv("GITHUB_PAT")

# funciones ---------------------------------------------------------------

# función p/agregar el punto de las unidades de mil
f_punto <- scales::label_number(big.mark = ".", decimal.mark = ",")

# función p/escribir en mono, en blanco
f_code <- function(x) {
  glue("<span style='font-family:share; color:white'>{x}</span>")
}

# datos -------------------------------------------------------------------

# browseURL("https://github.com/rfordatascience/tidytuesday/blob/master/data/2023/2023-03-21/readme.md")
datos_raw <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2023/2023-03-21/languages.csv')

glimpse(datos_raw)

datos_raw |> 
  drop_na(line_comment_token) |> 
  count(line_comment_token, sort = TRUE)

# selecciono y renombro
datos_sub <- datos_raw |> 
  select(title, line_comment_token, wikipedia_daily_page_views, appeared) |> 
  drop_na()

# escribo los datos y leo
# write_tsv(datos_saved, here("2023/semana 12/datos_saved.tsv"))
# datos_saved <- read_tsv(here("2023/semana 12/datos_saved.tsv"))

# datos p/la figura
datos <- datos_sub |> 
  group_by(line_comment_token) |> 
  slice_max(wikipedia_daily_page_views, n = 10) |> 
  mutate(suma = sum(wikipedia_daily_page_views)) |> 
  arrange(desc(suma), desc(wikipedia_daily_page_views)) |> 
  ungroup() |> 
  slice(1:50) |> 
  rename(nombre = title, comentario = line_comment_token, 
         visitas = wikipedia_daily_page_views, año = appeared) |> 
  mutate(nombre = fct_inorder(nombre)) |> 
  mutate(nombre = fct_rev(nombre)) |> 
  mutate(comentario = fct_reorder(comentario, -suma)) |> 
  mutate(decada = año - (año %% 10)) |> 
  mutate(decada = factor(decada)) |> 
  mutate(suma = f_punto(x = suma)) |> 
  mutate(comentario_label = glue("<span style='font-size:25pt;background-color:#003354'>{comentario}<br></span><br><span style='font-size:9pt;'>{suma}<br>visitas<br>totales</span>")) |> 
  mutate(comentario_label = fct_inorder(comentario_label))

# círculo que encierra el signo del comentario
circulo <- datos |> 
  distinct(comentario_label) |> 
  mutate(x = 7600,
         y = 5)

# lenguaje más nuevo/viejo
min_max <- bind_rows(datos |> slice_max(año, n = 1),
                     datos |> slice_min(año, n = 1))

# figura ------------------------------------------------------------------

# caption
icon_twitter <- "<span style='font-family:fa-brands; color:white;'>&#xf099;</span>"
icon_github <- "<span style='font-family:fa-brands; color:white;'>&#xf09b;</span>"
fuente <- "<span style='color:white;'>Datos:</span> <span style='color:#003354;'><span style='font-family:share;'>{**tidytuesdayR**}</span> semana 12</span>"
autor <- "<span style='color:white;'>Autor:</span> <span style='color:#003354;'>**Víctor Gauto**</span>"
sep <- glue("<span style = 'color:#a4cac8;'>**|**</span>")
usuario <- glue("<span style = 'color:#003354;'>**vhgauto**</span>")

mi_caption <- glue("{fuente} {sep} {autor} {sep} {icon_github} {icon_twitter} {usuario}")

# plot
g1 <- ggplot(data = datos, aes(x = visitas, y = nombre)) +
  # segmentos
  geom_segment(aes(x = 0, xend = visitas, yend = nombre), 
               linewidth = .5, color = "#0970a5") +
  # puntos de cantidad de visitas
  geom_point(aes(shape = decada), size = 1, color = "white", fill = "#a4cac8") +
  # círculo alrededor del comentario
  annotation_custom(grid::circleGrob(default.units="npc",
                                     x = 1.055,
                                     y = .7,
                                     r = .18,
                                     gp = grid::gpar(col = "white", 
                                                     vjust = 0.5, 
                                                     hjust = 0.5, 
                                                     fill = "#a4cac8"))) +
  # lenguajes más nuevo/viejo
  geom_label(data = min_max[1, ], 
             aes(x = visitas+150, y = nombre, label = glue("El lenguaje más nuevo, {nombre}, aparece en {año} ")),
             hjust = 0, vjust = .5, color = "white", family = "mono", size = 3,
             fill = "#5fb0b8", label.size = 0, label.r = unit(0, "line")) +
  geom_label(data = min_max[2, ], 
             aes(x = visitas+150, y = nombre, label = glue("El lenguaje más viejo, {nombre}, aparece en {año} ")),
             hjust = 0, vjust = .5, color = "white", family = "mono", size = 3,
             fill = "#5fb0b8", label.size = 0, label.r = unit(0, "line")) +
  # faceta
  facet_wrap(~ comentario_label, ncol = 1, scales = "free", 
             strip.position = "right") +
  # manual
  scale_x_continuous(breaks = seq(0, 7000, 1000),
                     limits = c(0, 7500),
                     expand = c(0, 0)) +
  scale_shape_manual(values = c(3, 8, 21:24)) +
  coord_cartesian(clip = "off") +
  # ejes
  labs(x = "Visitas diarias a la entrada del lenguaje en Wikipedia", y = NULL,
       shape = "Década de aparición:",
       title = "Su <span style='color:white'>comentario</span> no molesta",
       subtitle = glue(
         "Cada lenguaje de programación posee un caracter especial 
         que habilita los <span style='color:white'>comentarios</span> en el 
         script. Se muestra una selección de <span style='color:white'>5</span> 
         caracteres: [{f_code('//')}], [{f_code('#')}], [{f_code('-')}], 
         [{f_code('%')}] y [{f_code(';')}] y los 10 lenguajes más populares que 
         lo utilizan, de acuerdo a la cantidad de <span style='color:white'>visitas 
         diarias</span> de sus correspondientes entradas en 
         <span style='color:white'>Wikipedia</span>. Se indica también la 
         <span style='color:white'>decada</span> de salida del lenguaje."),
       caption = mi_caption) +
  # guide
  guides(shape = guide_legend(nrow = 1, override.aes = list(size = 3))) +
  # tema
  theme(aspect.ratio = .25,
        legend.position = c(.45, 1.03),
        legend.key.size = unit(1, "line"),
        legend.text = element_text(family = "share"),
        legend.title = element_text(hjust = .5, family = "heebo", color = "#003354"),
        legend.direction = "horizontal",
        legend.key = element_rect(fill = "#5fb0b8", color = NA),
        legend.background = element_rect(fill = "#5fb0b8", color = NA),
        plot.background = element_rect(fill = "#5fb0b8", color = "white",
                                       linewidth = 3),
        plot.title = element_markdown(size = 35, margin = margin(0, 5, 5, 5),
                                      family = "roboto", color = "#003354"),
        plot.title.position = "plot",
        plot.subtitle = element_textbox_simple(margin = margin(5, 5, 30, 5),
                                               color = "#003354"),
        plot.caption = element_markdown(hjust = .5, size = 10, 
                                        margin = margin(20, 0, 0, 0)),
        plot.caption.position = "plot",
        plot.margin = margin(16.4, 16, 16.4, 16),
        panel.grid = element_line(linewidth = .1, color = "grey90"),
        panel.grid.minor = element_blank(),
        panel.background = element_rect(fill = "#a4cac8", color = NA),
        panel.grid.major.y = element_blank(),
        axis.ticks = element_blank(),
        axis.title.x = element_text(family = "heebo", color = "#003354",
                                    margin = margin(5, 0, 0, 0)),
        axis.text = element_text(family = "share", color = "black"),
        strip.background.y = element_rect(fill = NA, color = NA),
        strip.text.y.right = element_markdown(angle = 0, color = "#003354",
                                              family = "heebo"))

# guardo
ggsave(plot = g1,
       filename = here("2023/semana 12/viz.png"),
       width = 19,
       height = 27,
       dpi = 300,
       units = "cm")
# abro
browseURL(here("2023/semana 12/viz.png"))

Figura

Subir