Gráfica de Barras en R

¿Qué se debe tener en cuenta?

  • un propósito, si tiene claro que quiere decir con el gráfico es más fácil escogerlo.

  • el tipo de variable a grafica debe ser CUALITATIVA o Tabulada desde una CONTINUA

  • Revisar si requiere crear una tabla resumen, dependera de lo que quiere mostrar

  • Las librerias son esenciales para facilitarse la vida. Algunas de ellas

library(tidyverse)  # carga un conjunto de librerias necesarias, entre ellas dplyr, ggplot2

si bien todas ayudan, para este documento solo utilizaré GGPLOT2 para no hacer un documento tan extenso.

Construcción

  • Carguemos un dataset.

pueden encontrar el archivo de datos en el siguiente link: https://github.com/cjimenezgallardo/DATASETS/blob/main/datos_empleados.xlsx

Los datos corresponden Sueldo percibidos en una empresa, y que como variable, se tienen:

dataej<-datos_empleados
names(dataej)
##  [1] "ID"             "Sexo"           "FechaNAc"       "educacion"     
##  [5] "labor"          "Sueldo_actual"  "Sueldo_inicial" "antigüedad"    
##  [9] "experiencia"    "minoria"

Lo primero

CONSEJO: realice un bosquejo manual, que le permita entender que quiere mostrar, para que luego lo contrareste con lo que aparecio en R

Objetivo, mostrar cuantos estan en cada labor

ggplot(data = dataej,aes(x=labor))+
  geom_bar() 

ggplot(data=dataej,aes(x=labor))+
  geom_bar(fill="#8c4966",alpha=0.4,
           color=2)+
  ggtitle("Distribucion por Labor")+
  xlab("tipo de trabajo")+
  ylab("frecuencia")

ggplot(data=dataej,aes(x=labor))+
  geom_bar(position="dodge",
           fill="#8c4966",alpha=0.4,
           color=2)+
  ggtitle("Distribucion de los trabajadores por Labor")+
  xlab("tipo de trabajo")+
  ylab("frecuencia")+
  geom_text(aes(label=..count..), # coloca rotulos de las barras
            stat = "count",
            position=position_dodge(0.9), # corrige la posicion del numero
            vjust=-.5)+
  ylim(c(0,400))

ggplot(data=dataej,aes(x=labor))+
  geom_bar(position="dodge",
           fill="#8c4966",alpha=0.4,
           color=2)+
  xlab("tipo de trabajo")+
  scale_fill_manual(values = c("red","blue", "green"))+
  ylab("frecuencia")+
  geom_text(aes(label=..count..), # coloca rotulos de las barras
            stat = "count",
            position=position_dodge(0.9), # corrige la posicion del numero
            vjust=-.5)+
  ylim(c(0,400))+
  facet_wrap(~"Distribucion de trabajadores por Labor")     

Tambien se puede obtener, generardo una Tabla, en mi percepción permite un MAYOR CONTROL

# generando tabla resumen

tabla01 <- dataej %>% 
  group_by(labor) %>% 
  summarise(Total=n())

# Graficando

ggplot(tabla01, aes(x=labor,y=Total,fill=as.factor(labor)))+
  geom_bar(stat="identity",
           width=0.5,
           position = position_dodge())+
  facet_wrap(~"Distribucion de trabajadores por Labor")+
  ylab("frecuencia")+
  xlab("tipo de trabajo")+
  scale_x_continuous(breaks = c(1,2,3),labels=c("Adm","Op","Ej"))+ # o scale_x_discrete si es texto
  geom_text(aes(label=Total),
            position=position_dodge(0.9), # corrige la posicion del numero
            vjust=-.5)+
  ylim(c(0,400))

Mostrar en Porcentaje

# generando tabla resumen

tabla01 <- dataej %>% 
  group_by(labor) %>% 
  summarise(Total=n()) %>% 
  mutate(porc=Total/sum(Total)*100)

# Graficando

ggplot(tabla01, aes(x=labor,y=porc,fill=as.factor(labor)))+
  geom_bar(stat="identity",
           width=0.5,
           position = position_dodge())+
  facet_wrap(~"Distribucion de trabajadores por Labor")+
  ylab("Porcentaje")+
  xlab("tipo de trabajo")+
  scale_x_continuous(breaks = c(1,2,3),labels=c("Adm","Op","Ej"))+ # o scale_x_discrete si es texto
  geom_text(aes(label=round(porc,2)),
            position=position_dodge(0.9), # corrige la posicion del numero
            vjust=-.5)+
  ylim(c(0,100))

