2017-05-24

Cambiar el orden de un diagrama de barras apiladas con ggplot2

Problema

Deseamos controlar el orden en el que se apilan las barras de un diagrama de barras en ggplot2.

  • Gráfico original
  • Por defecto las barras se apilan alfabéticamente en función de la variable usada en el argumento fill.

    library(reshape2)
    library(ggplot2)
    ra.melt <- melt(ra)
    p <- ggplot(ra.melt, aes(x = variable, y = value))
    p + geom_bar(aes(fill = quality), stat = "identity") + 
      labs(x = "group", y = "percentage (%)")
    
    Comprobamos los niveles de la variable quality.

    levels(ra.melt$quality)
    
     [1] "A"     "B"     "C"     "D"     "E"     "F"    
     [7] "G"     "H"     "I"     "J"     "K"     "L"    
    [13] "M"     "other"
    
  • Datos originales
  • ra <- structure(list(quality = structure(c(2L, 6L, 13L, 1L, 7L, 5L, 
    10L, 4L, 3L, 9L, 11L, 12L, 8L, 14L), .Label = c("A", "B", "C", 
    "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "other"), class = "factor"), GY = c(25.5932389, 13.9567819, 11.7333, 8.6439, 7.8351008, 
        8.29, 6.059643, 3.8608517, 4.3277, 3.1710598, 1.2021144, 
        1.0986329, 0.9369271, 3.2907496), TH = c(23.0215577, 15.8975387, 
        10.5075, 7.8888, 8.8121504, 8.276, 6.4356378, 3.9147685, 
        5.4838, 3.9339386, 1.3921565, 0.742406, 0.8795013, 2.8142444
        ), SZ = c(21.217152, 16.0363831, 11.154, 8.5094, 7.945884, 
        10.2717, 5.4962929, 4.1381946, 5.1141, 3.4053352, 1.8472827, 
        1.0648934, 0.9792861, 2.820096), DZ = c(23.7548859, 14.4732136, 
        12.1292, 10.4722, 8.0838209, 7.0575, 5.144598, 4.174118, 
        5.4004, 3.1940577, 1.4427867, 1.1323864, 0.8986281, 2.6422047
        ), FP = c(19.9848602, 16.420735, 12.9683, 11.2059, 7.5143706, 
        6.8747, 5.8653262, 5.5412901, 4.182, 3.5347168, 1.3838249, 
        0.8811604, 0.8585596, 2.7842562)), .Names = c("quality", 
    "GY", "TH", "SZ", "DZ", "FP"), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
    "14"))
    

Solución

  • En el orden original del data frame
  • ra.melt$quality <- factor(ra.melt$quality, levels = ra$quality)
    p <- ggplot(ra.melt, aes(x = variable, y = value))
    p + geom_bar(aes(fill = quality), stat = "identity") + 
        labs(x = "group", y = "percentage (%)")
    
    factor(ra.melt$quality, levels = ra$quality)
    
     [1] B     F     M     A     G     E     J     D    
     [9] C     I     K     L     H     other B     F    
    [17] M     A     G     E     J     D     C     I    
    [25] K     L     H     other B     F     M     A    
    [33] G     E     J     D     C     I     K     L    
    [41] H     other B     F     M     A     G     E    
    [49] J     D     C     I     K     L     H     other
    [57] B     F     M     A     G     E     J     D    
    [65] C     I     K     L     H     other
    Levels: B F M A G E J D C I K L H other
    
  • En el orden reverso del original
  • ra.melt$quality <- factor(ra.melt$quality, levels = rev(ra$quality))
    p <- ggplot(ra.melt, aes(x = variable, y = value))
    p + geom_bar(aes(fill = quality), stat = "identity") +  
        labs(x = "group", y = "percentage (%)")
    
    factor(ra.melt$quality, levels = rev(ra$quality))
    
     [1] B     F     M     A     G     E     J     D    
     [9] C     I     K     L     H     other B     F    
    [17] M     A     G     E     J     D     C     I    
    [25] K     L     H     other B     F     M     A    
    [33] G     E     J     D     C     I     K     L    
    [41] H     other B     F     M     A     G     E    
    [49] J     D     C     I     K     L     H     other
    [57] B     F     M     A     G     E     J     D    
    [65] C     I     K     L     H     other
    Levels: other H L K I C D J E G A M F B
    
    O alternativamente, usamos la función fct_rev

    library(forcats)
    p <- ggplot(ra.melt, aes(x = variable, y = value))
    p + geom_bar(aes(fill = fct_rev(quality)), stat = "identity") + 
      labs(x = "group", y = "percentage (%)")
    
  • Si deseamos invertir el orden de las barras pero no de la leyenda, usamos el position_stack(reverse = TRUE)
  • p <- ggplot(ra.melt, aes(x = variable, y = value))
    p + geom_bar(aes(fill = fct_rev(quality)), stat = "identity", position = position_stack(reverse = TRUE)) + labs(x = "group", y = "percentage (%)")
    

Referencias

Entradas relacionadas

2017-05-22

Crear diagramas de dispersión dinámicos con manipulate en R

Problema

El paquete manipulate nos permite modificar gráficos interactivamente en RStudio mediante controles deslizantes, selectores, casillas y botones. En este ejemplo, crearemos un diagrama de dispersión en el que podremos seleccionar dinámicamente las columnas del data frame a representar en cada eje.

Solución

  • Creamos la función
  • Dentro de plot utilizamos los argumentos de cada eje seleccionado: xaxis y yaxis. Usamos controles deslizantes (sliders) para manipular el gráfico. Fijamos los valores iniciales en 1 y 2.

    library(manipulate)
    scatterplot <- function(dataset){
      vars <- as.list(names(dataset))
      name <- sys.call()[[2]]
    manipulate(
      plot(dataset[, xaxis] ~ dataset[, yaxis], 
           xlab = colnames(dataset)[xaxis],
           ylab = colnames(dataset)[yaxis], 
           main = as.character(name)),   
      xaxis = slider(1, as.numeric(dim(dataset)[2]), initial = 1), 
      yaxis = slider(1, as.numeric(dim(dataset)[2]), initial = 2)  
      )
    }
    
  • Indicamos data frame a representar
  • scatterplot(mtcars)
    

Resultado

En los controles deslizantes aparecen las 11 columnas del data frame mtcars. Al seleccionar una columna en el control deslizante se actualizarán las datos representados, el título principal y los títulos de los ejes. Si la columna seleccionada no fuera numérica, no se representará un diagrama de dispersión.

Entradas relacionadas

Referencias

2017-05-16

Filtrar una tabla de contingencia en R

Problema

Deseamos filtrar una tabla de contigencia. En nuestro ejemplo con el conjunto de datos chickwts, aquellos que tengan un factor de feed mayor que 11.

table(chickwts$feed)
   casein horsebean   linseed  meatmeal   soybean sunflower 
       12        10        12        11        14        12

Solución

  • Paquete base
  • Utilizando la función subset.

    subset(data.frame(table(chickwts$feed)), Freq > 11)
    
  • dplyr
  • library(dplyr)
    chickwts %>% 
      count(feed) %>%
      filter(n > 11) 
    
    

Resultado

 # base
      Var1 Freq
1    casein   12
3   linseed   12
5   soybean   14
6 sunflower   12

# dplyr

# A tibble: 4 × 2
       feed     n
      
1    casein    12
2   linseed    12
3   soybean    14
4 sunflower    12

Entradas relacionadas

Referencias

2017-05-02

Cómo dividir un data frame en partes iguales y quedarnos con una de ellas

Problema

Queremos dividir un data frame en 5 partes iguales y quedarnos con una de ellas, en nuestro ejemplo la tercera.

df<- data.frame(data=(1:100))
library(tibble)
as_tible(df)
# A tibble: 100 × 1
    data
   
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      9
10    10
# ... with 90 more rows

Solución

Creamos una columna con la función ntile que nos indica cada una de las 5 partes del data frame. Filtramos el data frame quedándonos con la tercera parte.

library(dplyr)
df[ntile(df$data, 5) == 3, ]
df %>% 
  mutate(n = ntile(data, 5)) %>% 
  filter(n == 3) %>% 
  select(data)

Resultado

   data
1    41
2    42
3    43
4    44
5    45
6    46
7    47
8    48
9    49
10   50
11   51
12   52
13   53
14   54
15   55
16   56
17   57
18   58
19   59
20   60

Entradas relacionadas

Referencias

2017-04-22

Controlar la transparencia con geom_rect en ggplot2

Problema

Si tratamos de crear un rectángulo semitransparente (argumento alpha) en ggplot mediante geom_rect obtenemos un rectángulo opaco.

  • Datos originales
  • df1 <- structure(list(date = structure(c(1335744000, 1380499200, 1464652800, 1356912000, 
        1485820800, 1490918400, 1383177600, 1461888000, 1454025600, 1367280000, 1343692800, 
        1401408000, 1330473600, 1391126400, 1459382400, 1404086400, 1417132800, 1477872000, 
        1469750400, 1443571200, 1419984000, 1438300800, 1346371200, 1369958400, 1483056000, 
        1440979200, 1424995200, 1377820800, 1388448000, 1375228800, 1480464000, 1359590400, 
        1354233600, 1412035200, 1427760000, 1385683200, 1467244800, 1472601600, 1372377600, 
        1475193600, 1333065600, 1435622400, 1409270400, 1396224000, 1488240000, 1364515200, 
        1340928000, 1406764800, 1456704000, 1430352000, 1338422400, 1348790400, 1351641600, 
        1432857600, 1327968000, 1448841600, 1398816000, 1446163200, 1362009600, 1422576000, 
        1451520000, 1414713600, 1393545600), class = c("POSIXct", "POSIXt")), pb = c(3.24284787690623, 
        2.35203304295562, 1.13562266384702, 2.90837861538151, 1.97393507382208, 1.79790256367522, 
        2.50992970378761, 1.2966057820916, 0.892051550643623, 2.56310397446516, 2.53722570614735, 
        2.42427665519818, 3.40294643294178, 2.2456624603825, 1.06554620628802, 2.12883927956712, 
        1.65800890792078, 1.71460655379306, 1.45450176074979, 1.28199154762022, 1.51004082825039, 
        1.59579220438853, 2.48072865275449, 2.52511938910325, 1.77197981412129, 1.4666225767599, 
        1.65482654263216, 2.24097337718875, 2.39207143276774, 2.18796717170196, 1.78667497794161, 
        2.95189774752025, 2.70906851093917, 1.8620615761957, 1.48932926967017, 2.40482981571083, 
        1.3614263004647, 1.5052848414737, 2.02094466655017, 1.67901881433697, 3.13131652724628, 
        1.7081053507639, 2.15479184551088, 2.37902994058881, 1.88440485774789, 2.57891658188723, 
        2.43424745762712, 2.25929464919641, 0.913664833729333, 1.58426153545149, 2.71711735504797, 
        2.59023788287105, 2.68172936708349, 1.5228439100185, 3.47144812971019, 1.07692509768545, 
        2.46172899067256, 1.34932598268774, 2.86559619320822, 1.43158577260698, 1.06755701001995, 
        1.87542832179586, 2.41716851824514), return_index = c(3.33963134143023, 3.53315257934844, 
        2.24983743575813, 3.54713517594007, 3.17031433226149, 2.92415007661754, 3.72288287285945, 
        2.43858382371356, 1.78853472205546, 3.17524563672478, 2.99957813429811, 3.72169243241355, 
        3.39125767791388, 3.614770311344, 1.98808399128776, 3.61004165944114, 3.16597358572951, 
        2.74562414401218, 2.30169956340851, 2.58899122167033, 3.00735830908446, 2.97573979012093, 
        2.9863799905072, 3.38703452069432, 2.98242176129961, 2.83290428019513, 3.44566574584198, 
        3.47136232987663, 3.75521536603366, 3.36372318786495, 2.90514490677928, 3.58331595473466, 
        3.28803779749728, 3.46781820411579, 3.2620117615886, 3.69607811617486, 2.19921609345358, 
        2.40895876306335, 3.04629884791247, 2.66358570431915, 3.25119873581604, 3.04330107396291, 
        3.68720702192003, 3.66737118374507, 2.97502296939418, 3.18097138521817, 2.95437617876303, 
        3.88945888388189, 1.81411076858085, 3.36085071796473, 3.00333046534821, 3.15899275395851, 
        3.27461188875339, 3.32892263614407, 3.47144812971019, 2.10766875686013, 3.79609591229452, 
        2.68219490565046, 3.54425781082805, 2.99623108334085, 2.08090136364801, 3.4771813132669, 
        3.79370144175553)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -63L), 
        .Names = c("date", "pb", "return_index"))
    

  • Código original
  • library(ggplot2)
    min_date = min(df1$date) # data frame creado más abajo
    max_date = max(df1$date)
    ggplot(df1) +
        geom_rect(aes(xmin = min_date, xmax = max_date, ymin = -Inf, ymax = 3), fill = "palegreen", alpha = 0.2) +
        geom_line(aes(x = date, y = pb, colour = "P/B")) +
        geom_line(aes(x = date, y = return_index, colour = "return"))
    

Solución

La función geom_rect dibuja rectángulos, uno por cada una de las filas, superpuestos uno encima del otro, de manera que el resultado final es un rectángulo opaco. Para resolverlo tenemos 2 alternativas:

  1. Alternativa 1: Usar annotate en lugar de geom_rect.
  2. ggplot(df1) +
      annotate("rect", xmin = min_date, xmax = max_date, ymin = -Inf, ymax = 3, fill = "palegreen", alpha = 0.2) +
      geom_line(aes(x = date, y = pb, colour = "P/B")) +
      geom_line(aes(x = date, y = return_index, colour = "return"))
    
  3. Alternativa 2: Eliminar el argumento data = df1 de la función ggplot y añadirlo en las capas que lo necesiten.
  4. ggplot() +
      geom_rect(aes(xmin = min_date, xmax = max_date, ymin = -Inf, ymax = 3), fill = "palegreen", alpha = 0.2) +
      geom_line(data= df1, aes(x = date, y = pb, colour = "P/B")) +
      geom_line(data= df1, aes(x = date, y = return_index, colour = "return"))
    

Resultado

Entradas relacionadas

2017-04-16

Control de versiones con RStudio, Git y GitHub

Introducción

Control de versiones es un sistema que nos permite llevar un registro de los cambios en nuestro código y compartir los mismos con otros. Es una herramienta muy valiosa tanto para para trabajar en equipo como para trabajar individualmente, manteniendo nuestro código actualizado y accesible desde cualquier ordenador.

¿Por qué usar control de versiones, Git y GitHub?

  • Permite trabajar simultáneamente con el mismo fichero, evitando sobreescribir cambios, guardando un registro de los mismos, y combinándolos automáticamente, mostrando los conflictos entre las diferentes versiones.
  • Evitar errores y pérdidas accidentales ya que permite revisar el historial de cambios y restaurar versiones anteriores.
  • Facilita compartir nuestro código y acceder al mismo desde cualquier ordenador, sin necesidad de emails o de sistemas de almacenamientos de archivos no pensados para la edición de código.
  • Git y GitHub son dos de las herramientas más populares de control versiones. Esto facilita poder encontrar más fácilmente soluciones en StackOverflow u otros foros a los problemas que puedan surgirnos. RStudio también permite con otro sistema de control de versiones: Subversion.

