# Visualización de la información I

### Explicación

### Gráficos Básicos en R

Rbase tiene algunos comandos genéricos para realizar gráficos, que se adaptan al tipo de información que se le pide graficar, por ejemplo:

- plot()
- hist()

    # iris es un set de datos clásico, que ya viene incorporado en R
    iris[1:10,]

    plot(iris)

    #Al especificar una variable, puedo ver el valor que toma cada uno de sus registros (Index)
    plot(iris$Sepal.Length,type = "p") # Un punto por cada valor

    plot(iris$Sepal.Length,type = "l") # Una linea que una cada valor

    plot(iris$Sepal.Length,type = "b") #Ambas

    hist(iris$Sepal.Length, col = "lightsalmon1", main = "Histograma")

#### png

La función `png()` nos permite grabar una imagen en el disco. Lleva como argumento principal la ruta completa a donde se desea guardar la misma, incluyendo el nombre que queremos dar al archivo. A su vez pueden especificarse otros argumentos como el ancho y largo de la imagen, entre otros.

    ruta_archivo <- "../Resultados/grafico1.PNG"
    ruta_archivo

    [1] "../Resultados/grafico1.PNG"

    png(ruta_archivo)
    plot(iris$Sepal.Length,type = "b")
    dev.off()

    null device
              1

La función `png()` abre el dispositivo de imagen en el directorio especificado. Luego creamos el gráfico que deseamos (o llamamos a uno previamente construido), el cual se desplegará en la ventana inferior derecha de la pantalla de Rstudio. Finalmente con `dev.off()` se cierra el dispositivo y se graban los gráficos.

Los gráficos del R base son útiles para escribir de forma rápida y obtener alguna información mientras trabajamos. Muchos paquetes estadísticos permiten mostrar los resultados de forma gráfica con el comando `plot` (por ejemplo, las regresiones lineales `lm()`).

Sin embargo, existen librerías mucho mejores para crear gráficos de nivel de publicación. La más importante es ggplot2, que a su vez tiene extensiones mediante otras librerías.

### Ggplot2

`ggplot` tiene su sintaxis propia. La idea central es pensar los gráficos como una sucesión de capas, que se construyen una a la vez.

- El operador `+` nos permite incorporar nuevas capas al gráfico.

- El comando `ggplot()` nos permite definir la fuente de datos y las variables que determinaran los ejes del grafico (x,y), así como el color y la forma de las líneas o puntos,etc.

- Las sucesivas capas nos permiten definir:

  - Uno o más tipos de gráficos (de columnas, `geom_col()`, de línea, `geom_line()`, de puntos, `geom_point()`, boxplot, `geom_boxplot()`)
  - Títulos `labs()`
  - Estilo del gráfico `theme()`
  - Escalas de los ejes `scale_y_continuous`,`scale_x_discrete`
  - División en subconjuntos `facet_wrap()`,`facet_grid()`

`ggplot` tiene muchos comandos, y no tiene sentido saberlos de memoria, es siempre útil reutilizar gráficos viejos y tener a mano el machete.

#### Dimensiones del gráfico

Esta forma de pensar los gráficos nos permite repenser los distintos atributos como potenciales aliados a la hora de mostrar información multidimensional. Por ejemplo:

- color `color =`
- relleno `fill =`
- forma `shape =`
- tamaño `size =`
- transparencia `alpha =`

- Abrir un mismo gráfico según alguna variable discreta: `facet_wrap()`

- Los atributos que queremos que mapeen una variable, deben ir dentro del aes(), `aes(... color = variable)`

- Cuando queremos simplemente mejorar el diseño (es fijo), se asigna por fuera, o dentro de cada tipo de gráficos, `geom_col(color = 'green')`.

#### Gráfico de Puntos

A continuación se muestra un gráfico de varias capas de construcción, con su correspondiente porción de código. En el mismo se buscará visualizar, a partir de la base de datos iris la relación entre el ancho y el largo de los petalos, mediante un gráfico de puntos.

    library(tidyverse) # cargamos la librería

    ggplot(data = iris, aes(x = Petal.Length, Petal.Width, color = Species))+
      geom_point(alpha=0.75)+
      labs(title = "Medidas de los pétalos por especie")+
      theme(legend.position = 'none')+
      facet_wrap(~Species)

