Gráficos con R

1. Introducción

1.1. Base y grid

  • En R existen dos formas de generar gráficos:
    • Base graphics
    • Grid graphics
  • Los gráficos base sólo producen un resultado gráfico, pero no un objeto.
  • Los gráficos grid generan un resultado gráfico y un objeto.
  • Dentro del conjunto grid existen dos grandes paquetes: lattice y ggplot2.

1.2. Gráficos lattice

  • Implementación de los gráficos trellis, The Elements of Graphing Data de Cleveland)
  • Estructura matricial de paneles definida a través de una fórmula.
library(lattice)

xyplot(wt ~ mpg | am, data = mtcars, groups = cyl)

1.3. Gráficos ggplot2

  • Implementación de The Grammar of Graphics de Wilkinson.
  • Combinación de funciones que proporcionan los componentes (capas) del gráfico.
library(ggplot2)

ggplot(mtcars, aes(mpg, wt)) +
    geom_point(aes(colour=factor(cyl))) +
    facet_grid(. ~ am)

2. Datos de ejemplo

2.1. Leemos desde el archivo local

  aranjuez <- read.csv('data/aranjuez.csv')

  summary(aranjuez)

2.2. Añadimos algunas columnas

aranjuez$date <- as.Date(aranjuez$X)
aranjuez$month <- as.numeric(
    format(aranjuez$date, '%m'))

aranjuez$year <- as.numeric(
    format(aranjuez$date, '%Y'))

aranjuez$day <- as.numeric(
    format(aranjuez$date, '%j'))

aranjuez$quarter <- quarters(aranjuez$date)
      

3. Catálogo de gráficos

3.1. Gráfico de dispersión de puntos

xyplot(Radiation ~ TempAvg, data=aranjuez)
ggplot(aranjuez, aes(TempAvg, Radiation)) + 
    geom_point()

3.2.

xyplot.png

3.3. Añadimos rejilla

xyplot(Radiation ~ TempAvg, data=aranjuez,
       grid = TRUE)

3.4.

xyplotPG.png

3.5. Añadimos regresión lineal

xyplot(Radiation ~ TempAvg, data=aranjuez,
       type=c('p', 'r'), grid = TRUE,
       lwd=2, col.line='black')
  
ggplot(aranjuez, aes(TempAvg, Radiation)) + 
    geom_point() +
    geom_smooth(method = "lm")

3.6.

xyplotPRG.png

3.7. Añadimos ajuste local

xyplot(Radiation ~ TempAvg, data=aranjuez,
       type=c('p', 'smooth'), grid = TRUE,
       lwd=2, col.line='black')
ggplot(aranjuez, aes(TempAvg, Radiation)) + 
    geom_point() +
    geom_smooth()

3.8.

xyplotSmooth.png

3.9. Paneles

xyplot(Radiation ~ TempAvg|factor(year),
       data=aranjuez)
ggplot(aranjuez, aes(TempAvg, Radiation)) + 
    geom_point() +
    facet_wrap(~factor(year))

3.10.

xyplotYear.png

3.11. Grupos

xyplot(Radiation ~ TempAvg, groups=quarter,
       data=aranjuez, auto.key=list(space='right'))
ggplot(aranjuez, aes(TempAvg, Radiation,
                     color = quarter)) + 
    geom_point()

3.12.

xyplotQuarter.png

3.13. Paneles y grupos

xyplot(Radiation ~ TempAvg|factor(year),
       groups=quarter,
       data=aranjuez,
       layout=c(4, 2),
       auto.key=list(space='right'))
ggplot(aranjuez, aes(TempAvg, Radiation,
                     color = quarter)) + 
    geom_point() +
    facet_wrap(~factor(year))

3.14.

xyplotQuarterYear.png

3.15. Paneles y grupos

xyplot(Radiation ~ TempAvg|factor(year),
       groups=quarter,
       data=aranjuez,
       layout=c(4, 2),
       type=c('p', 'r'),
       auto.key=list(space='right'))

3.16.

xyplotQuarterYearSmooth.png

3.17. Colores y tamaños

xyplot(Radiation ~ TempAvg,
       type=c('p', 'r'),
       cex=2, col='blue',
       alpha=.5, pch=19,
       lwd=3, col.line='black',
       data=aranjuez)

3.18.

xyplotColors.png

3.19. Colores con grupos

xyplot(Radiation ~ TempAvg,
       group=quarter,
       col=c('red', 'blue', 'green', 'yellow'),
       pch=19,
       auto.key=list(space='right'),
       data=aranjuez)

