Ejemplos de gráficos de piruleta en R

por | Feb 18, 2017 | R | 2 Comentarios

El paquete “ggplot2” alberga uno de los gráficos más avanzados en R, a continuación se muestra la segunda parte de algunos ejemplos del potencial de este paquete gráfico.

Gráfico de líneas complejo (Lollipot2)

library(ggplot2) # Cargar la librería gráfica "ggplot2"
library(dplyr) # Cargar la librería de manipulación de dataframes "dplyr"

grupo <- factor(c("A","B","C","D","E","F","G","H","I","J"))
valor <- c(8,4,3,2,5,6,7,1,9,10)
datos <- data.frame(grupo=grupo,valor=valor)

datos <- datos %>% 
  arrange(valor) %>%
  top_n(6) %>%
  mutate(grupo = factor(grupo, levels = .$grupo))

ggplot() +
  geom_point(data = datos, aes(x = valor, y = grupo, color = grupo), size = 4) +
  geom_segment(data = datos, aes(x = 0, y = grupo, xend = valor, yend = grupo, color = grupo), size=2 ) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 0.5)) +
  labs(
    x = "Valores",
    y = "Grupos",
    title = "Título",
    subtitle = "Subtitulo menos importante",
    caption = "\nPie de linea, para explicar lo que se vea conveniente"
  )

Gráfico de líneas complejo (Lollipot2)

library(ggplot2) # Cargar la librería gráfica "ggplot2"
library(dplyr) # Cargar la librería de manipulación de dataframes "dplyr"

grupo <- factor(c("A","B","C","D","E","F","G","H","I","J"))
valor <- c(8,4,3,2,5,6,7,1,9,10)
datos <- data.frame(grupo=grupo,valor=valor)

datos <- datos %>% 
  arrange(valor) %>%
  top_n(6) %>%
  mutate(grupo = factor(grupo, levels = .$grupo))

ggplot(datos, aes(valor, grupo, label = paste(round(valor, 0), "%")   )) +
        geom_segment(aes(x = 0, y = grupo, xend = valor, yend = grupo), color = rgb(1, 0, 0, 0.4), size=3) +
        geom_point(color = rgb(1, 0, 0, 0.6) , size = 14) +
        geom_text(nudge_x = 0 , color= "white") +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 0.5)) +
  labs(
    x = "Valores",
    y = "Grupos",
    title = "Título",
    subtitle = "Subtitulo menos importante",
    caption = "\nPie de linea, para explicar lo que se vea conveniente"
  )

Gráfico de líneas complejo (Lollipot2 superiores e inferiores a la media)

library(ggplot2) # Cargar la librería gráfica "ggplot2"
library(dplyr) # Cargar la librería de manipulación de dataframes "dplyr"

datos <- datos %>%
        select(grupo, valor) %>%
        arrange(valor) %>%
        mutate(media = mean(valor, na.rm = TRUE),
               Tipo = ifelse(valor - media > 0, "Superiores a la media", "Inferiores a la media"),
               colores = ifelse(valor - media > 0, rgb(0, 0, 1, 0.5), rgb(1, 0, 0, 0.5)), # Blue y red
               grupo = factor(grupo, levels = .$grupo))

ggplot(datos, aes(valor, grupo, color = Tipo)) +
        geom_segment(aes(x = media, y = grupo, xend = valor, yend = grupo), color = datos$colores) +
        geom_point(size=3)

Gráfico de comparación de múltiples valores discretizados por una variable

library(ggplot2) # Cargar la librería gráfica "ggplot2"
library(dplyr) # Cargar la librería de manipulación de dataframes "dplyr"

sexo <- c(rep("man",20),rep("woman",20),rep("man",20),rep("woman",20))
valor <- 1:80
grupo <- c(rep("spain",25),rep("italy",25),rep("portugal",30))
datos <- data.frame(sexo=sexo, valor=valor, grupo=grupo)

datos.grupo.sexo <- datos %>%
        group_by(grupo, sexo) %>%
        summarise(valor = sum(valor, na.rm = TRUE)) %>%
        ungroup() %>%
        mutate(grupo = factor(grupo, levels = .$grupo))

datos.min <- datos.grupo.sexo %>%
        group_by(grupo) %>%
        arrange(desc(valor)) %>%
        top_n(1)

datos.max <- datos.grupo.sexo %>%
        group_by(grupo) %>%
        arrange(desc(valor)) %>%
        slice(2)

ggplot(datos.grupo.sexo, aes(valor, grupo)) +
        geom_line(aes(group = grupo ), color ="lightsteelblue4") +
        geom_point(aes(color = sexo), size = 4) +
        geom_text(data = datos.min, aes(color = sexo, label = round(valor, 0)),
                  size = 3, hjust = -.8) +
        geom_text(data = datos.max, aes(color = sexo, label = round(valor, 0)),
                  size = 3, hjust = 1.8) +
        scale_x_continuous(limits = c(0, 1600))

Gráfico de comparación de múltiples valores discretizados por una variable calculando su porcentaje de diferencia

library(ggplot2) # Cargar la librería gráfica "ggplot2"
library(dplyr) # Cargar la librería de manipulación de dataframes "dplyr"
library("tidyr") # Cargar la librería de manipulación de dataframes "tidyr" para la funcion spread

sexo <- c(rep("man",20),rep("woman",20),rep("man",20),rep("woman",20),rep("man",20), rep("woman",20))
valor <- 1:120
grupo <- c(rep("spain",25),rep("italy",25),rep("portugal",30),rep("germany",40))
datos <- data.frame(sexo=sexo, valor=valor, grupo=grupo)

datos.grupo.sexo <- datos %>%
        group_by(grupo, sexo) %>%
        summarise(valor = sum(valor, na.rm = TRUE)) %>%
        ungroup() %>%
        mutate(grupo = factor(grupo, levels = .$grupo))

datos.min <- datos.grupo.sexo %>%
        group_by(grupo) %>%
        arrange(desc(valor)) %>%
        top_n(1)

# Crear un data frame que identifique defierencias superiors al 20%
datos.dif <- datos.grupo.sexo %>% 
        spread(sexo, valor) %>% 
        group_by(grupo) %>% 
        mutate(Max = max(woman, man),
               Min = min(woman,man),
               Diff = Max / Min - 1) %>% 
        arrange(desc(Diff)) %>%
        filter(Diff > .2)

punto.maximo <- filter(datos.grupo.sexo, grupo %in% datos.dif$grupo)

etiqueta.dif <- datos.dif %>%
        select(grupo, valor = Max, Diff) %>%
        right_join(datos.min)

ggplot(datos.grupo.sexo, aes(valor, grupo)) +
        geom_line(aes(group = grupo), alpha = .3 ) +
        geom_point(aes(color = sexo), size = 1.5, alpha = .3) +
        geom_line(data = punto.maximo, aes(group = grupo)) +
        geom_point(data = punto.maximo, aes(color = sexo), size = 2) +
        geom_text(data = etiqueta.dif, aes(color = sexo, 
                                         label = paste(round(Diff*100,digits = 2),"%")),
                  size = 3, hjust = -.3)

2 Comentarios

  1. Maru

    Hola, muchas gracias, me parece fabuloso todo lo que publicas. Quisiera preguntarte si sabes que tipo de grafico puedo utilizar para graficar una tabla de datos simbólicos?. Muchas gracias!

    Responder
    • Maru

      Perdon, una grafica para tabla de objetos simbolicos. Muchas gracias, saludos cordiales

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *