Barplot in R

Cuando una variable toma pocos valores, es habitual resumir la información con una tabla de frecuencias que se puede representar con un barchart o barplot en R. En este artículo vamos a explicar los fundamentos de la creación de gráficos de barras en R.

La función R barplot

Para crear un gráfico de barras en R se puede utilizar la función base R barplot. En este ejemplo, vamos a crear un barplot a partir de un marco de datos. En concreto, el conjunto de datos de ejemplo es el conocido mtcars. En primer lugar, cargue los datos y cree una tabla para la columna cyl con la función table.

# Load datadata(mtcars)attach(mtcars)# Frequency tablemy_table <- table(cyl)my_table
cyl 4 6 811 7 14

Recuerde que para crear un diagrama de barras en R puede utilizar la función barplot estableciendo como parámetro su tabla previamente creada para mostrar la frecuencia absoluta de los datos. Sin embargo, si prefiere un diagrama de barras con porcentajes en el eje vertical (la frecuencia relativa), puede utilizar la función prop.table y multiplicar el resultado por 100 de la siguiente manera.

# One row, two columnspar(mfrow = c(1, 2))# Absolute frequency barplotbarplot(my_table, main = "Absolute frequency", col = rainbow(3))# Relative frequency barplotbarplot(prop.table(my_table) * 100, main = "Relative frequency (%)", col = rainbow(3))par(mfrow = c(1, 1))

Note que también puede crear un diagrama de barras con datos de factores con la función plot.

plot(factor(mtcars$cyl), col = rainbow(3))

Además, puede mostrar números en las barras con la función de texto de la siguiente manera:

barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
Asignar un gráfico de barras dentro de una variable almacenará los valores del eje correspondientes al centro de cada barra.

También puedes añadir una rejilla detrás de las barras con la función grid.

barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))grid(nx = NA, ny = NULL, lwd = 1, lty = 1, col = "gray")barplot(my_table, col = rainbow(3), ylim = c(0, 15), add = TRUE)

Parámetros gráficos del gráfico de barras: título, etiquetas de los ejes y colores

Al igual que otros gráficos, puedes especificar una gran variedad de parámetros gráficos, como etiquetas de los ejes, un título o personalizar los ejes. En el bloque de código anterior hemos personalizado los colores del barplot con el parámetro col. Puede establecer los colores que prefiera con un vector o utilizar la función rainbow con el número de barras como parámetro como hicimos nosotros o utilizar otras funciones de paleta de colores. También puedes cambiar el color del borde de las barras con el argumento border.

