Motivación

Contenido (I)

  • Qué es R: bogota-r.github.io/intro
  • Gráficas Base
    • Métodos - Todo de una: plot()
    • El modelo base
    • Estado y parámetros graficos: par()
  • Grid
    • Qué es grid (o por qué otro sistema?)
    • El modelo grid
    • Componentes

Contenido (II)

  • lattice
    • Trellis plots
  • ggplot2
    • Una gramática de gráficas: Capas, geometrías y componentes estéticos

Contenido (III)

  • Maś allá: gráficas interactivas
    • ggvis y shiny
    • Integración con JS y htmlwidgets

Qué es R?

"R is a language and environment for statistical computing and graphics."

Entre otras cosas R incluye:

  • capacidad para almacenar y manipular datos efectivamente
  • un conjunto de operadores para hacer cálculos sobre arreglos, particularmente matrices
  • una colección grande, coherente e integrada de herramientas para el análisis de datos
  • dispositivos gráficos para el análisis y visualización de datos, tanto en pantalla como en impreso

  • un lenguaje de programación bien desarrollado, simple y eficaz

El ambiente para graficas de R

Básicamente

library("graphics")
library("grid")

# http://lattice.r-forge.r-project.org/
library("lattice")

# https://github.com/hadley/ggplot2
library("ggplot2")

Gráficas Base

Métodos (o todo de una):

  • plot() para "diagramas de dispersión"
  • barplot() para gráficas de barra
  • hist() para histogramas
  • boxplot() (y bxp()) para diagramas de cajas y bigotes
  • pie() - mejor evitarlos

plot()

set.seed(13579)

y <- rnorm(30)
types <- c("p", "l", "b", "c", "o", "h", "s", "S", "n")

par(mfrow = c(3, 3), cex = 0.6, mar = c(3, 3, 3, 1))

for (type in types){
  plot(y, type = type, main = paste0("type = ", type))
}

plot()

plot()

plot() es una función genérica. Hay muchas formas de especificar los datos y dependiendo de lo que se le pase se genera uno u otro tipo de gráfico.

Veamos unos ejemplos usando el conjunto de datos iris:

str(iris)
#> 'data.frame':    150 obs. of  5 variables:
#>  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#>  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

plot()

plot(iris)

plot()

par(mfrow = c(1, 2), mar = c(5, 4, 2, 2))

plot(iris$Petal.Length, iris$Petal.Width)
plot(Petal.Length ~ Species, data = iris)

plot() - Métodos

methods("plot")
#>  [1] plot.acf*           plot.data.frame*    plot.decomposed.ts*
#>  [4] plot.default        plot.dendrogram*    plot.density*      
#>  [7] plot.ecdf           plot.factor*        plot.formula*      
#> [10] plot.function       plot.hclust*        plot.histogram*    
#> [13] plot.HoltWinters*   plot.isoreg*        plot.lm*           
#> [16] plot.medpolish*     plot.mlm*           plot.ppr*          
#> [19] plot.prcomp*        plot.princomp*      plot.profile.nls*  
#> [22] plot.raster*        plot.spec*          plot.stepfun       
#> [25] plot.stl*           plot.table*         plot.ts            
#> [28] plot.tskernel*      plot.TukeyHSD*     
#> see '?methods' for accessing help and source code

barplot()

… pero antes unos datos más interesantes

library("saber")  # Ver github.com/nebulae-co/saber
data(SB11_20142)
# glimpse(SB11_20142)

estratos <- with(SB11_20142, table(PERS_GENERO, FINS_ESTRATOVIVIENDAENERGIA))
educacion_madre <- SB11_20142 %$% table(PERS_GENERO, FINS_NIVELEDUCATIVOMADRE)

barplot()

par(mfrow = c(2, 1), mar = c(3, 5.5, 1, 1), cex = 0.95)

barplot(estratos, angle = c(45, 135), density = 20, col = "grey",
        names = colnames(estratos), xlab = "Estrato")

legend("topright", title = "Género", rownames(estratos), cex = 1.5,
       angle = c(45, 135), density = 20, fill = "gray")

barplot(educacion_madre, angle = c(45, 135), density = 20, 
        col = colors()[c(50, 100)], horiz = TRUE,
        names = colnames(educacion_madre), ylab = "Nivel Educativo\n Madre")

barplot()

boxplot() - bxp()

par(mfrow = c(1, 2), mar = c(4, 4, 4, 2), cex = 0.8)

boxplot(MATEMATICAS_PUNT ~ FINS_ESTRATOVIVIENDAENERGIA, data = SB11_20142,
        col = "light grey")

boxplot(MATEMATICAS_PUNT ~ FINS_ESTRATOVIVIENDAENERGIA, data = SB11_20142,
        pch = 1:6, boxwex = 0.5, boxfill = "lightblue", frame.plot = FALSE,
        main = "Distribución del puntaje\n de matemáticas por estrato",
        xlab = "Estrato", ylab = "Puntaje de matemáticas")

boxplot() - bxp()

Gráficas para 3 ó más dimensiones

  • persp() superficies.
  • contour() y filled.contour() contornos.
  • image() cuadrícula con colores en \(z\).
  • symbols() diagramas de dispersión con símbolos de tamaño variable.
  • fourfoldplot() para tablas de contingencia \(2\times 2\times k\).
  • mosaicplot()
  • stars() para una visualización de varias variables cuantitativas.

persp()

persp()

contour()

contour()

image()

symbols()

fourfoldplot()

mosaicplot()

stars()

stars()

Otras funciones gráficas de alto nivel:

  • matplot() para gráficas de dispersión cruzando matrices.
  • stripchart() gráfica de dispersión en una sola dimensión.
  • curve() para gráficar funciones (como plot.function()).

Algunas más modernas o específicas:

Además de los métodos específicos para plot():

  • dotchart() para resumir una variable cuantitativa cruzada con una o más variables categóricas.
  • coplot() gráficas condicionales (Trellis).
  • sunflowerplot() para diagramas de dispersión con datos superpuestos - alternativas para esto son image() o hexbin::hexbin().
  • assocplot() visualización de una prueba de independencia para una tabla de contingencia bi-dimensional - vcd extiende esto y ofrece más herramientas para datos categóricos.

El modelo gráfico base

  • Márgenes externas
  • Región de la figura
  • Región de la gráfica \(\rightarrow\) Sistema coordenado (xlim y ylim en funciones de alto nivel o par("usr"))
  • Margen de la figura (Región de la figura - Región de la gráfica)

El modelo gráfico base

par() y algunos parámetros gráficos

El sistema base mantiene un estado que se consulta y modifica con par().

Podemos clasificar los parámetros de acuerdo a los componentes de las gráficas afectan y si son de alto nivel, bajo nivel o solo lectura.

  • Alto nivel: pueden ser con llamados a los métodos gráficos o con par().
  • Bajo nivel: solo pueden ser modificados a través de par()

Colores

Parametro Descripción Nivel
bg Color del fondo Bajo
col Colores de simbolos y lineas Alto
fg Color del frente Alto
gamma Correción gamma de colores Alto

col y fg tienen sufijos .axis, .lab, .main y .sub

Colores

Algunas funciones para trabajar con colores:

  • colors() nombres de colores
  • pallete() la paleta numerica de colores
  • rgb(), hsv(), convertColor() colorspace espacios de colores
  • heat terrain topo cm .colors() paletas de colores
  • rainbow() gray() mas paletas en RcolorBrewer
  • colorRamp() y colorRampPallete() crear paletas

Lineas

Parametro Descripción Nivel
lend Forma de la terminación Bajo
ljoin Forma de la unión Bajo
lmitre Algo como enrredado Bajo
lty Tipo de linea Alto
lwd Grosor de la linea Alto

Texto

Parametro Descripción Nivel
adj Justificacion del texto Alto
ann "Anotar" el grafico? Alto
cex Tamaño del texto Alto
family Familia de la fuente Bajo
font Tipo de fuente (negrita, etc) Alto
las Rotación del texto en margenes Alto
lheight Espacio entre lineas Bajo
ps Tamaño de la fuente Bajo
srt Rotación del texto en el grafico Alto
tmag Tamaño del titulo del grafico Bajo

cex y ps tienen sufijos .axis, .lab, .main y .sub

Simbolos

Parametro Descripción Nivel
pch Simbolo para datos Alto
type Tipo de gráfica Alto

bg y cex tambien pueden afectar los simbolos

Ejes

Parametro Descripción Nivel
lab Numero de marcas Alto
mgp Posición de marcas y etiquetas ALto
tck Lonitud de las marcas Alto
tcl Lonitud de las marcas Alto
[x|y]axp Numero de marcas Alto
[x|y]axs Rango del eje Alto
[x|y]axt Estilo del eje Alto
[x|y]log Escala logaritmica? Bajo

Tambien es relevante [x|y]lim que pasa desde las funciones de alto nivel.

Regiones y sistemas coordenados

Parametro Descripción Nivel
oma Margenes externas (lineas) Bajo
omi Margenes externas (inch) Bajo
omd Margenes externas (porporciones) Bajo
fig Ubicación de la figura (vertices) Bajo
fin Ubicación de la figura (centro) Bajo
mar Margenes de la figura (lineas) Bajo
mai Margenes de la figura (inch) Bajo
mex Tamaño de linea en margenes Bajo
plt Ubicación del gráfico (proporciones) Bajo

Regiones y sistemas coordenados