En lo personal, cuando son pocos grupos (3 en este caso e idealmente un numero en el cual se vean claramente cada grupo) prefiero hacerlo circular

que pasa si el Proposito es PROMEDIO de sueldo por labor

# generando tabla resumen

tabla_prom <- dataej %>% 
  group_by(labor) %>% 
  summarise(Prom =mean(Sueldo_actual)) 
  

# Graficando

ggplot(tabla_prom, aes(x=labor,y=Prom ,fill=as.factor(labor)))+
  geom_bar(stat="identity",
           width=0.5)+
  facet_wrap(~"Promedio Sueldo por Labor")+
  ylab("Porcentaje")+
  xlab("tipo de trabajo")+
  scale_x_continuous(breaks = c(1,2,3),labels=c("Adm","Op","Ej"))+ # o scale_x_discrete si es texto
  geom_text(aes(label=round(Prom,2)),
            vjust=-.5)

Graficar para comparar.

Se puede comparar en funcion de Frecuencia u ottro proceso (promedio, mediana, sd_error, etc).

# Graficando

ggplot(dataej, aes(x=as.factor(labor) ,fill=Sexo))+
  geom_bar(position="dodge",
           colour="blue",
           width=1)+
  facet_wrap(~"Distribucion de personas por cargo según sexo")+
  ylab("Frecuencia")+
  xlab("tipo de trabajo")+
  scale_x_discrete(breaks = c(1,2,3),labels=c("Adm","Op","Ej"))+ # o scale_x_discrete si es texto
  geom_text(aes(label=..count..), stat = "count",
            position=position_dodge(0.9),
            vjust=-.5)

# Graficando

ggplot(dataej, aes(x= Sexo ,fill=as.factor(labor)))+
  geom_bar(position="dodge",
           colour="blue")+
  facet_wrap(~"Distribucion de personas por sexo del cargo")+
  ylab("Frecuencia")+
  xlab("Sexo")+
   geom_text(aes(label=..count..), stat = "count",
            position=position_dodge(0.9),
            vjust=-.5)

en porcentaje

# tabla

tabla02 <- dataej %>% 
  group_by(Sexo,labor) %>% 
  summarise(Total=n()) %>%  #obtiene totales
  mutate(Porcentaje=Total/sum(Total)*100) %>% #calcula porcentaje
  arrange(Sexo) #ordena
## `summarise()` has grouped output by 'Sexo'. You can override using the
## `.groups` argument.
# Graficando

ggplot(tabla02, aes(x=Sexo ,y=Porcentaje, fill=as.factor(labor)))+
  geom_bar(stat="identity", position = "dodge")+
  ylim(0,130)+
  geom_text(aes(label=paste0(round(Porcentaje,2), "%")),
            vjust=-0.9, 
            color="black", 
            hjust=0.5,
            # define text position and size
            position = position_dodge(0.9),  
            angle=0, 
            size=4.0
            )+
 facet_wrap(~"Distribucion de personas por sexo del cargo")+
  ylab("Porcentaje")+
  xlab("Sexo")

como promedio

# tabla

tabla03 <- dataej %>% 
  group_by(Sexo,labor) %>% 
  summarise(Promedio=mean(Sueldo_actual)) %>%  #obtiene totales
  arrange(Sexo) #ordena
## `summarise()` has grouped output by 'Sexo'. You can override using the
## `.groups` argument.
# Graficando

ggplot(tabla03, aes(x=Sexo ,y=Promedio, fill=as.factor(labor)))+
  geom_bar(stat="identity", position = "dodge")+
  scale_fill_manual(values=c("blue","orange","green"))+
  ylim(0,100000)+
  geom_text(aes(label=round(Promedio,2)),
            vjust=-0.9, 
            color="black", 
            hjust=0.5,
            # define text position and size
            position = position_dodge(0.9),  
            angle=0, 
            size=3.0
            )+
 facet_wrap(~"Ingreso promedio por sexo en el cargo")+
  ylab("Porcentaje")+
  xlab("Sexo")