mi_suma


Ggplot2

ggplot2 hex sticker

Los gráficos con el paquete ggplot2 se basan en la idea de ir agregando capas.

data: conjunto de datos.

aesthetics: (característica estética) describe cómo queremos que los datos se vean en el gráfico. Se utiliza la función aes() y se refieren a:

  • posición (en los ejes)
  • color de linea (color) y de relleno (fill)
  • forma de puntos (shape)
  • tipo de línea (linetype)
  • tamaño (size)

geom: (objetos geométricos) representa lo que vemos en un gráficos (puntos, líneas, etc.). Todo gráfico tiene, como mínimo, una geometría. La geometría determina el tipo de gráfico:

  • geom_point (puntos)
  • geom_lines (lineas)
  • geom_histogram (histograma)
  • geom_bar (barras)
  • geom_smooth (líneas suavizadas)
  • geom_polygons (polígonos en un mapa)
  • Ir a más geometrías

Con estos tres argumentos podemos construir un gráfico.

ggplot(data = datos, aes(x = x, y = y)) + geom_tipo()

A partir de esta estructura básica se pueden ir agregando más características a los gráficos modificando: los ejes, títulos, segmentar, unir, transformaciones estadísticas, etc. Otros elementos que conviene tener presente en un gráfico de ggplot2 son:

stat: transformaciones estadísticas para, generalmente, resumir datos (por ejemplo: contar frecuencias, número de intervalos en los histogramas, etc.).

scale: convierten datos en características estéticas (colores, etc.).

coord: sistema de coordenadas cartesianas, polares, proyecciones, etc.

faceting: permite representar gráficos separados para subconjuntos de los datos originales.

theme: personaliza los componentes que no son datos en un gráficos, es decir: títulos, etiquetas, fuentes, fondo, líneas de cuadrícula y leyendas.

Gráfico de puntos

Ejemplo básico de un gráfico de puntos con la base de datos iris.

## Cargar el paquete  ggplot2
library(ggplot2)
## Grafico de puntos
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_point()
## Cambiar el color y forma de los puntos de acuerdo a las especies
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
    geom_point()
## Cambiar el color, forma y tamaño de los puntos 
## de acuerdo a las especies desde la estetica de geom_point
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_point(aes(color = Species, shape = Species), size = 4)

Nota.- si definimos características en la estética general del grafico se aplicará a todas las capas, en cambio sí aplicamos los cambios en la capa (e. ej. geom) del grafico solo se aplicara a esa capa particular.

## Agregar titulo y modificar el nombre de los ejes X y Y
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
    geom_point(size = 4) +
    labs(title = "Base de Datos Iris. \n Gráfico de puntos", x = "Longitud de Sépalo (cm)", y = "Ancho de Sépalo (cm)")

Crear paleta de color

Para modificar los colores de manera manual es preferible crear un vector con los colores, el cual corresponderá con el orden de los niveles de la variable. Los colores pueden ir en código HEX entre comillas, en la página i want hue se pueden crear conjuntos de colores.

## Crear un vector de colores HEX
pal_iris <- c("#9f9244", "#7f64b9", "#c36785")
## Revisar el orden de los niveles de la variable Species
levels(iris$Species)
## setosa = "#9f9244" = verde militar
## versicolor = "#7f64b9" = morado
## virginica = "#c36785" = rosa
## Cambiar el color de las especies manualmente utilizando nuestra paleta
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
    geom_point(size = 4) +
    labs(title = "Base de Datos Iris. \n Gráfico de puntos", x = "Longitud de Sépalo (cm)", y = "Ancho de Sépalo (cm)") +
    scale_color_manual(values = pal_iris)
## Modificar el cuadro de leyendas, titulo y nombre de las especies
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
    geom_point(size = 4) +
    labs(title = "Base de Datos Iris. \n Gráfico de puntos", x = "Longitud de Sépalo (cm)", y = "Ancho de Sépalo (cm)") +
    scale_color_manual(name = "Especies", values = pal_iris,
                       labels = c(setosa = expression(italic("I. setosa")), 
                                  versicolor = expression(italic("I. versicolor")), 
                                  virginica = expression(italic("I. virginica")))) +
    scale_shape_manual(name = "Especies", values = c(18, 8, 5),
                       labels = c(setosa = expression(italic("I. setosa")), 
                                  versicolor = expression(italic("I. versicolor")), 
                                  virginica = expression(italic("I. virginica"))))                                                      
