Gráficos



Repaso para hacer gráficos en R






ELEMENTOS GRÁFICOS

##data define con qué datos se va a trabajar.

##geom_ define los objetos geométricos que representan los datos (histograma, box-plot, puntos, rectas, etc.)

##aes características visuales que representan a los datos (x e y, tamaño, forma, color, transparencia, etc.)

##scale_ atributos de los ejes y aes (escala logarítmica, texto y orden de la escala, título de los ejes, intervalos, etc.)

##stat_ formas estadísticas de representar a los datos (intervalos de confianza, conteos, medias, rectas de regresiones, etc.)

##facet_ define paneles diferentes para subgrupos de datos

##theme_ aspecto general del gráfico (color de fondo, tipo de línea, tipo de texto, etc.)


#geom_

Estructura básica de dispersión

En el ejemplo que sigue, data define a los datos, aes define x e y (en ese orden), y geom_point() define que los datos van a ser puntos

library(ggplot2) #  carga del paquete para hacer gráficos
flores<-read.csv("flores.csv") # carga los datos
 
ggplot(data=flores, aes(Sepal.Length, Petal.Length))+
  geom_point()


Estructura básica de grupos

ggplot(data=flores, aes(Petal.Length))+ # define los datos y la variable a analizar
  geom_bar() # histograma

ggplot(data=flores, aes(Species, Petal.Length))+
  geom_boxplot() # diagrama de cajas


#aes

Color

cuando color (o fill) no están dentro de aes, lo aplica para todos. Caso contrario, aplica uno distinto para cada grupo que se defina

ggplot(data=flores, aes(Species, Petal.Length))+
  geom_boxplot(color="violet") # el mismo color para todas las cajas

ggplot(data=flores, aes(Species, Petal.Length, color=Species))+ # un color diferente para cada valor de "Species" (3 en total)
  geom_boxplot()

ggplot(data=flores, aes(Sepal.Length, Petal.Length))+
  geom_point(color="blue") # el mismo color para todos los puntos

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species))+ # un color diferente para cada valor de "Species"
  geom_point()


Tamaño

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species))+
  geom_point(size=4) # mismo tamaño para todos los datos

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, size=Sepal.Width))+ # el tamaño depende del ancho del sépalo
  geom_point()


Forma

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species))+
  geom_point(size=4, shape=22) # misma forma para todos los datos

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+ # la forma depende del valor de "Species"
  geom_point(size=4)


Transparencia

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.4) # misma transparencia para todos los datos

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species, alpha=Petal.Length))+ # la transparencia depende del valor de "Petal.Length"
  geom_point(size=4)


PARÉNTESIS

Se pueden graficar fuentes de datos diferentes en la misma figura. Para eso hay que definir los datos y variables en cada una de las cosas que se quieran graficar.

invento<-data.frame(eje_x=c(5,6,7,8), eje_y=c(2,2.5,3.5,6.5)) # crea unos datos inventados en el mismo rango que los de "flores"
ggplot()+
  geom_point(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species),size=4, alpha=0.6)+
  geom_point(data=invento, aes(eje_x, eje_y)) # a lo que ya estaba, le agrega unos puntos nuevos con datos de otro data.frame (y por lo tanto otro x e y)

Rectas simples

ggplot()+
  geom_point(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species),size=4, alpha=0.6)+
  geom_point(data=invento, aes(eje_x, eje_y))+
  geom_line(data=invento, aes(eje_x, eje_y))+ #esta recta une los puntos
  geom_vline(aes(xintercept=4), color="red", size=2, linetype=2) # recta vertical ("geom_hline" es la orizontal)

Recta del modelo lineal

ggplot()+
  geom_point(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species),size=4, alpha=0.6)+
  geom_smooth(data=flores, aes(Sepal.Length, Petal.Length),method="lm") # agrega una recta común (por eso no puede estar "color" dentro de "aes")

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.4)+
  geom_smooth(method="lm") # agrega una recta e intervalo de confianza para cada "Species"


#scale_

Colores manuales

manual es para definir valores a mano, pueden ser colores (este caso), tipos de línea, formas, etc.

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.4)+
  geom_smooth(method="lm")+
  scale_color_manual(values=c("black", "orange", "violet")) # define los colores

En otro orden

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.4)+
  geom_smooth(method="lm")+
  scale_color_manual(breaks=c("virginica", "versicolor","setosa"),  # con "breaks" define el orden
                     values=c("black", "orange", "violet"))

Con otros nombres

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.4)+
  geom_smooth(method="lm")+
  scale_color_manual(breaks=c("virginica", "versicolor","setosa"),
                     labels=c("vir", "ver", "set"), # "labels" es para ponerle otros nombres
                     values=c("black", "orange", "violet"), 
                     name="colores feos") # y "name" define el título de esa escala (en este caso, la de color)

Unificando leyendas

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.7)+
  geom_smooth(method="lm")+
  scale_color_manual(breaks=c("virginica", "versicolor","setosa"),
                     labels=c("vir", "ver", "set"), 
                     values=c("black", "orange", "violet"), 
                     name="mismo nombre")+ # ésta y la de abajo se llaman igual
  scale_shape_manual(breaks=c("virginica", "versicolor","setosa"),
                     labels=c("vir", "ver", "set"), 
                     values=c(16,17,15), # define las formas
                     name="mismo nombre") # al tener igual nombre se unifican