barplot(my_table, # Data main = "Customized bar plot", # Title xlab = "Number of cylinders", # X-axis label ylab = "Frequency", # Y-axis label border = "black", # Bar border colors col = c("darkgrey", "darkblue", "red")) # Bar colors

Cambiar las etiquetas de los grupos

La etiqueta de cada grupo se puede cambiar con el argumento names.arg. En nuestro ejemplo, los grupos están etiquetados con números, pero podemos cambiarlos escribiendo algo como:

barplot(my_table, names.arg = c("four", "six", "eight")) 

Ancho y espacio de las barras

También puedes modificar el espacio entre barras o el ancho de las mismas con los argumentos width y space. Para el espacio entre grupos, consulte la sección correspondiente de este tutorial.

par(mfrow = c(1, 2))# Bar width (by default: width = 1)barplot(my_table, main = "Change bar width", col = rainbow(3), width = c(0.4, 0.2, 1))# Bar spacebarplot(my_table, main = "Change space between bars", col = rainbow(3), space = c(1, 1.1, 0.1))par(mfrow = c(1, 1))
El vector space representa el espacio de la barra respecto a la anterior, por lo que no se tendrá en cuenta el primer elemento.

Barplot a partir de un dataframe o lista

Además, se puede crear un barplot directamente con las variables de un dataframe o incluso de una matriz, pero hay que tener en cuenta que la variable debe ser el recuento de algún evento o característica. En el siguiente ejemplo vamos a contar el número de vehículos por colores y los vamos a graficar con un gráfico de barras. Utilizaremos cada color de coche para colorear las barras correspondientes.

df <- data.frame(carColor = c("red", "green", "white", "blue"), count = c(3, 5, 9, 1))# df <- as.list(df) # Equivalentbarplot(height = df$count, names = df$carColor, col = c("red", "green", "white", "blue"))

Gráfico de barras para variable continua

En caso de que trabajes con una variable continua deberás utilizar la función cut para categorizar los datos. Si no, en caso de no haber empates, tendrás tantas barras como la longitud de tu vector y las alturas de las barras serán iguales a 1. En el siguiente ejemplo dividiremos nuestros datos de 0 a 45 por pasos de 5 con el argumento breaks.

x <- c(2.1, 8.6, 3.9, 4.4, 4.0, 3.7, 7.6, 3.1, 5.0, 5.5, 20.2, 1.7, 5.2, 33.7, 9.1, 1.6, 3.1, 5.6, 16.5, 15.8, 5.8, 6.8, 3.3, 40.6)barplot(table(cut(x, breaks = seq(0, 45, by = 5))))

Barplot horizontal

Por defecto, los barplots en R se representan verticalmente. Sin embargo, es común representar gráficos de barras horizontales. Se puede girar 90º el gráfico y crear un gráfico de barras horizontal estableciendo el argumento horiz como TRUE.

barplot(my_table, main = "Barchart", ylab = "Number of cylinders", xlab = "Frequency", horiz = TRUE) # Horizontal barplot

Leyenda de barplot en R

Se puede añadir una leyenda a un barplot en R con el argumento legend.text, donde se pueden especificar los nombres que se quieren añadir a la leyenda. Tenga en cuenta que en RStudio el gráfico resultante puede ser ligeramente diferente, ya que el fondo de la leyenda será blanco en lugar de transparente.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
Tenga en cuenta que, al utilizar el argumento legend.text, la leyenda puede superponerse al barplot.

El método más fácil para resolver este problema en este ejemplo es mover la leyenda. Esto se puede lograr con el argumento args.legend, donde se pueden establecer parámetros gráficos dentro de una lista. Puede establecer la posición en top, bottom, topleft, topright, bottomleft y bottomright.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), args.legend = list(x = "top"))

Equivalentemente, puede lograr el gráfico anterior con la leyenda con la función legend de la siguiente manera con los argumentos legend y fill.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))legend("top", legend = rownames(my_table), fill = rainbow(3))

Sin embargo, este enfoque sólo funciona bien si la leyenda no se superpone a las barras en esas posiciones. Un enfoque mejor es mover la leyenda a la derecha, fuera del gráfico de barras. Puede hacerlo configurando el argumento inset pasado como elemento de una lista dentro del argumento args.legend de la siguiente manera.

par(mar = c(5, 5, 4, 10))barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), # Legend values args.legend = list(x = "topright", inset = c(-0.20, 0))) # Legend arguments

También podría cambiar los límites de los ejes con los argumentos xlim o ylim para gráficos de barras verticales y horizontales, respectivamente, pero tenga en cuenta que en este caso el valor a especificar dependerá del número y del ancho de las barras. Recuerde que si asigna un gráfico de barras a una variable puede almacenar los puntos del eje que corresponden al centro de cada barra.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), xlim = c(0, 4.25))

Otra alternativa para mover la leyenda es desplazarla por debajo del gráfico de barras con las funciones layout, par y plot.new. Este enfoque es más avanzado que los otros y es posible que tenga que borrar los parámetros gráficos antes de la ejecución del código para obtener el gráfico correcto, ya que los parámetros gráficos se modificarán.

# dev.off()# opar <- par(no.readonly = TRUE)plot.new()layout(rbind(1, 2), heights = c(10, 3))barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))par(mar = c(0, 0, 0, 0))plot.new()legend("top", rownames(my_table), lty = 1, col = c("red", "green", "blue"), lwd = c(1, 2))# dev.off()# on.exit(par(opar))

Ploteo de barras agrupadas en R

Un gráfico de barras agrupadas, también conocido como gráfico de barras lado a lado o gráfico de barras agrupadas es un gráfico de barras en R con dos o más variables. El gráfico mostrará las barras para cada una de las múltiples variables.

# Variable am to factoram <- factor(am)# Change factor levelslevels(am) <- c("Automatic", "Manual")# Table cylinder - transmission typeother_table <- table(cyl, am)# other_table <- xtabs(~cyl + am , data = mtcars) # Equivalentbarplot(other_table, main = "Grouped barchart", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = TRUE) # Grouped bars

Nótese que si hubiéramos especificado table(am, cyl) en lugar de table(cyl, am) el eje X representaría el número de cilindros en lugar del tipo de transmisión.

