InicioGr谩ficosGr谩fico de barras en R

Gr谩fico de barras en R

Usa la funci贸n barplot para crear gr谩ficos de barras en R

Cuando una variable toma pocos valores, es com煤n resumir la informaci贸n con una tabla de frecuencias que se puede representar con un gr谩fico de barras en R. Este tipo de gr谩ficos se suelen utilizar, por ejemplo, para representar precipitaciones y temperaturas (si a帽adimos una curva por encima), en lo que se conoce como climogramas. En este art铆culo vamos a explicar los conceptos b谩sicos de la creaci贸n de diagramas de barras en R.

La funci贸n barplot en R

Para crear un gr谩fico de barras en R, puedes usar la funci贸n de R base barplot. En este ejemplo, vamos a crear un diagrama de barras a partir de un data frame. Concretamente vamos a usar el conocido conjunto de datos mtcars.

En primer lugar, carga los datos y crea una tabla para la columna cyl con la funci贸n de table.

# Cargamos los datos
data(mtcars)
attach(mtcars)

# Tabla de frecuencias
mi_tabla <- table(cyl)
mi_tabla
cyl
 4  6   8
11  7  14

Recuerda que para crear un diagrama de barras en R puedes usar la funci贸n barplot y establecer como par谩metro la tabla creada anteriormente para mostrar la frecuencia absoluta de los datos.

Sin embargo, si prefieres un gr谩fico de barras con porcentajes en el eje vertical (la frecuencia relativa), puedes usar la funci贸n prop.table y multiplicar el resultado por 100 de la siguiente manera.

# Una fila, dos columnas
par(mfrow = c(1, 2))

# Gr谩fico de barras de frecuencia absoluta
barplot(mi_tabla, main = "Frequencia absoluta",
        col = rainbow(3))

# Gr谩fico de barras de frecuencia relativa
barplot(prop.table(mi_tabla) * 100, main = "Frequencia relativa (%)",
        col = rainbow(3))

par(mfrow = c(1, 1))
Frecuencias absolutas y relativas

Ten en cuenta que tambi茅n puedes crear un diagrama de barras a partir de un factor con la funci贸n plot.

plot(factor(mtcars$cyl), col = rainbow(3))
Gr谩fico de barras con la funci贸n plot

Adem谩s, por una parte, podr铆amos agregar curvas sobre el gr谩fico de barras para representar otra variable, como sucede con la temperatura en el caso de los climogramas.

En este caso vamos a dibujar una l铆nea sobre el gr谩fico que hemos hecho con nuestra tabla.

barp <- barplot(mi_tabla,                     # Guarda los valores de X que
                main = "Frequencia absoluta", # representan el centro de 
                col = rainbow(3))             # cada barra           
                                                         
lines(barp, c(5, 4, 12), type = "o", lwd = 3)
A帽adir l铆neas para crear un climograma
Asignar un gr谩fico de barras a una variable almacenar谩 los valores del eje correspondientes al centro de cada barra.

Por otra parte, tambi茅n podr铆amos mostrar los n煤meros correspondientes a la altura de las barras con la funci贸n text de la siguiente manera:

barp <- barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15))
text(barp, mi_tabla + 0.5, labels = mi_tabla)
Gr谩fico de barras con n煤meros representando la frecuencia de cada clase

Por 煤ltimo, podr铆a resultar interesante a帽adir un grid debajo de las barras del gr谩fico con la funci贸n grid.

barp <- barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15))
grid(nx = NA, ny = NULL, lwd = 1, lty = 1, col = "gray")
barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15), add = TRUE)
Rejilla (grid) en un gr谩fico de barras en R

T铆tulo, etiquetas y colores del gr谩fico de barras

Al igual que otros gr谩ficos, puedes especificar una amplia variedad de par谩metros gr谩ficos, como etiquetas de eje, un t铆tulo o personalizar los ejes. En el bloque de c贸digo anterior personalizamos los colores del diagrama de barras con el par谩metro col. Puedes establecer los colores que prefieras con un vector o usar la funci贸n rainbow con el n煤mero de barras como par谩metro como lo hicimos nosotros o usar otras paletas de colores. Tambi茅n puedes cambiar el color del borde de las barras con el argumento border.