Inconvenientes

  • La curva de aprendidaje es empinada y puede ser frustrante al principio.
  • Aprender la terminología y sintáxis.
Por suerte, ser capaz de configurar un control de versiones con RStudio y aprovecharnos de las funcionalidades más básicas es muy sencillo.

Configuración

  1. Instala Git
  2. Configuramos Git. Abrimos Git Bash o Git CMD e indicamos nuestro nombre y cuenta de correo electrónico:
  3. git config --global user.name "Nombre"
    git config --global user.email "Dirección de correo electrónico"
    # Para comprobar la configuración
    git config --global --list 
    
  4. Configuramos RStudio. Clic en Tools. En la sección Git/SVN marcamos la opción de Enable version control interface for RStudio projects. En Git executable indicamos la ruta del ejecutable, en el caso de que tras instalar Git y reiniciar RStudio no aparezca.
  5. Abrimos una cuenta gratuita en GitHub
  6. Creamos un repositorio en GitHub.

Clonar un repositorio de GitHub

Crearemos una copia de un repositorio de GitHub en nuestro ordenador.

  1. Clic en File y en New Project, Version Control y Git.
  2. Rellenamos los siguientes 3 campos:
    • Repository URL: la dirección en GitHub del repositorio a clonar.
    • Project directory name: por defecto tomará el nombre del repositorio en GitHub.
    • Create project as subdirectory of: creará por defecto una carpeta con el nombre del proyecto en el directorio de trabajo.
  3. Clic en Create Project

Gestión básica de un proyecto

Una vez creado un proyecto, podemos copiar o guardar scripts en la carpeta creada anteriormente (por defecto una carpeta dentro del directorio de trabajo actual).

Hay 3 secciones dentro de RStudio

  1. El panel git, en la esquina superior derecha, muesta los ficheros cambiados e incluye los botones más importantes de los comandos de Git.
  2. El menú desplegable git, disponible en la barra de herramientas, con los comandos Git, GitHub y otra serie de acciones aplicables al fichero actual:
  3. Panel con los ficheros y subcarpetas dentro del proyecto.

Revisar cambios

En el panel de Git podemos examinar los cambios realizados. Los iconos indican si los ficheros han sido:

  • Modificados - Se ha cambiado su contenido.
  • Sin seguimiento (Untracked) - Ficheros añadidos detectados por Git.
  • Borrados (Deleted) - Ficheros borrados.
Para conocer más detalles de los cambios de un fichero, clic en Diff en el panel Git o en el menú desplegable Git en la barra de herramientas. Después clic en el fichero deseado.

En el menú emergente los colores nos ayudan a localizar el texto añadido en verde, el texto eliminado, en rojo y en blanco sin cambios. Las columnas de números señalan la ubicación del código: a la izquierda en la antigua versión, y a la derecha en la nueva.

Guardar cambios

Para guardar los cambios utilizamos Commit que confirma los cambios realizados.
  1. Guardamos el documento actual en RStudio: clic en Save o bien Ctrl + S.
  2. Abrimos el menú emergente, el mismo de la sección anterior: clic en Commit o Ctrl + Alt + M
  3. Seleccionamos los archivos deseados, Ctrl + A para seleccionar todos, y marcamos la casilla de verificación Staged. Cambiará el icono en la columna Status.
  4. Escribimos un mensaje en la sección Commit message, describiendo los cambios realizados. Es obligatorio.
  5. Clic en el botón Commit.

Sincronizar los cambios con GitHub

Hasta ahora hemos trabajado localmente en nuestro ordenador. Para subir los cambios a GitHub: presionamos Push en el panel Git. Nos informará de si el cambio fue realizado con éxito, o del motivo del error.

Si por el contrario, hemos hecho cambios desde otro ordenador y queremos cerciorarnos de que tenemos la última copia guardada en GitHub en presionaremos Pull.

Entradas relacionadas

Referencias

Nube de datos