Espacio entre grupos

Como revisamos antes, puedes cambiar el espacio entre barras. En el caso de varios grupos se puede establecer un vector de dos elementos donde el primero es el espacio entre barras de cada grupo (0,4) y el segundo el espacio entre grupos (2,5).

barplot(other_table, main = "Grouped barchart space", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = TRUE, space = c(0.4, 2.5)) # Space 

Valores numéricos en grupos

Los gráficos de barras también se pueden utilizar para resumir una variable en grupos dados por uno o varios factores. Considere, por ejemplo, que quiere mostrar el número de cilindros y el tipo de transmisión en función de la media de la potencia de los coches. Podrías utilizar la función tapply para crear la tabla correspondiente:

summary_data <- tapply(mtcars$hp, list(cylinders = mtcars$cyl, transmission = mtcars$am), FUN = mean, na.rm = TRUE)summary_data
 transmissioncylinders Automatic Manual 4 84.66667 81.8750 6 115.25000 131.6667 8 194.16667 299.5000

Ahora, puedes crear el barplot correspondiente en R:

par(mar = c(5, 5, 4, 10))barplot(summary_data, xlab = "Transmission type", main = "Horsepower mean", col = rainbow(3), beside = TRUE, legend.text = rownames(summary_data), args.legend = list(title = "Cylinders", x = "topright", inset = c(-0.20, 0)))

Barplot con barras de error en R

Por defecto, no puedes crear un barplot con barras de error. Sin embargo, la siguiente función le permitirá crear un barplot totalmente personalizable con barras de error estándar.

# Arguments:# x: an unique factor object# y: a numeric vector object# ...: additional arguments to be passed to barplot functionbarplot.error <- function(x, y, ...){ mod <- lm(y ~ x) reps <- sqrt(length(y)/length(levels(x))) sem <- sigma(mod)/reps means <- tapply(y, x, mean) upper <- max(means) + sem lev <- levels(x) barpl <- barplot(means, ...) invisible(sapply(1:length(barpl), function(i) arrows(barpl, means + sem, barpl, means - sem, angle = 90, code = 3, length = 0.08)))}# Calling the functionbarplot.error(factor(mtcars$cyl), mtcars$hp, col = rainbow(3), ylim = c(0, 250))

Aunque pueda añadir barras de error a un barplot, debe tenerse en cuenta que un boxplot por grupo podría ser un mejor enfoque para resumir los datos en este escenario.

Barplot apilado en R

Un gráfico de barras apilado es como un gráfico de barras agrupadas, pero la frecuencia de las variables están apiladas. Este tipo de barplot se creará por defecto al pasar como argumento una tabla con dos o más variables, ya que el argumento beside se pone por defecto en FALSE.

barplot(other_table, main = "Stacked barchart", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = FALSE) # Stacked bars (default)

En relación con los barplots apilados, existen implementaciones similares, como el spine plot y el mosaic plot. Este tipo de gráficos se pueden crear con las funciones spineplot y mosaicplot del paquete graphics.

El gráfico de mosaico permite visualizar datos de dos o más variables cuantitativas, donde el área de cada rectángulo representa la proporción de esa variable en cada grupo.

# install.packages("graphics")library(graphics)mosaicplot(other_table, main = "Mosaic plot")

El spineplot es un caso especial de un gráfico de mosaico, y es una generalización del stacked barplot. En este caso, a diferencia de los gráficos de barras apiladas, cada barra suma uno.

spineplot(other_table)

Note que, por defecto, los ejes están intercambiados con respecto al gráfico de barras apiladas que creó en la sección anterior. Puedes crear el gráfico equivalente transponiendo la tabla de frecuencias con la función t.

spineplot(t(other_table))

Barplot en R: ggplot2

La librería ggplot2 es una conocida librería de gráficos en R. Puedes crear un barplot con esta librería convirtiendo los datos a data frame y con las funciones ggplot y geom_bar. En el argumento aes tienes que pasar los nombres de las variables de tu dataframe. En x la variable categórica y en y la numérica.

# install.packages("ggplot2")library(ggplot2)df <- as.data.frame(my_table)ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity")

Ploteo de barras horizontal ggplot2

Si se quiere rotar el gráfico de barras anterior se utiliza la función coord_flip de la siguiente manera.

ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity") + coord_flip() # Horizontal bar plot

Deja una respuesta

Tu dirección de correo electrónico no será publicada.