barplot(mi_tabla,                               # Datos
        main = "Gr谩fico de barras",             # T铆tulo
        xlab = "N煤mero de cilindros",           # Etiqueta del eje X
        ylab = "Frecuencia",                    # Etiqueta del eje Y
        border = "black",                       # Color del borde de las barras
        col = c("darkgrey", "darkblue", "red")) # Color para cada barra
Gr谩fico de barras personalizado en R

Cambiar las etiquetas de cada grupo

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 lo siguiente:

barplot(mi_tabla, names.arg = c("cuatro", "seis", "ocho")) 
Cambiar las etiquetas de los grupos de un un barplot en R

Espacio y ancho de las barras

Tambi茅n se puede modificar el espacio entre barras o el ancho de las barras con los argumentos width y space. Para el espacio entre grupos consulta la secci贸n correspondiente de este tutorial.

par(mfrow = c(1, 2))

# Ancho de las barras (por defecto: width = 1)
barplot(mi_tabla, main = "Cambiar el ancho de las barras",
        col = rainbow(3), width = c(0.4, 0.2, 1))

# Espacio entre las barras
barplot(mi_tabla, main = "Cambiar el espacio entre barras",
        col = rainbow(3), space = c(1, 1.1, 0.1))

par(mfrow = c(1, 1))
Cambiar el ancho o el espacio entre las barras de un barchart en R
El vector space representa el espacio de la barra respecto a la anterior, por lo que el primer elemento no se trendr谩 en cuenta.

Gr谩fico de barras a partir de una lista o un data frame

Adem谩s, puedes crear un diagrama de barras directamente con las variables de un data frame o incluso una matriz, pero ten en cuenta que la variable debe ser el recuento de alg煤n evento o caracter铆stica.

En el siguiente ejemplo, contamos el n煤mero de veh铆culos por color y los dibujamos con un gr谩fico de barras. Usaremos cada color de los coches para colorear las barras correspondientes.

df <- data.frame(ColorCoche = c("rojo", "verde", "blanco", "azul"),
                 num = c(3, 5, 9, 1))
# df <- as.list(df) # Equivalente

barplot(height = df$num, names = df$ColorCoche,
        col = c("red", "green", "white", "blue"))
Barchart a partir de una lista o data frame

Gr谩fico de barras de una variable continua

En caso de que est茅s trabajando con una variable continua, deber谩s usar la funci贸n cut para clasificar los datos. De lo contrario, en caso de ausencia de empates, tendr谩s tantas barras como la longitud del vector y las alturas de las barras ser谩n iguales a 1.

En el siguiente ejemplo, dividiremos nuestros datos de 0 a 45 en 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))))
Gr谩fico barras en R a partir de una variable continua

Gr谩fico de barras horizontal en R

Por defecto, los gr谩ficos de barras en R se dibujan verticalmente. Sin embargo, es com煤n representar gr谩ficos de barras horizontales. Puedes rotar 90潞 el gr谩fico y crear un gr谩fico de barras horizontales estableciendo el argumento horiz como TRUE.

barplot(mi_tabla, main = "Gr谩fico de barras horizontal",
        ylab = "N煤mero de cilindros", xlab = "Frecuencia",
        horiz = TRUE) # Gr谩fico de barras horizontal
Gr谩fico de barras horizontal en R con la funci贸n barplot

Leyenda del gr谩fico de barras

Se puede agregar una leyenda a un diagrama de barras en R con el argumento legend.text, donde puedes especificar los nombres que quieres agregar a la leyenda. Ten en cuenta que en RStudio la gr谩fica resultante puede ser ligeramente diferente, ya que por ejemplo el fondo de la leyenda ser谩 blanco en lugar de transparente.

barplot(mi_tabla, xlab = "N煤mero de cilindros",
        col = rainbow(3),
        legend.text = rownames(mi_tabla)) # Leyenda
A帽adir leyenda a un gr谩fico de barras en R con el argumento legend.text
N贸tese que, al usar el argumento legend.text, la leyenda puede superponerse al diagrama de barras .

El m茅todo m谩s f谩cil para resolver este problema en este ejemplo es mover la leyenda a la izquierda. Esto se puede lograr con el argumento args.legend, donde puedes establecer par谩metros gr谩ficos dentro de una lista. Puedes establecer la posici贸n en top, bottom, topleft, topright, bottomleft y bottomright.

barplot(mi_tabla, xlab = "N煤mero de cilindros",
        col = rainbow(3),
        legend.text = rownames(mi_tabla),
        args.legend = list(x = "top"))
Cambiar posici贸n a la leyenda del diagrama de barras en R