#### Capas del Gráfico

Veamos ahora, el “paso a paso” del armado del mismo.

En primera instancia solo defino los ejes. Y en este caso un color particular para cada Especie.

    g <- ggplot(data = iris, aes(x = Petal.Length, Petal.Width, color = Species))
    g

Luego, defino el tipo de gráfico. El alpha me permite definir la intensidad de los puntos

    g <- g +  geom_point(alpha=0.25)
    g

Las siguientes tres capas me permiten respectivamente:

- Definir el título del gráfico
- Quitar la leyenda
- Abrir el gráfico en tres fragmentos, uno para cada especie

    g <- g +
      labs(title = "Medidas de los pétalos por especie")+
      theme(legend.position = 'none')+
      facet_wrap(~Species)
    g

#### Extensiones de GGplot.

La librería GGplot tiene a su vez muchas otras librerías que extienden sus potencialidades. Entre nuestras favoritas están:

- gganimate: Para hacer gráficos animados.
- ggridge: Para hacer gráficos de densidad faceteados
- ggally: Para hacer varios gráficos juntos.
- treemapify

    library(GGally)
    ggpairs(iris,  mapping = aes(color = Species))

    library(ggridges)
    ggplot(iris, aes(x = Sepal.Length, y = Species, fill=Species)) +
      geom_density_ridges()

También hay extensiones que te ayudan a escribir el código, como esquisse

    iris <- iris
    #Correr en la consola
    esquisse::esquisser()

### Ejemplo con datos reales

#### Boxplot de ingresos de la ocupación principal, según nivel educativo

    Individual_t119 <- read.table("../Fuentes/usu_individual_t119.txt",
                                  sep=";", dec=",", header = TRUE, fill = TRUE)

Hacemos un procesamiento simple: Sacamos los ingresos iguales a cero y las no respuestas de nivel educativo.
Es importante que las variables sean del tipo que conceptualmente les corresponde (el nivel educativo es una variable categórica, no continua), para que el ggplot pueda graficarlo correctamente.

    # Las variables sexo( CH04 ) y Nivel educativo están codificadas como números, y el R las entiende como numéricas.
    class(Individual_t119$NIVEL_ED)

    [1] "integer"

    class(Individual_t119$CH04)

    [1] "integer"

    ggdata <- Individual_t119 %>%
      filter(P21>0, !is.na(NIVEL_ED)) %>%
      mutate(NIVEL_ED = as.factor(NIVEL_ED),
             CH04     = as.factor(CH04))

    ggplot(ggdata, aes(x = NIVEL_ED, y = P21)) +
      geom_boxplot()+
      scale_y_continuous(limits = c(0, 40000))#Restrinjo el gráfico hasta ingresos de $40000

Si queremos agregar la dimensión sexo, podemos hacer un `facet_wrap()`

    ggplot(ggdata, aes(x= NIVEL_ED, y = P21, group = NIVEL_ED, fill = NIVEL_ED )) +
      geom_boxplot()+
      scale_y_continuous(limits = c(0, 40000))+
      facet_wrap(~ CH04, labeller = "label_both")

Por la forma en que está presentado el gráfico, el foco de atención sigue puesto en las diferencias de ingresos entre niveles educativo. Simplemente se agrega un corte por la variable de sexo.

Si lo que queremos hacer es poner el foco de atención en las diferencias por sexo, simplemente basta con invertir la variable x especificada con la variable utilizada en el `facet_wrap`

    ggplot(ggdata, aes(x= CH04, y = P21, group = CH04, fill = CH04 )) +
      geom_boxplot()+
      scale_y_continuous(limits = c(0, 40000))+
      facet_grid(~ NIVEL_ED, labeller = "label_both") +
      theme(legend.position = "none")

[encoded data, 11444 characters]