Es una de las representaciones clásicas de datos cuantitativos, similar a un diagrama de barras pero en forma de texto. Para construirlo basta separar de cada dato el último dígito de la derecha (que constituye la hoja) del bloque de cifras restantes (que formará el tallo).
Fue una de las herramientas propuestas por Tukey (1977) y muestra:
El centro de la distribución.
La forma general de la distribución, que puede ser:
Simétrica: las porciones a cada lado del centro son muy similares (forma de campana).
Sesgada: si la cola izquierda/derecha (los valores menores/mayores) es mucho más larga que los de la derecha/izquierda (los valores mayores/menores).
Outliers: observaciones individuales alejadas del patrón general de los datos.
Datos ausentes: aparecen como huecos sin datos en el gráfico.
Es un gráfico simple, fácil de realizar (incluso a mano) pero su uso no es habitual, en parte porque no es muy útil cuando el número de observaciones es elevado.
stem()
Ejemplo
datos <- c(12, 15, 16, 21, 24, 29, 30, 31, 32, 33, 45, 46, 49, 50, 52, 58, 60, 63, 64, 65)
Por defecto, los datos aparecen agrupados. El argumento
scale = 2
sirve para desagruparlos:
stem(datos,
scale = 2)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 1 | 256
## 2 | 149
## 3 | 0123
## 4 | 569
## 5 | 028
## 6 | 0345
De acuerdo con este gráfico, la mayor frecuencia de valores corresponde a la decena de 30 y la distribución no es totalmente simétrica, ya que la cola se desplaza hacia la derecha.
rm(datos)
Se utiliza para representar las frecuencias absolutas o relativas de una variable cualitativa (a veces, una cuantitativa discreta con un número reducido de categorías).
Se elabora a partir de una tabla de frecuencias. Constituye un gráfico cartesiano; habitualmente en el eje horizontal se ubican las categorías o niveles de la variable, mientras que en el vertical se representa la cantidad (frecuencia absoluta) o la frecuencia relativa de cada categoría. Las categorías pueden ordenarse alfabéticamente, facilitando la comparación de los datos.
El diagrama de barras también puede adoptar una orientación horizontal: en este caso las categorías se sitúan en el eje vertical y las barras crecen horizontalmente. Suelen usarse cuando hay muchas categorías o sus nombres son largos.
Tipos de gráficos de barras:
Básico: representa una única variable.
Agrupadas: representa simultáneamente diferentes variables, mediante barras de diferente color o textura.
La función de R que genera gráficos de barras es
barplot()
seguido de una serie de argumentos, tomando como
fuente una tabla de frecuencias. La tabla de frecuencias pueden
proporcionar tanto la frecuencia absoluta o como la relativa. Por
defecto, R crea el diagrama de barras con frecuencias absolutas.
El primer paso es cargar los datos del dataframe
alumnos_UC.RData
Dos opciones:
tabla_sang <- table(alumnos_uc$grupo_sanguineo) # Creación de un objeto tabla
barplot(tabla_sang, # Tabla a partir de la que dibujamos el gráfico
main = "Grupos sanguíneo de los estudiantes de la UC", # Título del gráfico.
cex.main = 1.5, # Tamaño del título
ylim = c(0, 50), # Rango de valores del eje vertical.
xlab = "Grupo", # Etiqueta del eje vertical.
ylab = "Frecuencia absoluta", # Etiqueta del eje horizontal.
font.lab = 3, # 1: normal, 2: bold, 3: italic, 4: bold italic
col.lab = "darkblue", # Color de las etiquetas
font.axis = 2, # 1: normal, 2: bold, 3: italic, 4: bold italic
col.axis = "black", # Color de los ejes
cex.axis = 1.5, # Grosor de los ejes
col = rainbow(8)) # Cada barra con un color diferente (arcoiris)
table()
en barplotbarplot(table(alumnos_uc$grupo_sanguineo),
main = "Grupos sanguíneo de los estudiantes de la UC", # Título del gráfico.
ylim = c(0, 50), # Rango de valores del eje vertical.
xlab = "Grupo sanguíneo", # Etiqueta del eje vertical.
ylab = "Frecuencia absoluta", # Etiqueta del eje horizontal.
col = rainbow(8)) # Cada barra con un color diferente (arcoiris)
Argumentos opcionales para la configuración del diagrama de barras
barplot()
Para elaborar un gráfico de barras que incluya las
frecuencias relativas la función barplot()
se aplica a una tabla creada con la función prop.table()
,
multiplicada por 100.
barplot(prop.table(tabla_sang) * 100,
main = "Grupos sanguíneo de los estudiantes de la UC", # Título del gráfico.
ylim = c(0, 50), # Rango de valores del eje vertical.
xlab = "Grupo sanguíneo", # Etiqueta del eje vertical.
ylab = "Frecuencia relativa (%)", # Etiqueta del eje horizontal.
col = rainbow(8)) # Cada barra con un color diferente (arcoiris)
Dos posibles mejoras consisten en la inclusión de los valores correspondientes a la altura de las barras (frecuencia absoluta o relativa) y dibujar una línea de rejilla por debajo de las barras del gráfico. Para ello, debe recurrirse a un pequeño truco, dibujando primero el gráfico de barras lo más simple posible e ir superponiendo el resto de mejoras visuales.
# Gráfico de barras inicial
barplot(tabla_sang,
ylim = c(0,50),
xlab = "Grupo sanguíneo",
ylab = "Frecuencia aabsoluta")
# Líneas de rejilla superpuestas
grid(nx = NA,
ny = NULL,
lty = 2,
col = "black", lwd = 1)
# Gráfico de barras sobreimpuesto en forma de objeto
barp <- barplot(tabla_sang,
col = rainbow(8),
ylim = c(0,50),
add = TRUE)
# Valores de la altura de las variables
text(barp,
tabla_sang + 3.5, # Distancia de las etiquetas al techo de las barras
labels = tabla_sang) # Etiquetas de los números sobre las barras.
Uno de los problemas más comunes con los gráficos de barras es la superposición de la leyenda al gráfico, como en el siguiente ejemplo.
barplot(tabla_sang,
main = "Grupos sanguíneo de los estudiantes de la UC", # Título del gráfico.
ylim = c(0, 50), # Rango de valores del eje vertical.
xlab = "Grupo sanguíneo", # Etiqueta del eje vertical.
ylab = "Frecuencia relativa (%)", # Etiqueta del eje horizontal.
col = rainbow(8)) # Cada barra con un color diferente (arcoiris).
legend("top", # Posición de la leyenda.
legend = rownames(tabla_sang), # Nombre de las etiquetas en la leyenda
fill = rainbow(8),
bty = "n") # Eliminar el marco de la leyenda
Una opción alternativa es modificar el eje X, de modo que quede sitio a la izquierda para colocar la leyenda. Pero esta solución choca con la circunstancia que este eje no muestra valores numéricos, sino categorías. Pero es posible pedir a barplot las coordenadas de las posiciones de la base. La manera de obtener dichas coordenadas es asignar el gráfico a una variable y mostrar los valores de ésta (si además indicamos plot=FALSE nos ahorramos que R nos repita el gráfico, aunque tampoco tiene mayor importancia):
xCoords <- barplot(tabla_sang,
main = "Grupos sanguíneo de los estudiantes de la UC", # Título del gráfico.
ylim = c(0, 50), # Rango de valores del eje vertical.
xlab = "Grupo sanguíneo", # Etiqueta del eje vertical.
ylab = "Frecuencia relativa (%)", # Etiqueta del eje horizontal.
col = rainbow(8), # Cada barra con un color diferente (arcoiris).
plot=FALSE)
xCoords
## [,1]
## [1,] 0.7
## [2,] 1.9
## [3,] 3.1
## [4,] 4.3
## [5,] 5.5
## [6,] 6.7
## [7,] 7.9
## [8,] 9.1
De acuerdo con este resultado, la última barra alcanza la posición
9.1. Se puede reducir esta anchura fijando la extensión del eje X como
xlim=c(0,9)
(conviene probar unos cuantos valores) y
modificando tanto el espacio entre las barras (argumento
space
) como la anchura de las barras (argumento
width
).
barplot(tabla_sang,
main = "Grupos sanguíneo de los estudiantes de la UC", # Título del gráfico.
ylim = c(0, 50), # Rango de valores del eje vertical.
xlab = "Grupo sanguíneo", # Etiqueta del eje vertical.
ylab = "Frecuencia relativa (%)", # Etiqueta del eje horizontal.
col = rainbow(8), # Cada barra con un color diferente (arcoiris)
xlim = c(0,9),
space = c(0.05,0.05, 0.05, 0.05, 0.05, 0.05, 0.05,0.05), # Espacio entre las barras
width = c(0.85,0.85, 0.85, 0.85, 0.85, 0.85, 0.85,0.85)) # Ancho de las barras
legend("right", # Posición de la leyenda.
legend = rownames(tabla_sang), # Nombre de las etiquetas en la leyenda
fill = rainbow(8),
bty = "n") # Eliminar el marco de la leyenda
Otra posible solucion es dibujar el gráfico sin leyenda y crear a
continuación una leyenda ex-profeso. Podemos mover la leyenda a la
derecha, fuera del gráfico de barras utilizando 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, 11)) # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.
barplot(tabla_sang, # Tabla con los datos
main = "Grupos sanguíneo de los estudiantes de la UC", # Título del gráfico
ylim = c(0, 50), # Rango de valores del eje vertical.
xlab = "Grupo sanguíneo", # Etiqueta del eje vertical
ylab = "Frecuencia relativa (%)", # Etiqueta del eje horizontal
col = rainbow(8), # Cada barra con un color diferente (arcoiris).
legend.text = rownames(tabla_sang), # Valores de la leyenda
args.legend = list(x = "right",
inset = c(-0.30, 0)), # Argumentos de la leyenda
bty = "n") # Eliminar el marco de la leyenda
Volvemos a continuación a configurar el lienzo con sus valores por defecto.
par(mar = c(5, 4, 4, 2))
También es posible elaborar un gráfico de barras a partir de un dataframe o de una lista. En el ejemplo que aparece a continuación los datos del dataframe no son los datos en bruto, sino que han sido previamente elaborados (en realidad, es una tabla de frecuencias convertida en dataframe)
borrame <- data.frame(ColorCoche = c("rojo", "verde", "blanco", "azul"),
num = c(3, 5, 9, 1))
barplot(height = borrame$num,
names = borrame$ColorCoche,
col = c("red", "green", "white", "blue"))
Es posible transformar una variable continua en discreta y
representarla por medio de un gráfico de barras. El
procedimiento consiste en anidar la función cut()
dentro de
la función table()
, para categorizar los datos, e incluir
el argumento breaks
indicando los límites inferior y
superior de cada categoría.
barplot(table(cut(alumnos_uc$peso,
breaks = seq(40, 100, by = 10))))
Para elaborar un gráfico con las barras horizontales
se establece el argumento horiz = TRUE
.
barplot(tabla_sang,
main="Alumnos de la UCGrupo sanguíneo",
ylab = "Grupo sanguíneo",
xlab = "Frecuencia absoluta",
col=c("red","green","yellow", "pink", "blue", "purple", "magenta", "black"),
las = 1, #Etiquetas del eje vertical horizontales
horiz = TRUE)
De nuevo, en este caso es común que las etiquetas del eje vertical queden fuera del área de trabajo.
par(mar = c(5, 15, 4, 2)) # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.
tabla_rama <- table(alumnos_uc$rama_conocimiento_let)
barplot(tabla_rama,
main="Alumnos de la UC",
xlab = "Frecuencia absoluta",
col=c("red","green","yellow", "blue", "purple", "magenta"),
las = 1, #Etiquetas del eje vertical horizontales
horiz = TRUE)
par(mar = c(5, 4, 4, 2))
rm(tabla_sang, tabla_rama, borrame, barp)
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE BARRAS :
EJERCICIO 1. A partir del dataframe alumnos_uc
crea un
diagrama de barras que informe sobre la procedencia geográfica de los
alumnos de nuevo ingreso en forma de frecuencia relativa.
Incluye las etiquetas en los ejes X e Y. Si las etiquetas del eje X se empastaran, asigna unas nuevas etiquetas al gráfico.
Cada ámbito geográfico le corresponderá un color diferente.
barplot(table(alumnos_uc$procedencia),
main = "Origen de los alumnos de nuevo ingreso en la UC",
xlab = "Comarcas",
ylab = "Frecuencia de alumnos en (%)",
ylim = c(0,50),
las = 1, # Posición horizontal de las etiquetas de ambos ejes.
cex.lab = 1.2, # Tamaño de las etiquetas de los ejes.
font.axis = 2,
col=c("red","green","yellow", "blue", "purple", "magenta"),
names.arg = c("Bahía", "Besaya", "Campoo", "Foráneos", "Occidental", "Oriental"))
EJERCICIO 2. A partir del dataframe zonas_verdes
Crea un
diagrama de barras clásico representando la frecuencia absoluta de
parques con obras y sin obras.
El gráfico deberá tener por título “Parques de Madrid en obras”.
El eje X deberá tener la etiqueta “Estado actual”.
La etiqueta del eje Y deberá ser “Número de parques”.
Ajusta los valores del eje Y para que la altura de las barras no sobresalga por encima del valor máximo de dicho eje.
La barra correspondiente a los valor “No” tendrá un color verde y la barra “Si” un color rojo.
load("D:/G2040/TEMA_3_ESDA_Graficos/datos/zonas_verdes.Rdata")
zonas_verdes$obras <- factor(zonas_verdes$obras,
levels=c(0,1),
labels=c("Sin obras","Con obras"))
barplot(table(zonas_verdes$obras),
main = "Parques de Madrid en obras",
xlab = "Estado actual",
ylab = "Número de parques",
ylim = c(0,70), #
las = 1, # Posición horizontal de las etiquetas de ambos ejes.
cex.lab = 1.2, # Tamaño de las etiquetas de los ejes.
font.axis = 2,
col = c("Green", "Red"))
EJERCICIO 3. Crea un diagrama de barras horizontal representando la
frecuencia relativa de la variable barrio
que se encuentra
en el dataframe zonas_verdes.
El gráfico deberá tener por título “Número de Parques según barrios de Madrid”.
El eje X deberá tener la etiqueta “Porcentaje sobre el total”.
Ajusta los valores del eje X para que la longitud de las barras no sobresalga por encima del valor máximo de dicho eje.
Utiliza la gama de colores del arcoiris para que cada una de las barras tenga un color diferente.
par(mar = c(5, 8, 4, 2)) # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.
barplot(prop.table(table(zonas_verdes$barrio)) * 100,
main="Parques según barrios de Madrid",
col= rainbow(7),
las = 1, #Etiquetas del eje vertical horizontales
horiz = TRUE,
xlab = "Porcentaje sobre el total",
xlim = c(0,25),
cex.lab = 1.2, # Tamaño de las etiquetas de los ejes.
font.axis = 2)
par(mar = c(5, 4, 4, 2))
Se obtiene cuando se aplica la función barplot()
a una
tabla con dos variables (bidimensional), con dos posibilidades
dependiendo del argumento beside
:
Si es “FALSE” barras apiladas;
Si “TRUE” barras yuxtapuestas.
Primero debe crearse una tabla denominada “de doble entrada”, con dos variables simultáneas:
tabla_procedencia_genero <- table(alumnos_uc$genero,
alumnos_uc$rama_conocimiento_let)
barplot(tabla_procedencia_genero,
main = "Gráfico de barras apiladas",
sub = "Subtítulo",
col = c("red", "yellow"),
ylim = c(0, 30),
xlab = "Etiqueta eje X",
ylab = "Etiqueta eje Y",
names.arg = c("AyH", "Cie", "CSYJ", "IyA", "CS"),
axes = TRUE)
OPCION 2: barras yuxtapuestas
barplot(tabla_procedencia_genero,
main = "Gráfico de barras yuxtapuestas",
sub = "Subtítulo",
xlab = "Etiqueta eje X",
ylab = "Etiqueta eje Y",
axes = TRUE,
col = c("Green", "Blue"),
names.arg = c("AyH", "Cie", "CSYJ", "IyA", "CS"),
beside = TRUE)
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: GRÁFICO DE BARRAS APILADAS:
EJERCICIO 1. A partir de una tabla que combine la frecuencia de
valores de las variables rama_conocimiento_let
y
genero
del dataframe alumnos_uc
crea un
gráfico de barras apiladas con la frecuencia de ambas
variables y las siguientes características:
El gráfico deberá tener por título “Elección de la rama de conocimiento según género”.
La etiqueta del eje X es “Género” y deberá estar acompañada por un subtítulo con la siguiente inscripción “Curso 2022-2023”.
Ajusta los valores del eje X para que la longitud de las barras no sobresalga por encima del valor máximo de dicho eje.
La etiqueta del eje Y es “Porcentaje de alumnos”.
Utiliza la siguiente gama de colores: c(“red”,“green”,“yellow”, “blue”, “purple”, “magenta”, “orange”).
Incluye una leyenda a la derecha, que no invada las columnas, en la que aparezcan los nombres de las ramas de conocimiento con sus respectivos colores.
par(mar = c(5, 4, 4, 14)) # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.
barplot(prop.table(table(alumnos_uc$rama_conocimiento_let, alumnos_uc$genero)) * 100,
main = "Elección de la rama de conocimiento según género",
sub = "Curso 2022-2023",
xlab = "Género",
ylab = "Porcentaje de alumnos",
ylim=c(0,80),
las = 1,
axes = TRUE,
col = c("red","green","yellow", "blue", "purple", "magenta", "orange"),
beside = FALSE,
legend.text=rownames(table(alumnos_uc$rama_conocimiento_let, alumnos_uc$genero)),
args.legend = list(x = "topright", inset = c(-0.70, 0)))
EJERCICIO 2. A partir de una tabla que combine la frecuencia de
valores de las variables barrio
y obras
del
dataframe zonas_verdes
crea un gráfico de barras
yuxtapuestas con las siguientes características:
El gráfico deberá tener por título “Estado de las obras en los parques de Madrid”.
La etiqueta del eje X es “Parques” y deberá estar acompañada por un subtítulo con la siguiente inscripción “Año 2023”.
Ajusta los valores del eje X para que la longitud de las barras no sobresalga por encima del valor máximo de dicho eje.
La etiqueta del eje Y es “Número de parques”.
Utiliza la siguiente gama de colores: c(“red”,“green”,“yellow”, “blue”, “purple”, “magenta”, “orange”).
Incluye una leyenda a la derecha, que no invada las columnas, en la que aparezcan los nombres de los barrios con sus respectivos colores.
par(mar = c(5, 4, 4, 10)) # márgenes del lienzo según líneas. Por defecto mar = c(5, 4, 4, 2) abajo, izda, arriba, dcha.
barplot(table(zonas_verdes$barrio, zonas_verdes$obras),
main = "Estado de las obras en los parques de Madrid",
sub = "Año 2023",
xlab = "Parques",
ylab = "Número de parques",
ylim=c(0,16),
axes = TRUE,
col = c("red","green","yellow", "blue", "purple", "magenta", "orange"),
beside = TRUE,
names.arg = c("Sin obra", "Con obra"),
legend.text=rownames(table(zonas_verdes$barrio, zonas_verdes$obras)),
args.legend = list(x = "right", inset = c(-0.30, 0)))
Los spineplots son una generalización de los gráficos de barras apilados. Un gráfico de mosaico es un spineplot para dos o más variables. Como en los casos anteriores, se requiere una tabla de frecuencias.
spineplot(tabla_procedencia_genero,
col = c("yellow", "orange", "red", "magenta", "green"),
border = c("darkblue", "black")) # Color del borde de las barras
Un spine plot transpuesto es un gráfico de barras clásico.
spineplot(t(tabla_procedencia_genero)) # Trasposición de variables
Por defecto, la función spineplot()
crea un spineplot,
pero estableciendo off = 0
se creará una variante,
denominada “espinograma”, eliminando la distancia entre las barras.
spineplot(tabla_procedencia_genero,
off = 0)
rm(tabla_procedencia_genero)
📝 ****ACTIVIDAD DE EVALUACIÓN CONTINUA: SPINE PLOT**::
Crea un gráfico “Spine plot” que represente la relación entre la
variable rama_conocimiento_let
y la variable
uso_movil_let
. Este gráfico tendrá como título “Relación
entre rama conocimiento y uso de móvil”. Añade las etiquetas según
corresponda.
También conocidos como gráfico de Marimekko, o gráfico de barras apiladas porcentuales. Es una extensión multidimensional de los gráficos de barras al permitir la visualización de dos o más variables cualitativas. Permite reconocer relaciones entre diferentes variables; por ejemplo, la independencia se muestra cuando las casillas de las categorías tienen todas las mismas áreas.
Al igual que con los gráficos de barras, en este caso es el área de los mosaicos, también conocida como tamaño del contenedor, el que es proporcional al número de observaciones dentro de esa categoría, es decir, que en la tabla de frecuencias original, cada entrada corresponde a un rectángulo cuyo área es proporcional a ese valor
mosaicplot(procedencia ~ genero,
data=alumnos_uc,
main="Procedencia del alumnado según sexo",
cex.axis=1, # TamaÁ±o de las etiquetas ejes X e Y
las=1,
xlab = "Localización",
ylab = "Género",
col=c("pink","lightblue"))
📝 ****ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE MOSAICO**::
Repite el gráfico anterior, pero ahora como diagrama de mosaico. ¿Cuál de los dos es más útil para explicar la relación entre la rama de conocimiento y el uso más o menos continuado del teléfono móvil.
El diagrama de Pareto, también llamado curva cerrada o Distribución A-B-C, combina barras y líneas.
Como en el gráfico de barras clásico, en el eje horizontal se representan las categorías de la variable que queremos estudiar y la altura de las barras es proporcional al valor de cada categoría, pero están ordenadas por frecuencias de forma descendente.
En el eje vertical derecho se muestra la escala de porcentajes
En el eje vertical izquierdo se representa la escala de frecuencias.
La línea representa el porcentaje acumulado de dichas frecuencias respecto el total.
Este gráfico se fundamenta en el principio de Pareto.
✅ PRINCIPIO DE PARETO:
El principio de Pareto, también conocido como la regla del 80-20 y ley de los pocos vitales, describe el fenómeno estadístico por el que, en cualquier población que contribuye a un efecto común, una proporción pequeña de casos (20 % de los casos) contribuye a la mayor parte (el 80%) de los efectos, ya que la distribución de los efectos como sus posibles causas no es un proceso lineal.
Recibe uno de sus nombres en honor a Vilfredo Pareto, que lo enunció por primera vez en su Cours d’économie politique (Curso de economía política) de 1896. Pareto formuló este principio tras un estudio acerca de la distribución de la riqueza con el que estableció que la desigualdad económica es inevitable en cualquier sociedad.
El principal uso de este tipo de gráfico es establecer un orden de prioridades en la toma de decisiones (asignar un orden de prioridades), ya que en el gráfico los “pocos vitales” aparecen a la izquierda y los “muchos triviales” a la derecha.
En R se puede elaborar con la función pareto.chart()
del
paquete qcc
.
library(qcc)
Podemos seguir diferentes opciones:
table()
y posterior activación de la función pareto.chart()
sobre
esa tabla.tabla_gs <- table(alumnos_uc$grupo_sanguineo)
pareto.chart(tabla_gs,
main="Diagrama de Pareto",
xlab="Grupo sanguíneo",
ylab="Frecuencia absoluta",
ylab2="Frecuencia relativa acumulada",
las = 1,
col=heat.colors(length(alumnos_uc$procedencia)))
##
## Pareto chart analysis for tabla_gs
## Frequency Cum.Freq. Percentage Cum.Percent.
## A+ 42 42 42 42
## O+ 37 79 37 79
## O- 7 86 7 86
## A- 6 92 6 92
## AB+ 3 95 3 95
## AB- 2 97 2 97
## B- 2 99 2 99
## B+ 1 100 1 100
pareto.chart(table(alumnos_uc$grupo_sanguineo))
##
## Pareto chart analysis for table(alumnos_uc$grupo_sanguineo)
## Frequency Cum.Freq. Percentage Cum.Percent.
## A+ 42 42 42 42
## O+ 37 79 37 79
## O- 7 86 7 86
## A- 6 92 6 92
## AB+ 3 95 3 95
## AB- 2 97 2 97
## B- 2 99 2 99
## B+ 1 100 1 100
pareto.chart(table(alumnos_uc$grupo_sanguineo),
plot=FALSE)
##
## Pareto chart analysis for table(alumnos_uc$grupo_sanguineo)
## Frequency Cum.Freq. Percentage Cum.Percent.
## A+ 42 42 42 42
## O+ 37 79 37 79
## O- 7 86 7 86
## A- 6 92 6 92
## AB+ 3 95 3 95
## AB- 2 97 2 97
## B- 2 99 2 99
## B+ 1 100 1 100
rm(tabla_gs)
Un gráfico de sectores es una representación circular de las frecuencias de una variable cualitativa o discreta. El círculo representa todos los valores analizados y cada porción, también llamada sector, representan la proporción de cada categoría de la variable. Aunque las frecuencias pueden aparecer en forma absoluta, el gráfico circular suele expresarse en porcentajes. Sólo es útil cuando el número de categorías es pequeño.
En R este tipo de gráfico también se realiza a partir de una tabla; esta puede haber sido creada previamente o se pueden crear también anidando, como en el caso del gráfico de barras
tabla_movil <- table(alumnos_uc$uso_movil)
Ejemplo desarrollado con argumentos opcionales
pie(tabla_movil,
main="Uso del móvil por el alumnado de la UC",
radius = 1.05, # Tamaño del gráfico entre -1 y 1 (por defecto 0.8): etiquetas grandes necesitan radios pequeños.
edges = 200, # Aproxima la linea exterior mediante un polígono (número de lados especificado).
init.angle = 95, # Ángulo inicial de las porciones
clockwise = TRUE, # TRUE el orden de las porciones se dibuja según las agujas del reloj.
labels = c("Escaso","Moderado","Intenso"), # Etiquetas de cada porción. En caso de querer que aparezca el número labels = count
cex = 1.5, # Tamaño de las etiquetas.
col = c("Green", "Yellow","red"), # Colores de relleno.
density = 50, # Densidad de las líneas de sombreado
angle = 45, # Ángulo de las líneas del sombreado.
border = "black", # Color del borde de cada porción. Para que el color sea igual al color del área border = color.
lty = 2) # Tipo de línea de los bordes del gráfico
Es muy habitual que el gráfico de sectores incluya las frecuencias relativas (porcentajes) en el gráfico. Dos opciones.
tabla_movil2 <- round(prop.table(tabla_movil) * 100, 2)
pie(tabla_movil2,
labels = paste0(tabla_movil2, "%"))
pct <- round(tabla_movil/sum(tabla_movil)*100) # Cálculo de los porcentajes
etiquetas <- paste(names(tabla_movil), pct, "%") # Añadimos los porcentajes a las etiquetas
pie(tabla_movil,
col=gray(seq(0.2, 1.0, length = 3)),
labels=etiquetas)
Para mostrar a la vez números y etiquetas
etiq <- paste0(tabla_movil, " = ", round(100 * tabla_movil/sum(tabla_movil), 2), "%")
pie(tabla_movil, labels = etiq)
📝 ****ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA CIRCULAR**::
Representa mediante diagramas circulares las variables
rama_conocimiento
y procedencia
.
Para crear el gráfico de sectores de la variable
rama_conocimiento
incluye en el gráfico
Etiquetas con porcentaje.
Colores diferentes en cada sector.
Un tamaño de las etiquetas de 1.25.
Acompaña el gráfico con una leyenda situada a la izquierda y arriba
en la que aparezcan las diferentes ramas de conocimiento, cada una con
el mismo color del sector, sin marco y con el título
Rama de conocimiento
:
tabla_rama_conocimiento <- round(prop.table(table(alumnos_uc$rama_conocimiento_let)) * 100, 2) # Conversión en porcentaje
pie(tabla_rama_conocimiento,
labels = paste0(tabla_rama_conocimiento, "%"), # Etiquetas con porcentaje
col = topo.colors(5), # Colores
cex = 1.25) # Tamaño de las etiquetas
legend("topleft",
legend = c("Arte y Humanidades", "Ciencias", "Ciencias Sociales y Jurídicas", "Ingeniería y Arquitectura", "Ciencias de la Salud"),
fill = topo.colors(5), # Colores
bty = "n", # Sin marco alrededor de la leyenda.
cex = 0.75, # Tamaño de las etiquetas de la leyenda.
title = "Rama de conocimiento")
Para crear el gráfico correspondiente a la procedencia, actúa con total libertad.
Es una variante del gráfico de sectores. Para ello es necesario
cargar el paquete plotrix, que contiene la función
pie3D()
.
#install.packages("plotrix")
library("plotrix")
library("RColorBrewer")
display.brewer.all()
En primer lugar, se crea la tabla
tabla_movil <- table(alumnos_uc$uso_movil_let)
A continuación se crea el gráfico a partir de la tabla anterior
pie3D(tabla_movil,
main="Diagrama circular en 3D", # Título del gráfico
col=brewer.pal(n = 3, name = "RdBu"), # Colores para rellenar o sombrear las porciones
labels = names(tabla_movil), # Etiquetas de las porciones
radius = 1.0, # Radio de la tarta
labelcex = 1, # Factor de expansión de las etiquetas
border = "yellow", # Color del borde de los sectores
shade = 0.3, # Sombreado del borde de los sectores
explode=0.1, # Cantidad de apertura de las porciones
height = 0.2, # Altura (grosor) del diagrama
theta = 0.8) # Ángulo de visión (radianes)
Como en el caso anterior, se pueden añadir los porcentajes, cambiar su color y tamaño etc.
lab <- paste0(round(tabla_movil/sum(tabla_movil) * 100, 2), "%")
pie3D(tabla_movil,
col = hcl.colors(length(tabla_movil), "Spectral"),
labels = lab,
labelcol = "red",
labelcex = 1.75)
rm(tabla_movil, tabla_movil2, etiquetas, pct)
Este gráfico (también conocido como gráfico de rosquilla) es otra variante del gráfico de sectores. Para construirlo se necesita el paquete lessR (https://rdrr.io/cran/lessR/man/PieChart.html; atención, en este caso no es necesario crear una tabla previa).
library(lessR)
La función que crea este gráfico de donut es
pieChart()
.
PieChart(grupo_sanguineo,
data = alumnos_uc,
main = NULL)
## >>> suggestions
## PieChart(grupo_sanguineo, hole=0) # traditional pie chart
## PieChart(grupo_sanguineo, labels="%") # display %'s on the chart
## PieChart(grupo_sanguineo) # bar chart
## Plot(grupo_sanguineo) # bubble plot
## Plot(grupo_sanguineo, labels="count") # lollipop plot
##
## --- grupo_sanguineo ---
##
## A- A+ AB- AB+ B- B+ O- O+ Total
## Frequencies: 6 42 2 3 2 1 7 37 100
## Proportions: 0.060 0.420 0.020 0.030 0.020 0.010 0.070 0.370 1.000
##
## Chi-squared test of null hypothesis of equal probabilities
## Chisq = 158.880, df = 7, p-value = 0.000
La sintaxis anteriores es equivalente a:
pc(grupo_sanguineo, data = alumnos_uc, main = NULL)
## >>> suggestions
## PieChart(grupo_sanguineo, hole=0) # traditional pie chart
## PieChart(grupo_sanguineo, labels="%") # display %'s on the chart
## PieChart(grupo_sanguineo) # bar chart
## Plot(grupo_sanguineo) # bubble plot
## Plot(grupo_sanguineo, labels="count") # lollipop plot
##
## --- grupo_sanguineo ---
##
## A- A+ AB- AB+ B- B+ O- O+ Total
## Frequencies: 6 42 2 3 2 1 7 37 100
## Proportions: 0.060 0.420 0.020 0.030 0.020 0.010 0.070 0.370 1.000
##
## Chi-squared test of null hypothesis of equal probabilities
## Chisq = 158.880, df = 7, p-value = 0.000
Es posible incluir una serie de argumentos adicionales para personalizar el gráfico
PieChart(grupo_sanguineo,
data = alumnos_uc,
fill = "viridis", # Color de los sectores mediante una paleta de colores prespecificadas (cambia a "blues" o "heat")
hole = 0.5, # Tamaño del agujero central: 0, un gráfico de sectores) a 0.99. El valor por defecto es 0.68.
color = "black", # Color de la línea del borde
lwd = 2, # Ancho de la línea del borde
lty = 1, # Tipo de línea del borde
hole_fill = "#B7E3E0", # Color del agujero central (blanco por defecto)
main = "Gráfico de dónut", # Título
labels_size = 1.2, # Tamaño de las etiquetas con los valores (%).
labels_color = "black")
## >>> suggestions
## PieChart(grupo_sanguineo, hole=0) # traditional pie chart
## PieChart(grupo_sanguineo, labels="%") # display %'s on the chart
## PieChart(grupo_sanguineo) # bar chart
## Plot(grupo_sanguineo) # bubble plot
## Plot(grupo_sanguineo, labels="count") # lollipop plot
##
## --- grupo_sanguineo ---
##
## A- A+ AB- AB+ B- B+ O- O+ Total
## Frequencies: 6 42 2 3 2 1 7 37 100
## Proportions: 0.060 0.420 0.020 0.030 0.020 0.010 0.070 0.370 1.000
##
## Chi-squared test of null hypothesis of equal probabilities
## Chisq = 158.880, df = 7, p-value = 0.000
También se puede crear una paleta de colores especial. Esta paleta debe ser de la misma longitud que el número de porciones.
col <- hcl.colors(length(unique(alumnos_uc$grupo_sanguineo)), "Zissou 1")
PieChart(grupo_sanguineo,
data = alumnos_uc,
fill = col,
main = NULL)
## >>> suggestions
## PieChart(grupo_sanguineo, hole=0) # traditional pie chart
## PieChart(grupo_sanguineo, labels="%") # display %'s on the chart
## PieChart(grupo_sanguineo) # bar chart
## Plot(grupo_sanguineo) # bubble plot
## Plot(grupo_sanguineo, labels="count") # lollipop plot
##
## --- grupo_sanguineo ---
##
## A- A+ AB- AB+ B- B+ O- O+ Total
## Frequencies: 6 42 2 3 2 1 7 37 100
## Proportions: 0.060 0.420 0.020 0.030 0.020 0.010 0.070 0.370 1.000
##
## Chi-squared test of null hypothesis of equal probabilities
## Chisq = 158.880, df = 7, p-value = 0.000
El argumento values
se usa para:
Mantener los valores originales.
Eliminar los valores del gráfico.
Transformarlos en proporciones.
También puedes usar los argumentos values_size
,
values_digits
, values_color
y
values_position
para personalizarlos.
PieChart(grupo_sanguineo,
data = alumnos_uc,
fill = "viridis",
main = NULL,
color = "black",
lwd = 1.5,
values_color = c(rep("white", 4), 1), # Personalización de los valores
values_size = 0.85)
## >>> suggestions
## PieChart(grupo_sanguineo, hole=0) # traditional pie chart
## PieChart(grupo_sanguineo, labels="%") # display %'s on the chart
## PieChart(grupo_sanguineo) # bar chart
## Plot(grupo_sanguineo) # bubble plot
## Plot(grupo_sanguineo, labels="count") # lollipop plot
##
## --- grupo_sanguineo ---
##
## A- A+ AB- AB+ B- B+ O- O+ Total
## Frequencies: 6 42 2 3 2 1 7 37 100
## Proportions: 0.060 0.420 0.020 0.030 0.020 0.010 0.070 0.370 1.000
##
## Chi-squared test of null hypothesis of equal probabilities
## Chisq = 158.880, df = 7, p-value = 0.000
Argumento rows: crea un subconjunto de los datos.
PieChart(grupo_sanguineo,
data = alumnos_uc,
rows = (procedencia == "Bahía" & genero == "Masculino"),
main = NULL)
## Rows of data before filtering: 100
## Rows of data after filtering: 15
## >>> suggestions
## PieChart(grupo_sanguineo, hole=0) # traditional pie chart
## PieChart(grupo_sanguineo, labels="%") # display %'s on the chart
## PieChart(grupo_sanguineo) # bar chart
## Plot(grupo_sanguineo) # bubble plot
## Plot(grupo_sanguineo, labels="count") # lollipop plot
##
## --- grupo_sanguineo ---
##
## A- A+ AB- AB+ B- B+ O- O+ Total
## Frequencies: 0 6 1 2 0 0 0 6 15
## Proportions: 0.000 0.400 0.067 0.133 0.000 0.000 0.000 0.400 1.000
##
## Chi-squared test of null hypothesis of equal probabilities
## Chisq = 26.067, df = 7, p-value = 0.000
## >>> Low cell expected frequencies, so chi-squared approximation may not be accurate
##
📝 ****ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE DONUT**::
Utiliza las variables uso de móvil
y
procedencia
para crear un diagrama 3D y un diagrama de
dónut para. Comp<ra ambos gráficos con el diagrama de sectores
clásico. ¿Se gana legilibilidad en los diagramas más complicados?.
tabla_movil <- table(alumnos_uc$uso_movil_let)
pie3D(tabla_movil,
main="Diagrama circular en 3D", # Título del gráfico
col=brewer.pal(n = 3, name = "RdBu"), # Colores para rellenar o sombrear las porciones
labels = names(tabla_movil), # Etiquetas de las porciones
radius = 1.0, # Radio de la tarta
labelcex = 1, # Factor de expansión de las etiquetas
border = "yellow", # Color del borde de los sectores
shade = 0.3, # Sombreado del borde de los sectores
explode=0.1, # Cantidad de apertura de las porciones
height = 0.2, # Altura (grosor) del diagrama
theta = 0.8) # Ángulo de visión (radianes)
PieChart(grupo_sanguineo,
data = alumnos_uc,
fill = "viridis", # Color de los sectores mediante una paleta de colores prespecificadas (cambia a "blues" o "heat")
hole = 0.5, # Tamaño del agujero central: 0, un gráfico de sectores) a 0.99. El valor por defecto es 0.68.
color = "black", # Color de la línea del borde
lwd = 2, # Ancho de la línea del borde
lty = 1, # Tipo de línea del borde
hole_fill = "#B7E3E0", # Color del agujero central (blanco por defecto)
main = "Gráfico de dónut", # Título
labels_size = 1.2, # Tamaño de las etiquetas con los valores (%).
labels_color = "black")