3.20.

xyplotColorGroups.png

3.21. Colores con grupos: par.settings y simpleTheme

  • Primero definimos el tema con simpleTheme
myTheme <- simpleTheme(col=c('red', 'blue',
                             'green', 'yellow'),
                       pch=19, alpha=.6)

3.22. Colores con grupos: par.settings y simpleTheme

  • Aplicamos el resultado en par.settings
xyplot(Radiation ~ TempAvg,
       groups=quarter,
       par.settings=myTheme,
       auto.key=list(space='right'),
       data=aranjuez)

3.23.

myTheme.png

3.24. Colores: brewer.pal

library(RColorBrewer)

myPal <- brewer.pal(n = 4, 'Dark2')

myTheme <- simpleTheme(col = myPal,
                       pch=19, alpha=.6)
  1. ColorBrewer: http://colorbrewer2.org/

3.25. Asignamos paleta con par.settings

xyplot(Radiation ~ TempAvg,
       groups=quarter,
       par.settings=myTheme,
       auto.key=list(space='right'),
       data=aranjuez)

3.26.

brewer.png

3.27. Matriz de gráficos de dispersión

splom(aranjuez[,c("TempAvg", "HumidAvg", "WindAvg",
                  "Rain", "Radiation", "ET")],
      pscale=0, alpha=0.6, cex=0.3, pch=19)
library(GGally)
ggpairs(aranjuez)

3.28.

splom.png

3.29. Matriz de gráficos de dispersión

splom(aranjuez[,c("TempAvg", "HumidAvg", "WindAvg",
                  "Rain", "Radiation", "ET")],
      groups=aranjuez$quarter,
      auto.key=list(space='right'),
      pscale=0, alpha=0.6, cex=0.3, pch=19)

3.30.

splomGroup.png

3.31. Mapa de niveles

levelplot(TempAvg ~ year * day, data = aranjuez)
ggplot(aranjuez, aes(year, day)) + 
    geom_raster(aes(fill = TempAvg))

3.32.

levelplot.png

3.33. levelplot con una paleta mejor

  • Usamos colorRampPalette para generar una función que interpola colores a partir de una paleta
levelPal <- colorRampPalette(
    brewer.pal(n = 9, 'Oranges'))
  • Comprobamos que es una función generadora de colores
levelPal(14)
  • Usamos esta función con col.regions
  levelplot(TempAvg ~ year * day,
            col.regions = levelPal,
            data = aranjuez)

3.34.

levelplotPal.png

3.35. Gráfico de contornos

contourplot(TempAvg ~ year * day,
            data = aranjuez,
            lwd = .5,
            labels = list(cex = 0.6),
            label.style = 'align',
            cuts = 5)

3.36.

contourplot.png

3.37. Box-and-Whiskers

bwplot(Radiation ~ month, data=aranjuez,
       horizontal = FALSE, pch='|')
ggplot(aranjuez, aes(factor(month), Radiation)) + 
    geom_boxplot()

3.38.

bwplot.png

3.39. Box-and-Whiskers

bwplot(Radiation ~ month, data=aranjuez,
       horizontal=FALSE,
       panel=panel.violin)
ggplot(aranjuez, aes(factor(month), Radiation)) + 
    geom_violin()

3.40.

violin.png

3.41. Histogramas

histogram(~ Radiation|factor(year), data=aranjuez)
ggplot(aranjuez, aes(Radiation)) + 
    geom_histogram() +
    facet_wrap(~factor(year))

3.42.

histogram.png

3.43. Gráficos de densidad

densityplot(~ Radiation, groups=quarter,
            data=aranjuez,
            auto.key=list(space='right'))
ggplot(aranjuez, aes(Radiation, color = quarter)) + 
    geom_density()

3.44.

density.png

3.45. Quantile-Quantile

  firstHalf <- aranjuez$quarter %in% c('Q1', 'Q2')
  
  qq(firstHalf ~ Radiation, data=aranjuez)

3.46.

qqHalf.png

3.47. Quantile-quantile

  winter <- aranjuez$quarter %in% c('Q1', 'Q4')
  
  qq(winter ~ Radiation, data=aranjuez)

3.48.

qqWinter.png

3.49. Quantile-Quantile

  qqmath(~TempAvg, data=aranjuez,
         groups=year, distribution=qnorm)

3.50.

qqNorm.png

Autor: Oscar Perpiñán Lamigueiro

Created: 2022-06-15 mié 20:13

Validate