Torre de Babel

Cómo generar gráficas básicas con R

by Francisco Charte.

La visualización es una herramienta esencial en el análisis exploratorio de datos. No obstante existen multitud de tipos de visualización distintos y no todos sirven en todos los casos. Al que tiene un martillo todo le parecen clavos, pero es importante elegir la herramienta adecuada a cada trabajo. Dependiendo de los datos y de la información que se quiera analizar en los mismos, será preciso seleccionar el tipo de visualización adecuado.

Gráfica de dispersión (scatter plot)

Nos permite examinar la posición de los individuos en el plano (2D) o espacio (3D).

plot(iris$Petal.Length, iris$Petal.Width, col=iris$Species,  pch = 19,
     xlab = 'Longitud del pétalo', ylab = 'Ancho del pétalo')

title(main = 'IRIS', 
      sub = 'Exploración de los pétalos según especie', 
      col.main = 'blue', col.sub = 'red')

legend("bottomright", legend = levels(iris$Species),
       col = unique(iris$Species), ncol = 3, pch = 19, bty = "y")

El comando plot() forma parte de la instalación básica de R, pero hay paquetes que ofrecen gráficos de mayor calidad. Uno de ellos es ggplot2.

library(ggplot2)

ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + 
  geom_point(aes(colour=Species, size = Sepal.Width))

Con el paquete scatterplot3d podemos usar el comando del mismo nombre, capaz de representar los puntos en 3D en lugar de un plano:

library(scatterplot3d)

scatterplot3d(iris$Petal.Length, iris$Petal.Width, iris$Sepal.Length, 
              col.axis = "blue", color = as.numeric(iris$Species),
              col.grid = "lightblue", main = "IRIS", pch = 19)

Gráfica de dispersión con densidad (hexbin)

En ocasiones una gráfica de dispersión puede ocultar información si hay mucho solapamiento entre los puntos:

ggplot(diamonds, aes(x=carat, y=price)) + geom_point() + labs(x = "Peso", y = "Precio")

En estos casos se puede recurrir a un método que consiste en dividir la gráfica en hexágonos, contar el número de puntos que hay en su interior y colorear según la densidad:

ggplot(diamonds, aes(x=carat, y=price)) + stat_binhex() + labs(x = "Peso", y = "Precio")

Gráficas de líneas y barras

Las gráficas de líneas deben utilizarse exclusivamente para analizar la evolución de una magnitud respecto a otra. Por ejemplo:

ggplot(economics, aes(x=date, y=pop)) + geom_line() + labs(x = "Año", y = "Población")

Cuando lo que interesa no es la evolución en sí, sino la relación (comparación) entre cada entrada en el eje X y la altura en el eje Y, habitualmente es mejor usar una gráfica de barras:

ggplot(diamonds, aes(cut)) + geom_line(aes(group="cut"), stat="count") + 
  labs(x = "Tipo de corte", y = "Cantidad")

ggplot(diamonds, aes(cut)) + geom_bar() + labs(x = "Tipo de corte", y = "Cantidad")

Es posible comparar más de una magnitud simultáneamente, agrupando las barras según los valores de una variable:

ggplot(mpg, aes(cyl, hwy, fill=class)) + scale_fill_brewer() +
  geom_bar(stat="identity", position="dodge")

Asimismo, podemos introducir varias líneas en una misma gráfica para representar la evolución de dos magnitudes:

ggplot(economics, aes(x=date)) + geom_line(aes(y=pop)) + geom_line(aes(y=unemploy))

Ajustes visuales sobre gráficas de líneas y barras

  • Podemos personalizar la apariencia de una gráfica de líneas con los siguientes parámetros:

    • colour: establece el color de la línea. Ejemplos: colour = "red" colour = class
    • size: establece el grosor de la línea. Ejemplos: size = 1 size = cyl
    • linetype: establece el tipo de trazo. Ejemplos: linetype = 3 linetype = "dashed"
    • arrow: permite agregar flechas a las líneas: Ejemplo: arrow = arrow()
ggplot(economics, aes(x=date)) + 
  geom_line(aes(y=pop), linetype="solid", size=2, color="blue", arrow = arrow()) + 
  geom_line(aes(y=unemploy), linetype = "dashed", color = "red")

  • Podemos personalizar la apariencia de una gráfica de barras con los siguientes parámetros:

    • width: establece el ancho relativo de las barras. Ejemplo: width = 0.5
    • colour: establece el color del borde de las barras. Ejemplo: `colour=“blue”
    • fill: establece el color de relleno de las barras. Ejemplo: fill="red"
    • coord_flip(): no es un parámetro, sino un objeto que se agrega para cambiar la orientación de las barras
ggplot(diamonds, aes(cut)) + 
  geom_bar(colour="blue", fill="green", width=0.5) + 
  coord_flip() + labs(x = "Tipo de corte", y = "Cantidad")

Cantidades que forman parte de un todo

Cuando las magnitudes que están comparándose en una gráfica conforman un todo, podemos optar por otro tipo de representación que denote esa idea. La primera opción, para una única serie de datos, sería una gráfica de tarta o bien una barra apilada:

grafica <- ggplot(diamonds, aes("", fill=cut)) + 
  labs(x="Tipo de corte", y="Cantidad")   # Gráfica con los datos básicos

grafica + geom_bar() + coord_polar("y")  # Gráfica de tarta

grafica + coord_polar("y") +  # Gráfica de tarta con porcentaje y esquema de color
  geom_bar(aes(y = (..count..)/sum(..count..)*100)) + 
  scale_fill_brewer(palette="Blues") +  theme_minimal()

grafica + geom_bar()   # Barra apilada básica

grafica + geom_bar(aes(y = (..count..)/sum(..count..)*100))   # Barra con porcentaje en lugar de cuenta

Esta técnica puede combinarse con la representación de múltiples series de datos, cada una de ellas como una barra apilada:

ggplot(diamonds, aes(cut)) + geom_bar(aes(fill=color))

ggplot(diamonds, aes(cut)) + geom_bar(aes(fill=color), position = "fill")

La apariencia de la gráfica puede personalizarse con los atributos enumerados anteriormente, cambiando la orientación, colores, ancho de las barras, etc.

ggplot(diamonds, aes(cut)) + 
  geom_bar(aes(fill=clarity), colour="blue", width=0.5) + 
  coord_flip() + labs(x = "Tipo de corte", y = "Cantidad")