Representaciones gráficas en R¶
En este documento veremos cómo podemos obtener representaciones gráficas de los datos usando la librería ggplot2, disponible dentro del ecosistema tidyverse. Sería el equivalente a librerías como Matplotlib para Python.
1. Instalación y primeros pasos¶
Instalaremos el paquete o bien incorporando el conjunto tidyverse, o bien especificando la librería en sí. En ambos casos tendremos que usar la instrucción install.packages
:
install.packages("ggplot2")
Una vez instalada, la incorporamos a los programas que la vayan a usar:
library(ggplot2)
1.1. Las capas de ggplot¶
Para construir un gráfico ggplot2 organiza la información en capas:
- En una primera capa estarán los datos con los que hay que trabajar (típicamente un data frame o similar).
- En una segunda capa están los aesthetics, donde indicaremos qué parte de los datos queremos incluir en el gráfico, y asociaremos colores y otros elementos de estilo.
- La tercera capa hace referencia a la geometría, donde indicamos el tipo de gráfico que queremos construir (de barras, de puntos...).
- Por encima de estas tres capas básicas existen otras más complejas, aunque menos relevantes, como la posibilidad de hacer facets (varios gráficos dentro de un mismo gráfico), elegir temas de diseño, etc.
Ilustraremos los siguientes ejemplos con los datos de este data frame:
Nombre | Edad | Telefono | EstadoCivil | Pais | ||
---|---|---|---|---|---|---|
1 | Juan Pérez | 70 | jperez@gmail.com | 611223344 | Casado | España |
2 | Ana Sánchez | 41 | asg@hotmail.com | 655443322 | Soltero | Argentina |
3 | Pedro Carrillo | 56 | p.carrillo@gmail.com | 677889900 | Casado | España |
... | ... | ... | ... | ... | ... | ... |
2. Construcción básica de un gráfico. Ejemplos sencillos.¶
La función ggplot
se encarga de iniciar el proceso. Recibe normalmente como parámetros:
- El conjunto de datos (data frame) con que trabajar, en un parámetro
data
. - Las estéticas (aesthetics) que se quieren utilizar, en un parámetro
mapping
.
Por ejemplo, si queremos mostrar en el eje X los nombres y en el eje Y las edades de las personas del data frame anterior, haríamos algo así:
ggplot(data=datos, mapping=aes(x=Nombre, y=Edad))
2.1. Tipos de gráficos habituales¶
La instrucción anterior no va a construir ningún gráfico. De hecho, si la ejecutamos veremos el área preparada, con los ejes definidos, pero nada más. Nos falta escoger la tercera capa, la geometría, a través de las funciones geom que incorpora ggplot, y que enlazamos con lo anterior mediante el operador +
. Existen diferentes tipos de geometría. Algunas de las más habituales son:
geom_histogram
: representan histogramas de frecuencias para los valores de una determinada serie (o columna de datos en una tabla)geom_point
: gráficos de puntos o de dispersión. Se puede combinar congeom_smooth
para dibujar una línea de ajuste de regresión.geom-smooth
: ajusta una línea (curva) mediante regresión lineal. Es habitual utilizarla junto a la geometría anteriorgeom_col
: para gráficos de barras verticales (columnas)geom_boxplot
: para gráficos de cajas que muestren la distribución de valores para una o varias variables categóricas
Por ejemplo, de esta forma construimos un gráfico de columnas que muestre cada nombre con su edad:
ggplot(data=datos, mapping=aes(x=Nombre, y=Edad)) + geom_col()
Y así construiríamos un histograma de edades:
ggplot(data=datos, mapping=aes(x=Edad)) + geom_histogram()
El parámetro mapping se puede pasar alternativamente a la función geom, en lugar de a ggplot:
ggplot(data=datos) + geom_histogram(mapping=aes(x=Edad))
De este otro modo dibujaríamos un gráfico de dispersión junto con su recta de regresión:
ggplot(data=datos, mapping=aes(x=..., y=...)) + geom_point() + geom_smooth(method=lm)
2.2. El caso de los gráficos circulares¶
Como particularidad, no existe una función específica para crear gráficos circulares (pie charts). Lo que se hace es crear un gráfico de barras con una sola barra, donde las Y sean los valores de cada categoría. Después se utiliza la función coord_polar
para convertir el gráfico en circular. Aquí vemos un ejemplo que construye un gráfico circular con las proporciones de cada tipo de nota de un conjunto:
datos = data.frame(calificaciones = c('Suspensos', 'Aprobados', 'Notables',
'Sobresalientes'), valores = c(5, 3, 8, 4))
ggplot(datos, aes(x='', y=valores, fill=calificaciones)) +
geom_bar(stat='identity') + coord_polar("y", start=0)
3. Opciones adicionales¶
Existen algunas opciones adicionales que podemos añadir a los gráficos, como por ejemplo:
- Colores a través del parámetro
color
(línea o punto) ofill
(relleno) en la funciónaes
. Podemos especificar un color distinto por un campo (por ejemplocolor=Pais
para que pinte de colores diferentes los datos según la columna Pais), o bien especificar un color determinado (color="blue"
). - Formas a través del parámetro
shape
, también en la funciónaes
- Etiquetas en los ejes, con las funciones
xlab
eylab
- Título general del gráfico con
ggtitle
- Alternativamente podemos usar la función
labs
y pasarle como parámetro las etiquetas de todo (X, Y, general, etc) - Diferentes subgráficos con
facet_grid
- Diferentes temas con las funciones
theme_*
- Algunas opciones adicionales dependientes de cada gráfico. Por ejemplo, en los histogramas tenemos un parámetro
bins
que indica cuántas divisiones queremos que tenga el histograma:geom_histogram(bins=10)
. - Si queremos reordenar los valores de un eje de categorías podemos emplear la función
reorder
en los aesthetics
Todo esto se puede ir enlazando y acumulando en una variable. Por ejemplo:
# Definimos datos y estética básicas y color basado en país
g <- ggplot(data=datos, mapping=aes(x=Nombre, y=Edad, fill=Pais))
# Enlazamos geometría (gráfico de columnas)
g <- g + geom_col()
# Rótulo de los ejes y título
g <- g + xlab("Nombres de personas")
g <- g + ylab("Edades de personas")
g <- g + ggtitle("Relación de nombres y edades")
# Alternativa para hacer lo mismo con los títulos y etiquetas
g <- g + labs(title = "Relación de nombres y edades",
x = "Nombres de personas", y = "Edades de personas")
# Tema en blanco y negro (sin fondo gris)
g <- g + theme_bw()
# Reordenar datos en X (nombres) por la edad descendente
g <- ggplot(data=datos, mapping=aes(x=reorder(Nombre, -Edad), y=Edad, fill=Pais))
Adicionalmente podemos guardar el/los gráfico(s) que generemos con la función ggsave
, indicando el nombre del archivo y el gráfico a guardar. Se admiten distintos formatos, como por ejemplo PDF, JPG o PNG.
ggsave("grafico.pdf", g)
Ejercicio 1
Utiliza este CSV de clasificación de las diferentes especies de la flor Iris y muestra un gráfico de dispersión o puntos que muestre la relación entre la longitud del sépalo y la del pétalo, pintando con diferentes colores los puntos de las diferentes especies (columna Species).

Solución Ejercicio 1
Aquí puedes ver un vídeo con la solución paso a paso del ejercicio.
Ejercicio 2
Utiliza este CSV sobre cotizaciones de acciones y muestra un gráfico de barras con los valores máximos de las 5 acciones de mayor valor, ordenados de mayor a menor, y pintando las columnas de azul.
