20 de febrero de 2019

¿Qué es ggplot?

Forma parte del motor gráfico desarrollado por Paul Murrell en 2001 llamado grid. De entre las funciones de ggplot se encuentran manipulaciones gráficas como: generación de lienzos, trazo de líneas, dibujo de puntos, etc.

Para el siguiente trabajo se requiere instalar las siguientes librerias:

library(openxlsx)
library(ggplot2)
library(tidyverse)

y se trabajará con distintas bases de datos, las cuales se seleccionarán de acuerdo a los diversos propósitos y vienen incluidas ya en R.

Comenzaremos con la base de datos 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 ...

¿Cómo generar un gráfico con ggplot?

Para ello se necesita construir una sintáxis, la cual obligatoriamente debe tener los siguientes elementos:

Datos: deben ser del tipo data frame o table data frame Se comienza creando un objeto el cual contiene los datos que vamos a utilizar.

p<-ggplot(iris)
p

Estéticas (aes): son, por ejemplo, la distancia horizontal o vertical, el color, la forma , el tamaño, etc.

Entre algunas estéticas tenemos:

  • x e y: distancias horizontal y vertical.

  • colour: para el color.

  • size: para el tamaño.

  • shape: indica la forma de los puntos (cuadrados, triángulos, etc.) o el trazo (continuo, punteado) de las líneas.

  • alpha: para la transparencia, su utilidad se refleja cuando queremos dar peso y/o importancia a ciertos datos.

  • fill: para el color de relleno de las formas sólidas (barras, etc).

A pesar de que x e y se especifican, no hay puntos o líneas en él. Esto se debe a que ggplot no asume a que se refiere, es decir si es un diagrama de dispersión o un gráfico de líneas que se va a dibujar. Con la función aes solo se le ha dicho a ggplot qué conjunto de datos usar y qué columnas deben usarse para los ejes X e Y.

p<-p + aes(x = Petal.Length, y = Petal.Width, colour = Species)
p

Objetos geométricos: son los verbos del lenguaje de los gráficos e indican qué hacer con los datos y las estéticas elegidas y cómo representarlos en un lienzo.

La función geom_point se utiliza para hacer un gráfico de dispersión simple

p + geom_point()

p + geom_point(size=3)+geom_smooth(method = lm,col="firebrick")

¿Cómo eliminamos las leyendas?

Bajo el comando theme(legend.position="None")

¿Cómo agregar captions?

Bajo el comando caption dentro de la función labs, de la siguiente forma:

labs(title="Iris", subtitle="Especies", y="Ancho del pétalo", x="Longuitud del pétalo", caption="Regresión Lineal")

¿Cómo cambiar la paleta de colores?

Se lo puede hacer añadiendo a nuestro objeto la función ** scale_colour_brewer(palette = "nombre_de_los_colores"). El nombre de los colores puede verse la base brewer.pal.info** de la librería RColorBrewer

library(RColorBrewer)
head(brewer.pal.info, 10)
##          maxcolors category colorblind
## BrBG            11      div       TRUE
## PiYG            11      div       TRUE
## PRGn            11      div       TRUE
## PuOr            11      div       TRUE
## RdBu            11      div       TRUE
## RdGy            11      div      FALSE
## RdYlBu          11      div       TRUE
## RdYlGn          11      div      FALSE
## Spectral        11      div      FALSE
## Accent           8     qual      FALSE

Existen un sin número de objetos geométricos sin embargo los más usuales son geom_point, geom_line, geom_histogram, geom_bar y geom_boxplot.

Para consultar otros objetos geométricos se puede dirigir a http://docs.ggplot2.org/current/

¿Cómo ajustar los ejes ?

Los límites de los ejes X e Y se pueden controlar de 2 maneras.

Método 1 : borrando los puntos fuera del rango.

Esto cambiará las líneas a un mejor ajuste en comparación con los datos originales. Se lo hace por xlim() y ylim(). Los argumentos de estas dos últimas funciones pueden ser un vector numérico de longitud 2 (con valores mínimo y máximo) o solo los valores máximo y mínimo.

Método 2 : Acercamiento.

El otro método es cambiar los límites de los ejes X e Y haciendo zoom en la región de interés sin eliminar los puntos. Esto se hace utilizando coord_cartesian().

iris %>% select(Petal.Length,Petal.Width) %>% 
  
summarise(minimo_Petal.Length=min(Petal.Length),
                                                        maximo_Petal.Length=max(Petal.Length),
                                                        minimo_Petal.Width=min(Petal.Width),
                                                        maximo_Petal.Width=max(Petal.Width))
