Gráfico de sectores en R
Un gráfico de sectores, también conocido como gráfico circular, gráfico de pastel, de tarta, de torta o pie chart, por su nombre en inglés, es un gráfico circular que representa proporciones o porcentajes en sectores, donde el área y la longitud del arco de cada sector es proporcional a la cantidad representada. Existen variaciones de de este tipo de gráfico, como los gráficos de anillos, de donut, de waffles y gráficos spie. En este tutorial revisaremos cómo hacer un gráfico de sectores en R base.
Crítica a los gráficos de sectores
Antes de proceder con las explicaciones, cabe mencionar que los gráficos circulares, aunque muy populares, han sido ampliamente criticados. Como son más difíciles de leer que otras alternativas gráficas, se sabe que son gráficos estadísticos que pueden dar lugar a engaños. Los siguientes gráficos representan las mismas variables dibujadas con gráficos de sectores y con gráficos de barras.
Como se puede ver en el ejemplo anterior, los gráficos de barras son más fáciles de leer que los gráficos de sectores. No obstante, los gráficos circulares pueden ser útiles en muchas situaciones, por ejemplo, cuando los datos están muy desbalanceados.
Los gráficos de sectores han sido criticados debido a la dificultad que supone leer ángulos para los ojos humanos. En la mayoría de casos se recomienda usar gráficos de barras en su lugar, ya que son más fáciles de leer.
¿Cómo crear un gráfico de sectores en R?
Un gráfico circular se puede crear con la función pie
de R base. Aunque existen más paquetes para crear gráficos de sectores, como ggplot2
, en este tutorial revisaremos cómo crear gráficos de tarta con la función pie
y la función PieChart
del paquete lessR
, para mostrar porcentajes.
La función pie()
La función pie
permite crear gráficos de sectores en R. Considera, por ejemplo, que quieres crear un gráfico circular de la siguiente variable, que representa el conteo de cierto evento:
count <- c(7, 25, 16, 12, 10, 30)
El código para crear un gráfico de sectores en R es como sigue. Ten en cuenta que puedes personalizar el tamaño del gráfico (desde -1 a 1) con el argumento radius
, que por defecto toma el valor 0.8.
pie(count)
También puedes modificar la dirección del gráfico con el argumento clockwise
, que por defecto es FALSE
.
pie(count, clockwise = TRUE)
Sin embargo, es posible que hayas notado que el gráfico no muestra el valor correspondiente de cada segmento. Para resolver este problema, puedes pasar el vector al argumento labels
de la siguiente manera.
pie(count, labels = count)
Si lo prefieres, puedes agregar un vector de caracteres con los nombres que quieras para representar cada segmento:
pie(count, labels = c("0-15", "16-30", "31-45", "46-60", "61-75", "76-90"))
Personalización
Además, puedes modificar el color del gráfico con el argumento col
. En el siguiente bloque de código mostramos cómo usar diferentes paletas de colores. Ten en cuenta que el argumento cex
permite modificar el tamaño de las etiquetas.
par(mfrow = c(1, 3))
pie(count, labels = count, col = 1:6, cex = 2)
pie(count, labels = count, col = rainbow(6), cex = 2)
pie(count, labels = count, col = topo.colors(6), cex = 2)
par(mfrow = c(1, 1))
Sin embargo, la mejor paleta de colores para un gráfico de sectores pueden ser las de la función brewer.pal
del paquete RColorBrewer
.
# install.packages("RColorBrewer")
library(RColorBrewer)
color <- brewer.pal(length(count), "Set2")
pie(count, labels = count, col = color)
También puedes especificar un vector de colores para el borde de cada porción. Si quieres que el color sea igual al color del área, puedes escribir:
pie(count, labels = count, col = color, border = color)
Si quieres modificar el tipo de línea de los bordes del gráfico puedes hacer uso del argumento lty
.
pie(count, labels = count, col = color, lty = 2)
Además, puedes agregar líneas de sombreado con el argumento density
. Cuanto mayor sea el valor, más líneas se mostrarán. Ten en cuenta que el argumento angle
puede usarse para modificar el ángulo de las líneas.
pie(count, labels = count, col = color, density = 50, angle = 45)
Finalmente, también puedes personalizar el número de polígonos utilizados para crear el gráfico. Por defecto, el argumento edges
es 200, pero si especificas un valor más bajo, puedes crear algo como lo siguiente:
pie(count, labels = count, edges = 10)
Gráfico circular con porcentajes
Los gráficos circulares son muy útiles para mostrar porcentajes, pero la función pie
no permite mostrarlos automáticamente. Para mostrar porcentajes para el vector de muestra (ya que la suma de los elementos es igual a 100), puedes escribir:
pie(count, labels = paste0(count, "%"))
No obstante, una aproximación más genérica es calcular los porcentajes correspondientes. Para ese propósito, considera el siguiente vector:
count_2 <- c(15, 27, 25, 10)
Como en este caso la suma de los componentes del vector no es igual a 100, el porcentaje correspondiente es diferente al número correspondiente del vector. En el siguiente bloque de código mostramos cómo calcular los porcentajes. Ten en cuenta que la función round
permite modificar el número de decimales.
etiquetas <- paste0(round(100 * count_2/sum(count_2), 2), "%")
pie(count_2, labels = etiquetas)
Sin embargo, si también quieres mostrar los números o las etiquetas del vector original, podrías escribir:
etiquetas <- paste0(count_2, " = ", round(100 * count_2/sum(count_2), 2), "%")
pie(count_2, labels = etiquetas)
Una alternativa para mostrar porcentajes en un gráfico circular es usar la función PieChart
del paquete lessR
, que muestra los porcentajes en el medio de los sectores. Sin embargo, la entrada de esta función tiene que ser una variable categórica (o numérica, si cada valor distinto representa una categoría, como en el ejemplo) de un data frame, en lugar de un vector numérico. Recuerda escribir ?PieChart
o help(PieChart)
para obtener información adicional.
# install.packages("lessR)
library(lessR)
# Creamos el data frame con la nueva variable
mis_datos <- data.frame(x = c(rep(count_2[1], count_2[1]), # 15 veces 15
rep(count_2[2], count_2[2]), # 27 veces 27
rep(count_2[3], count_2[3]), # 25 veces 25
rep(count_2[4], count_2[4]))) # 10 veces 10
PieChart(x, hole = 0, values = "%", data = mis_datos, fill = 1:4, main = "")
Gráfico de sectores con variable categórica
Considera, por ejemplo, que quieres crear un gráfico circular en R con el porcentaje correspondiente de hombres y mujeres registrados en algún evento. Tienes los siguientes datos:
genero <- factor(c(rep("Hombre", 10), rep("Mujer", 20)))
genero
Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre
Mujer Mujer Mujer Mujer Mujer Mujer Mujer Mujer Mujer Mujer
Mujer Mujer Mujer Mujer Mujer Mujer Mujer Mujer Mujer Mujer
Levels: Hombre Mujer
Por lo tanto, como tienes una variable de caracteres, puede usar la función table
para contar el número de hombres y mujeres del vector de caracteres y pasar la salida a la función pie
.
tabla_genero <- table(genero)
pie(tabla_genero)
Una alternativa es utilizar la función PieChart
, pero como señalamos antes, debes crear un data frame con una variable de caracteres o factor:
genero <- data.frame(gen = genero)
# install.packages("lessR")
library(lessR)
PieChart(gen, hole = 0, values = "%", data = genero,
fill = c("lightblue", "pink"), main = "")
Añadiendo una leyenda
Para crear un gráfico circular en R con leyenda, debes usar la función legend
. Como ejemplo, si quieres mostrar una leyenda en la parte superior izquierda de la imagen, puedes ejecutar el siguiente código:
count_3 <- c(20, 50, 30)
# sum(count_3) # 100
pie(count_3, labels = paste0(count_3, "%"))
legend("topleft", legend = c("Teatro", "Series", "Cine"),
fill = c("white", "lightblue", "mistyrose"))
Gráfico de sectores 3D
En esta última sección, aprenderás a crear gráficos circulares 3D en R. Para ello, deberás instalar el paquete plotrix
, que contiene la función pie3D
. El código para dibujar un gráfico de sectores 3D en R es el siguiente:
# install.packages("plotrix")
library(plotrix)
datos <- c(65, 35)
pie3D(datos)
También puedes pasar una tabla como argumento para crear un gráfico circular 3D a partir de datos categóricos.
Ten en cuenta que, de manera predeterminada, la función no muestra etiquetas, por lo que deberás indicarlas en el argumento labels
.
pie3D(datos, labels = datos)
Además, puedes explotar los sectores del gráfico con el argumento explode
.
pie3D(datos, labels = datos, explode = 0.25)
Al igual que con otros gráficos circulares, puedes personalizar varios parámetros gráficos del gráfico final, como los colores, los colores de las etiquetas o el color del borde, entre otros. Recuerda escribir help(pie3D)
o ?pie3D
para obtener detalles adicionales.
pie3D(datos, labels = datos, col = 2:3, labelcol = "red", border = "white")