Parametro Descripción Nivel
pin Ubicación del gráfico (centro) Bajo
pty Ubicación del gráfico ("m", "s") Bajo
xpd Clipping Alto
cin Tamaño de un caracter (inch) Lectura
usr Rango de los Ejes Bajo
din Tamaño del dispositivo grafico (inch) Lectura
cra Tamaño de un caracter ("pixels") Lectura
cxy Tamaño de un caracter ("usr") Lectura

Tambien es relevante [x|y]lim que pasa desde las funciones de alto nivel.

Nuevas graficas y multiples graficos

Parametro Descripción Nivel
ask Preguntar por nueva pagina? Bajo
new Empezo una gráfica nueva? Bajo
mfg Que figura (fila, col) se usa Bajo
mfrow Varias en una la pagina (por fila) Bajo
mfcol Varias en una la pagina (por col) Bajo

Algunas funciones reciben al argumento add Tambien esta la función layout() y split.screen().

Nuevas graficas y multiples graficos

nf <- layout(mat = matrix(c(2, 0, 1, 3), 2, 2, byrow = TRUE), widths = c(3, 1),
             heights = c(1, 3), respect = TRUE)

layout.show(nf)

Componentes de bajo nivel

Función Descripción
lines() y matlines() Líneas
points() y matpoints() Puntos
rect() Rectángulos
poly() Polígonos
segments() Segmentos
text() Texto

Utilidades

Función Descripción
grid() Cuadrículas
abline() Rectas
arrows() Flechas
box() Borde
rug() "Rug" en ejes
mtext() Texto en las márgenes
title() Títulos y etiquetas de ejes
legend() Leyenda

Utilidades

Función Descripción
axis() y axTicks() Ejes
strheight() Tamaños de caracteres
strwidth() Tamaños de caracteres
xinch() Transformaciones a coordenadas
yinch() Transformaciones a coordenadas
xyinch() Transformaciones a coordenadas
cm() Transformaciones a coordenadas

Cómo hacer una función gráfica?

plot.newclass <- function(x, y = NULL, main = "", sub = "",  xlim = NULL, 
                          ylim = NULL, axes = TRUE, ann = par("ann"),
                          col = par("col"), ...){
  xy <- xy.coords(x, y)
  if (is.null(xlim))
    xlim <- range(xy$x[is.finite(xy$x)])
  if (is.null(ylim))
    ylim <- range(xy$y[is.finite(xy$y)])
  opar <- par(no.readonly = TRUE)
  on.exit(par(opar))
  plot.new()
  plot.window(xlim, ylim, ...)
  points(xy$x, xy$y, col = col, ...)
  if (axes) {
    axis(1)
    axis(2)
    box()
  }
  if (ann) 
    title(main = main, sub = sub, 
          xlab = xy$xlab, ylab = xy$ylab, ...)
}

Código por Paul Murrell

Cómo hacer una función gráfica?

png_meme_generator <- function(x, main, sub){
  con <- url(x, open = 'rb')
  rawpng <- readBin(con, what = 'raw', n = 50000)
  close(con)
  
  img <- png::readPNG(rawpng)
  
  old_par <- par(no.readonly = TRUE)
  on.exit(par(old_par))
  par(xpd = NA, mgp = c(0, 0, 0), oma = c(0, 0, 0, 0), ann = F)
  
  plot.new()
  plot.window(0:1, 0:1)
  
  usr <- par("usr")    
  rasterImage(img, usr[1], usr[3], usr[2], usr[4])
  
  text(.5, 1.05,  main, cex = 2, col = "#000000", pos = 3)
  text(.5, -.05,   sub, cex = 2, col = "#000000", pos = 1)
}

Una nueva función gráfica:

png_meme_generator(
  "http://i2.kym-cdn.com/photos/images/original/000/208/140/1322357772581.png",
  "Tu cara cuando ves", 
  "un meme hecho en R")

Grid

Qué es grid?

Grid es un sistema gráfico alternativo, flexible y poderoso.

Tres componentes:

  • "puertos" (viewports)
  • unidades ?units
  • parámetros gráficos ?gpar
  • Estructura de arbol. Objetos grafics o grobs.

Grid solo ofrece componentes de bajo nivel.

Puertos

Region rectangular que proporciona un contexto para dibujar.

Contexto para dibujar: - Contexto geometrico: sistema coordenado - Contexto gráfico: parametros gráficos

Grid

v <- viewport(x = 0.6, y = 0.6, w = unit(1, "inches"), h = unit(1, "inches"))
grid.show.viewport(v)

Lattice

Que es lattice?

Laticce es una libreria que proporciona funciones gráficas de alto nivel basadas en grid y útiles para generar gráficas para datos multivariados a través de condicionamiento (Trellis plots) basado en trabajo e ideas de William Cleveland.