De manera equivalente, se puede lograr el diagrama anterior con la funci贸n legend de la siguiente manera, con los argumentos legend y fill.

barplot(mi_tabla, xlab = "N煤mero de cilindros",
        col = rainbow(3))
legend("top", legend = rownames(mi_tabla), fill = rainbow(3))

Sin embargo, este enfoque solo funciona bien si la leyenda no se superpone a las barras en esas posiciones. Un mejor enfoque es mover la leyenda a la derecha, fuera del gr谩fico de barras. Puedes hacer esto configurando el argumento inset dentro de una lista pasada como par谩metro al argumento args.legend de la siguiente manera.

par(mar = c(5, 5, 4, 10))
barplot(mi_tabla, xlab = "N煤mero de cilindros",
        col = rainbow(3),
        legend.text = rownames(mi_tabla), # Valores de la leyenda
        args.legend = list(x = "topright", inset = c(-0.20, 0))) # Argumentos de la leyenda
A帽adir leyenda a un gr谩fico de barras sin superponerse

Tambi茅n podr铆as cambiar los l铆mites de los ejes con los argumentos xlim e ylim para gr谩ficos horizontales y verticales, respectivamente, pero ten en cuenta que en este caso el valor que pases depender谩 del n煤mero y del ancho de las barras. Recuerda que si asignas un barplot a una variable puedes conocer los puntos del eje X que representan el centro de cada barra.

barplot(mi_tabla, xlab = "N煤mero de cilindos",
        col = rainbow(3),
        legend.text = rownames(mi_tabla), xlim = c(0, 4.25))

Otra alternativa para mover la leyenda es ponerla 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 debas borrar los par谩metros gr谩ficos antes de la ejecuci贸n del c贸digo para obtener la gr谩fica correcta, ya que 茅stos se cambiar谩n.

# dev.off()
# opar <- par(no.readonly = TRUE)
plot.new()
layout(rbind(1, 2), heights = c(10, 3))
barplot(mi_tabla, xlab = "N煤mero de cilindros",
        col = rainbow(3))

par(mar = c(0, 0, 0, 0))
plot.new()
legend("top", rownames(mi_tabla), lty = 1,
       col = c("red", "green", "blue"), lwd = c(1, 2))
# dev.off()
# on.exit(par(opar))
Agreagar leyenda debajo de un gr谩fico de barras en R

Gr谩fico de barras agrupadas en R

Una gr谩fica de barras agrupadas es una gr谩fica de barras en R con dos o m谩s variables. El gr谩fico mostrar谩 las barras para cada una de las m煤ltiples variables.

# Convertimos la variable 'am' en factor
am <- factor(am)

# Cambiamos los niveles del factor
levels(am) <- c("Automatica", "Manual")

# Tabla cilindros - tipo de transmisi贸n
tabla_variables <- table(cyl, am)
# tabla_variables <- xtabs(~cyl + am , data = mtcars) # Equivalente

barplot(tabla_variables,
        main = "Gr谩fico de barras agrupado",
        xlab = "Tipo de transmisi贸n", ylab = "Frecuencia",
        col = c("darkgrey", "darkblue", "red"),
        legend.text = rownames(tabla_variables),
        beside = TRUE) # Barras agrupadas
Crear gr谩fico de barras por grupos en R

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, por lo que habr铆a tres grupos con dos barras cada uno.

Espacio entre grupos

Como revisamos anteriormente, se puede cambiar el espacio entre barras. En el caso de varios grupos, puedes establecer un vector de dos elementos donde el primer elemento es el espacio entre barras de cada grupo (0.4) y el segundo el espacio entre grupos (2.5).

barplot(tabla_variables,
        main = "Espacio entre grupos",
        xlab = "Tipo de transmisi贸n", ylab = "Frecuencia",
        col = c("darkgrey", "darkblue", "red"),
        legend.text = rownames(tabla_variables),
        beside = TRUE,
        space = c(0.4, 2.5)) # Espacio
Cambiar el espacio entre grupos de un barplot

Valores num茅ricos en grupos

Los gr谩ficos de barras tambi茅n se pueden usar para resumir una variable en grupos dados por uno o varios factores.

Sup贸n que quieres mostrar la cantidad de cilindros y el tipo de transmisi贸n en funci贸n de la potencia media de los autom贸viles. Puedes utilizar la funci贸n tapply para crear la tabla correspondiente:

resumen_datos <- tapply(mtcars$hp, list(cilindros = mtcars$cyl,
                                        transmision = am),
                        FUN = mean, na.rm = TRUE)
resumen_datos
                transmision
cilindros  Automatica   Manual
        4   84.66667   81.8750
        6  115.25000  131.6667
        8  194.16667  299.5000

Ahora puedes crear el diagrama de barras correspondiente en R:

par(mar = c(5, 5, 4, 10))

barplot(resumen_datos, xlab = "Tipo de transmisi贸n",
        main = "Media CV",
        col = rainbow(3),
        beside = TRUE,
        legend.text = rownames(resumen_datos),
        args.legend = list(title = "Cilindros", x = "topright",
                           inset = c(-0.20, 0)))
Resumen num茅rico por grupo

Gr谩fico de barras en R con barras de error

Por defecto, no puedes crear un diagrama de barras con barras de error. Sin embargo, la siguiente funci贸n te permitir谩 crear un diagrama de barras totalmente personalizable con barras de error est谩ndar:

# Argumentos:
# x: un 煤nico factor
# y: un vector num茅rico
# ...: argumentos adicionales para ser pasados a la funci贸n barplot

barplot.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[i], means[i] + sem,
              barpl[i], means[i] - sem, angle = 90, code = 3, length = 0.08)))
}

# Llamamos a la funci贸n
barplot.error(factor(mtcars$cyl), mtcars$hp, col = rainbow(3), ylim = c(0, 250))
A帽adir barras de error

Aunque puedes agregar barras de error a un diagrama de barras en R, cabe destacar que un diagrama de caja por grupo podr铆a ser un mejor enfoque para resumir los datos en este escenario.

Gr谩fico de barras apiladas en R

Un gr谩fico de barras apiladas es como un diagrama de barras agrupado, pero la frecuencia de las variables est谩 apilada. Este tipo de diagrama de barras se crear谩 de forma predeterminada al pasar como argumento una tabla con dos o m谩s variables, ya que el argumento beside por defecto es FALSE.

barplot(tabla_variables,
        main = "Gr谩fico de barras apilado",
        xlab = "Tipo de transmisi贸n", ylab = "Frecuencia",
        col = c("darkgrey", "darkblue", "red"),
        legend.text = rownames(tabla_variables),
        beside = FALSE) # Barras apiladas (opci贸n por defecto)
Barras apiladas en R

Relacionado con los gr谩ficos de barras apiladas, existen implementaciones similares, como el diagrama de espinas o spineplot y el gr谩fico de mosaico o mosaicplot. Este tipo de gr谩ficos se pueden crear con las funciones spineplot y mosaicplot del paquete graphics.

El diagrama de tipo 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(tabla_variables, main = "Mosaico")
Gr谩fico de mosaico en R

El diagrama de espina es un caso especial de un diagrama de mosaico y es una generalizaci贸n del diagrama de barras apilado. En este caso, a diferencia de los gr谩ficos de barras apiladas, cada barra suma uno.

spineplot(tabla_variables)
Gr谩fico de espina en R

Ten cuenta que, por defecto, los ejes se intercambian con respecto al diagrama de barras apiladas que creamos en la secci贸n anterior. Puedes crear el gr谩fico equivalente transponiendo la tabla de frecuencias con la funci贸n t.

spineplot(t(tabla_variables))
Gr谩fico de espinas vertical

Gr谩fico de barras en R con ggplot2

El paquete ggplot2 es una biblioteca gr谩fica de R muy conocida. Puedes crear un diagrama de barras con esta biblioteca convirtiendo los datos en data frame y usando las funciones ggplot y geom_bar. En el argumento aes debes pasar los nombres de las variables del data frame, en x la variable categ贸rica y en y la num茅rica.

# install.packages("ggplot2")
library(ggplot2)

df <- as.data.frame(mi_tabla)

ggplot(data = df, aes(x = cyl, y = Freq)) +
       geom_bar(stat = "identity")
Crear diagrama de barras en R con ggplot2

Gr谩fico de barras horizontal en ggplot2

En caso de que quieras rotar el diagrama de barras anterior, puedes usar la funci贸n coord_flip de la siguiente manera:

ggplot(data = df, aes(x = cyl, y = Freq)) +
       geom_bar(stat = "identity") +
       coord_flip() # Barras horizontales
Crear gr谩fico de barras horizontal con ggplot2