Escalas continuas

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.4)+
  geom_smooth(method="lm")+
  scale_x_continuous(name="Sépalo", 
                     breaks=c(4,6,8), # los valores del eje x que muestra
                     labels=c("cuatro", "seis", "ocho"), # cómo aparecen esos valores
                     limits=c(3,9))+ # rango del eje x
  scale_y_continuous(name="No lo sepa") # nombre del eje y

#stat_

Funciones

summary es para aplicar funciones a los datos. Si no se especifica qué función, calcula media + EE.

ggplot(data=flores, aes(Species, Sepal.Length, color=Species, shape=Species))+
  stat_summary()
## No summary function supplied, defaulting to `mean_se()


#facet_

Grilla

facet_grid define una grilla de paneles. Lo que figura antes del ~ es lo que define las filas, y lo que está después, las columnas. El . es para avisar que no hay una variable que defina filas (o columnas).

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.7)+
  geom_smooth(method="lm")+
  facet_grid(.~Species) # un panel por valor de "Species", cada uno en una columna

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.7)+
  geom_smooth(method="lm")+
  facet_grid(round(Sepal.Width)~Species) # un panel por valor de "Species" por columna y valor de "Sepal.Width" (redondeado) por fila

Escalas libres y cambio de nombre

Con scales="free" cada panel tiene su propia escala. La función as.labeller es para cambiar el título de los paneles.

ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.7)+
  geom_smooth(method="lm")+
  facet_grid(Species~., scales="free", labeller = as_labeller(c("setosa"="se","versicolor"="ve", "virginica"="vi")))

#theme_ Hay varios formatos predefinidos, cada uno con un nombre diferente. Para probarlos y ahorrar código creamos un gráfico y lo llamamos vago.

vago<-ggplot(data=flores, aes(Sepal.Length, Petal.Length, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.7)+
  geom_smooth(method="lm")+
  labs(x="Sépalo", y="Pétalo", title="Largo")+
  facet_grid(.~Species)
vago

vago + theme_bw()

vago + theme_linedraw()

vago + theme_dark()

vago + theme_minimal()

vago + theme_classic()

Para un control mucho mayor está la función theme()

vago + theme(legend.position = "top",
                      axis.line = element_line(size = 2, colour = "violet"), #define tamaño y color de los ejes
                      axis.text = element_text(size=20,colour = "red"), # tamaño y color del texto de los ejes
                      axis.title =element_text(size=20,colour = "darkgreen"), # tamaño y color del título de los ejes
                      axis.title.y = element_text(size = rel(1.5)), # sólo el eje y, definido en forma relativa al valor de "axis.title"
                      text = element_text(size=30), # tamaño de partida de todos los textos
                      strip.background = element_rect(color="blue", fill="yellow", size=3), # color de borde y fondo del tiulo de los paneles
                      plot.background = element_rect(color="red", fill="gray80", size=3), # color de borde y fondo de la figura
                      panel.background = element_rect(fill="gray70"), # color de fondo del panel
                      legend.background = element_rect(fill="lightyellow"), # color de fondo de la leyenda
                      panel.grid.major = element_line(colour = "black"), # color de las grillas principales
                      panel.grid.minor = element_blank() ) # "element_blank()" es para que no grafique lo que está antes del "=", en este caso, las grillas secundarias


Ahora la salida cómoda

library(cowplot) # carga un paquete con mejoras para ggplot2
## 
## Attaching package: 'cowplot'
## The following object is masked from 'package:ggplot2':
## 
##     ggsave
vago # carga el gráfico con el que veníamos trabajando, ahora con otro formato más prolijo

Uniendo figuras

# abajo crea una nueva figura llamada "otro", con la relación entre el ancho del sépalo y el pétalo
otro<-ggplot(data=flores, aes(Sepal.Width, Petal.Width, color=Species, shape=Species))+
  geom_point(size=4, alpha=0.7)+
  geom_smooth(method="lm")+
  facet_grid(.~Species)+
  scale_x_continuous(breaks=c(2:4))+
  labs(x="Sépalo", y="Pétalo", title="Ancho")
otro

plot_grid(vago, otro, labels="AUTO") # une las dos figuras y les pone una letra a cada una en mayúscula

Tuneada final

a_ver_si_anda<-plot_grid(vago+theme(axis.title.x=element_blank(), # saca el título del eje x (después vamos a poner uno común)
                                      legend.position="none"), # saca la leyenda
                  otro+theme(axis.title.x=element_blank(), # saca el título del eje x,
                             axis.title.y=element_blank(), # el del eje y,
                             legend.position="none"), # y la leyenda
                  labels="AUTO",
                  align="vh") # define que cada figura tenga el mismo largo y ancho
a_ver_si_anda

# a la figura de recién le agregamos un texto abajo (que va a ser el título común del eje x)
centro<-ggdraw(add_sub(a_ver_si_anda, "Sépalo")) 

# extraemos la leyenda
leyenda<-get_legend(vago+theme(legend.position="top"))

# y unimos la leyenda con las dos figuras ya unidas
plot_grid(leyenda, centro,ncol=1, rel_heights = c(1,9))