##   minimo_Petal.Length maximo_Petal.Length minimo_Petal.Width
## 1                   1                 6.9                0.1
##   maximo_Petal.Width
## 1                2.5

Método 1

p + geom_point()+geom_smooth()+xlim(c(1,6.9))+ylim(c(0.1,2.5))

Método 2

p + geom_point()+geom_smooth()+ coord_cartesian(xlim=c(1,6.9), ylim=c(0.1, 2.5)) 

¿Cómo guardar los gráficos creados?

La función ggsave guarda en el directorio de trabajo el último gráfico generado con ggplot2, en el formato indicado y con el nombre del fichero que se quiere generar.

ggsave("mi_grafico.png")

Además con la función last_plot se puede obtener la última gráfica creada.

Otras funciones y estéticas

  • Facetas

La función facet_grid crea tres gráficos dispuestos horizontalmente que comparan la relación entre la anchura y la longitud del pétalo de las tres especies de iris. Estos gráficos permiten hacer comparaciones.

ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + 
  geom_point() + geom_smooth() + 
  facet_grid(~ Species)

ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + 
  geom_point() + geom_smooth() + 
  facet_grid(Species ~.)

  • Más Estéticas

Con la función labs se puede añadir nombres a los ejes. Además, se le puede añadir un título al gráfico usando la función ggtitle.

 p<-p + ggtitle("Longuitud y ancho del pétalo") + 
         labs(x = "Longuitud del pétalo", 
              y = "Ancho del pétalo",caption = 'Especies', 
              colour = "Species")

Más estéticas

Podemos personalizar nuestro gráfico añadiendo títulos, subtítulos,captions, etc. Utilizando las siguientes funciones:

  • vjust: controla el espaciado vertical entre el título (o etiqueta) y la trama.
  • hjust: controla el espaciado horizontal. Poniéndolo en 0.5 centra el título.
  • family: se utiliza para establecer una nueva fuente
  • face: establece el tipo de letra ("sin formato", "en cursiva", "en negrita", "en negrita.italica").

p<-p+ theme(plot.title=element_text(size=20, 
                                    face="bold", 
                                    family="American Typewriter",
                                    color="tomato",
                                    hjust=0.5,
                                    lineheight=1.2),  # titulo
            plot.caption=element_text(size=15),  # caption
            axis.title.x=element_text(vjust=10,  
                                      size=15),  # título del eje x
            axis.title.y=element_text(size=15),  # título del eje y
            axis.text.x=element_text(size=10, 
                                     angle = 30,
                                     vjust=.5),  # texto para el eje x
            axis.text.y=element_text(size=10))  # texto para el eje y

Ejemplos

a<-ggplot(economics,aes(date,unemploy))
b<-ggplot(seals,aes(x=long,y=lat))

Segmentos

a+geom_abline(aes(intercept=0,slope=1))

b+geom_hline(aes(yintercept=lat))

b+geom_vline(aes(xintercept=long))

Dibuja una línea recta entre los puntos (x, y)

b+geom_segment(aes(yend=lat+1,xend=long+1))

Una variable

str(mpg)
## Classes 'tbl_df', 'tbl' and 'data.frame':    234 obs. of  11 variables:
##  $ manufacturer: chr  "audi" "audi" "audi" "audi" ...
##  $ model       : chr  "a4" "a4" "a4" "a4" ...
##  $ displ       : num  1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int  1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int  4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr  "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
##  $ drv         : chr  "f" "f" "f" "f" ...
##  $ cty         : int  18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int  29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : chr  "p" "p" "p" "p" ...
##  $ class       : chr  "compact" "compact" "compact" "compact" ...

c<-ggplot(mpg,aes(hwy))
c1<-ggplot(mpg)

Continua

c+geom_density()

c+geom_histogram()

c1+geom_qq(aes(sample=hwy))

Discreta

d<-ggplot(mpg,aes(fl))
d+geom_bar()

X continua, Y discreta

e<-ggplot(mpg,aes(cty,hwy))

Crea diagramas de dispersión

e+geom_point()

Ajusta una regresión de cuantiles a los datos y dibuja los cuantiles ajustados con líneas. Es un análogo continuo de geom_boxplot.

e+geom_quantile()

X discreta , Y continua

f<-ggplot(mpg,aes(class,hwy))

Similar a geom_bar

f+geom_col()

f+geom_boxplot()