## Modificar el cuadro de leyendas, titulo y nombre de las especies
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
    geom_point(size = 4) +
    labs(title = "Base de Datos Iris. Gráfico de puntos", x = "Longitud de Sépalo (cm)", y = "Ancho de Sépalo (cm)") +
    scale_color_manual(name = "Especies", values = pal_iris,
                       labels = c(setosa = expression(italic("I. setosa")), 
                                  versicolor = expression(italic("I. versicolor")), 
                                  virginica = expression(italic("I. virginica")))) +
    scale_shape_manual(name = "Especies", values = c(18, 8, 5),
                       labels = c(setosa = expression(italic("I. setosa")), 
                                  versicolor = expression(italic("I. versicolor")), 
                                  virginica = expression(italic("I. virginica")))) +    
    theme(title = element_text(size = 20),
          legend.title = element_text(size = 18),
          legend.text = element_text(size = 16),
          legend.position = "bottom",
          legend.text.align = 0,
          text = element_text(size = 16))
## Ajustar los ejes X y Y a la misma proporcion y agregar elipse con un ajuste de 0.95
## asignar el grafico a una variable
iris_plot_point <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
    geom_point(size = 4) +
    labs(title = "Base de Datos Iris. Gráfico de puntos", x = "Longitud de Sépalo (cm)", y = "Ancho de Sépalo (cm)") +
    scale_color_manual(name = "Especies", values = pal_iris,
                       labels = c(setosa = expression(italic("I. setosa")), 
                                  versicolor = expression(italic("I. versicolor")), 
                                  virginica = expression(italic("I. virginica")))) +
    scale_shape_manual(name = "Especies", values = c(18, 8, 5),
                       labels = c(setosa = expression(italic("I. setosa")), 
                                  versicolor = expression(italic("I. versicolor")), 
                                  virginica = expression(italic("I. virginica")))) +    
    theme(title = element_text(size = 20),
          legend.title = element_text(size = 18),
          legend.text = element_text(size = 16),
          legend.position = "bottom",
          legend.text.align = 0,
          text = element_text(size = 16)) +
    coord_fixed(ratio = 1) +
    stat_ellipse(level = 0.95)

Guardar gráfico

Para guardar un gráfico de ggplot() es conveniente utilizar la función ggsave(). El gráfico pueden ser guardado en diferentes formatos: .png, .eps, .ps, .tex, .pdf, .jpeg, .tiff, .bmp, .svg o .wmf (formato es solo para Windows). También se puede modificar el tamaño (width y height) y resolución (dpi) de salida del grafico.

## Guardar el grafico en la carpeta out 
ggsave(iris_plot_point, file = "../out/point_plot_iris.png", device = "png", dpi = 300, width = 14, height = 10)

El poder de Tidyverse

Se construirá un gráfico de pie que muestre el porcentaje de especies de Mammillaria en el estado de Puebla, a partir de la búsqueda de 1000 registros en GBIF. Se utilizará el operador pipa para generar el gráfico en una sola tubería (pipeline).

## Cargar el paquete  rgbif y dplyr
library(rgbif)
library(dplyr)
library(scales)
## Obtener 1000 registros de GBIF para el género Mammillaria 
Mammillaria <- occ_search(scientificName = "Mammillaria", limit = 1000)
## Asignar a una variable el componente data de la lista Mammillaria 
Mammillaria_gbif <- Mammillaria$data
## Crear un vector de colores HEX
mycols <- c("#8177cc", "#60a862", "#c85994", "#b3953e", "#ca5d46")
#### Crear un grafico de pie en un solo pipeline ####
Mammillaria_gbif %>% 
    select(species, stateProvince) %>%
    filter(!is.na(species), stateProvince == "Puebla") %>%
    group_by(species) %>%
    count() %>%
    ggplot(aes(x = "", y = n, fill = species)) +
    geom_bar(stat = "identity",  color = "white") +
    geom_text(aes(label = percent(n/100)), position = position_stack(vjust = 0.5), size = 6, color = "white") +
    coord_polar(theta = "y") +
    scale_fill_manual(name = "Especies", values = mycols,
                       labels = c("Mammillaria albilanata" = expression(italic("M. albilanata")), 
                                  "Mammillaria carnea" = expression(italic("M. carnea")), 
                                  "Mammillaria discolor" = expression(italic("M. discolor")),
                                  "Mammillaria haageana" = expression(italic("M. haageana")),
                                  "Mammillaria sphacelata" = expression(italic("M. sphacelata")))) +
    theme(title = element_text(size = 15),
          legend.title = element_text(size = 16),
          legend.text = element_text(size = 16),
          legend.text.align = 0, 
          text = element_text(size = 0) ,  
          panel.background = element_rect(fill = NA),
          axis.title.x = element_text(size = 0),
          axis.title.y = element_text(size = 0)) +
    labs( title = expression(paste("Porcentaje de registros de especies de", " ", italic("Mammillaria"), " ", "para el estado de Puebla")))

Ejercicios

Para realizar los ejercicios descargar los siguentes archivos: Altura de tallos, Diametro de tallos, Distancia entre costillas, Ejercicio ggplot.

El resultado del ejercicio para ggplot() debe ser este.