Lattice

  • Está basado en el paquete grid y por lo tanto hereda gran parte de sus características.
  • La visualización con Trellis se define por el tipo de gráfica y los roles de las variables, los más comunes son:

  • Variables primarias
  • Variables que condicionan
  • Variables de agrupamiento

lattice utiliza una interfaz de fórmula: - ~ x | A: graficar la variable x para cada nivel de A. - y ~ x | A * B graficar la relación entre las variables numéricas y y x para cada combinación de niveles de los "factores" A y B.

Lattice

Lattice - Funciones de alto nivel

Gráfica Descripción Ejemplo de fórmula
histogram() Histograma ~ x
densityplot() Gráfica de "densidad kernel" ~ x | A * B
qqmath() Gráfica de cuantiles teóricos
qq() Gráfica de cuantiles para dos muestras
stripplot() Stripchart A ~ x ó x ~ A
bwplot() Box-Plots comparativos x ~ A ó A ~ x
dotplot() Gráfica de puntos (de Cleveland) ~ x | A
barchart() Gráfica de barras x ~ A ó A ~ x

Lattice - Funciones de alto nivel

Gráfica Descripción Ejemplo de fórmula
xyplot() Diagrama de dispersión y ~ x | A
splom() Matriz de diagramas de dispersión data.frame
contourplot() Gráfica de contornos para superficies z ~ x * y
levelplot() False color level plot of surfaces z ~ y * x
wireframe() Gráfica de perspectiva 3D z ~ y * x
cloud() Diagrama de dispersión 3D z ~ x * y | A
parallelplot() Gráfica de coordenadas paralelas data.frame

Lattice - Ejemplo (I)

histogram(~ MATEMATICAS_PUNT, data = SB11_20142, xlab = "Puntaje Matemáticas", 
          ylab = "Frecuencia relativa")

Lattice - Ejemplo (I)

Lattice - Ejemplo (II)

histogram(~ MATEMATICAS_PUNT | factor(FINS_ESTRATOVIVIENDAENERGIA),
          data = SB11_20142, xlab = "Puntaje Matemáticas", 
          ylab = "Frecuencia relativa")

Lattice - Ejemplo (II)

Lattice - Ejemplo (III)

densityplot(~ MATEMATICAS_PUNT | factor(FINS_ESTRATOVIVIENDAENERGIA),
            data = SB11_20142, groups = PERS_GENERO,
            plot.points = FALSE, auto.key = TRUE, xlab = "Puntaje Matemáticas",
            ylab = "Densidad")

Lattice - Ejemplo (III)

Lattice - Ejemplo (IV)

xyplot(LECTURA_CRITICA_PUNT ~ MATEMATICAS_PUNT | 
       factor(FINS_ESTRATOVIVIENDAENERGIA) * factor(PERS_GENERO),
       data = SB11_20142, xlab = "Puntaje Matemáticas", 
       ylab = "Puntaje Lectura Crítica")

Lattice - Ejemplo (IV)

ggplot2

R moderno o el "Hadleyverse"

  • readr, readxl y haven lectura de archivos.
  • lubridate manejo de fechas y tiempo.
  • stringr interface a stringi para manejo de caracteres.
  • dplyr y tidyr manipulación y limpieza de datos.
  • ggplot2 una gramática de gráficas - util para abstraer y construir visualizaciones.

ggplot2 - Una Gramatica de Graficas

  • Capas:
    • Datos +
    • Estadísticas +
    • Componentes estéticos +
    • Geometría
ggplot(...) +
  layer(...) +
  layer(...) +
  helper(...) +
  helper(...) +
  theme(...)

ggplot2 - Una Gramática de Gráficas

ggplot2 - geometrías y estadísticas

ggplot(mtcars) + aes(y = mpg, x = factor(cyl)) + geom_violin()

Más allá: Gráficas interactivas

Más allá: Gráficas interactivas

Algunos precedentes:

  • animation - generación de graficos animados en diversos formatos.
  • googleVis - interface al Google Charts API.
  • rggobi - interface para ggobi.
  • rCharts - el antecedente directo de htmlwidgets.

Más allá: Gráficas interactivas

Los desarrollos actuales de RStudio et al.:

  • shiny - un framework para desarrollar aplicaciones web (JavaScript!) con componentes reactivos en R.
  • ggvis una gramatica de gráficas interactivas (impulsada por vega) y pensada para explotar shiny.
  • Integración con JavaScript: htmlwidgets.

Aun más:

  • plotly aprovecha la libreria de JavaScript plot.ly e inclusive traduce directamente objetos de ggplot2 - aprovecha htmlwidgets para su integración.

  • rbokeh una interfaz a la libreria de Python bokeh que tambien usa JavaScript para presentar graficos interactivos en navegadores modernos. Igual que plotly aprovecha htmlwidgets para integrarse.

Ayuda y otros recursos

Colofón