---
title: "Analisis de Utilidad y Márgenes"
author:
- "Denalyn Saray Aguilar Garcia, "
- " Sofia Torres Mendoza"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
source_code: embed
---
```{r setup, include=FALSE}
#Importación de librerias
library(flexdashboard) #Creación del dashboard
library(ggplot2) #Visualización de gráficos
library(dplyr) #Manipulación de datos como filtrado, seleccion, agrupación, entre otros
library(tidyverse) #Conjunto de paquetes que inclute dplyr, ggplot2, etc
library(ggrepel) #Añadir etiquetas a los gráficos de ggplot2
library(treemapify) #Para hacer gráficos tipo treemap
library(maps) #Usar mapas básicos y proporciona datos geográficos y funciones para graficarlas
library(countrycode) #Convertir nombres y códigos de países
library(knitr) #Mostrar resultados en documentos y generar documentos dinámicos
library(kableExtra) #Mejorar el estilo de tablas
library(rnaturalearth) #Usar mapas del mundo detallados y acceder a datos geográficos del Natural Earth
library(sf) #Trabajar con datos espaciales (mapas)
library(leaflet) #Hacer mapas interactivos
library(RColorBrewer) #Usar paletas de colores
library(grid) #Detalles gráficos avanzados
library(png) #Uso de imagenes en el dashboard
library(readxl) #Leer archivos de excel
library(scales) # Para formatear porcentajes
library(plotly) #Para crear gráficos interactivos
library(tibble) #Para crear el diccionario de países
```
```{r}
#Cargar y preparar los datos del dataset
Appol_Datos <- read_excel("Appol Datos.xlsx", sheet = "Tabla Datos") #Leer el dataset y leer la hoja "Tabla Datos"
Appol_Datos_Productos <- read_excel("Appol Datos.xlsx", sheet = "Tabla Productos") #Leer el dataset y leer la hoja "Tabla Productos"
Appol_Datos <- Appol_Datos %>%
mutate( Utilidad = Ingresos - Gastos) #Crear nueva columna: Utilidad = Ingresos - Gastos
Appol_Datos <- Appol_Datos %>%
mutate( Margen = Utilidad/Ingresos) #Crear nueva columna: Margen = Utilidad / Ingresos
Appol_Datos <- Appol_Datos %>%
#Separar la columna Region en "codigo_pais" y "resto"
separate(Region, into = c("codigo_pais", "resto"), sep = " - ") %>%
#Luego separar "resto" en continente y pais
separate(resto, into = c("continente", "pais"), sep = "/")
Appol_Datos <- Appol_Datos %>%
separate(Periodo, into = c("trimestre", "año"), sep = " ") #Separar periodo en trimestre y año y se hagan las columnas
```
## Column {data-width="650"}
### Utilidad
```{r}
#Creación de la primera tarjeta de utilidad
img <- readPNG("imageapple.png") #Cargar imagen PNG
img_grob <- rasterGrob(img, interpolate = TRUE) #Convertir imagen a objeto gráfico compatible con ggplot
#Cálculo de utilidad
total_utilidad <- sum(Appol_Datos$Utilidad, na.rm = TRUE) #Sumar la columna Utilidad
utilidad_millones <- format(round(total_utilidad / 1e6, 2), decimal.mark = ",", big.mark = ".") #Convertir a millones y dar formato
texto_utilidad <- paste(utilidad_millones, "mill.") #Se agrega al texto
#Crear la tarjeta visual con la imagen
ggplot() +
annotation_custom(img_grob, xmin = 0.8, xmax = 1.2, ymin = 1.3, ymax = 1.7) + #Mostrar imagen y ajustar el tamaño
annotate("text", x = 1, y = 1.15, label = texto_utilidad, size = 16, fontface = "bold") + # Mostrar texto de utilidad
annotate("text", x = 1, y = 0.8, label = "UTILIDAD", size = 10, color = "gray40") + #Mostrar etiqueta "UTILIDAD"
# Ajustar límite del eje X y el eje Y
xlim(0, 2) +
ylim(0, 2)+
theme_void() +
theme(
plot.background = element_rect(fill = "white", color = "gray80", size = 1), #Estilo del fondo de la tarjeta
plot.margin = margin(15, 15, 15, 15, unit = "pt") #Margenes del grafico
)
```
### Margen de Utilidad
```{r}
#Creación de la segunda tarjeta del margen de utilidad
img <- readPNG("imageapple.png") #Cargar imagen PNG
img_grob <- rasterGrob(img, interpolate = TRUE) #Convertir imagen a objeto gráfico compatible con ggplot
#Calcula el margen total como utilidad total / ingresos totales
Appol_summary <- Appol_Datos %>%
summarise(MargenTotal = sum(Utilidad, na.rm = TRUE) / sum(Ingresos, na.rm = TRUE))
#Extrae el valor del margen calculado
margen_total <- Appol_summary$MargenTotal
#Crear la tarjeta visual con la imagen
ggplot() +
annotation_custom(img_grob, xmin = 0.8, xmax = 1.2, ymin = 1.3, ymax = 1.7) + #Mostrar imagen y ajustar el tamaño
# Mostrar el porcentaje el margen con 2 decimales
annotate("text", x = 1, y = 1.15, label =percent(margen_total, accuracy = 0.01), size = 16, fontface = "bold") +
annotate("text", x = 1, y = 0.8, label = "MARGEN", size = 10, color = "gray40") + #Mostrar etiqueta "MARGEN"
# Ajustar límite del eje X y el eje Y
xlim(0, 2) +
ylim(0, 2)+
theme_void() +
theme(
plot.background = element_rect(fill = "white", color = "gray80", size = 1), #Estilo del fondo de la tarjeta
plot.margin = margin(15, 15, 15, 15, unit = "pt") #Margenes del grafico
)
```
### Tabla de Utilidad Pais-Margen
```{r}
#Tabla de utilidad de Pais-Margen
#Crear y ordenar la tabla
tabla_pais <- Appol_Datos %>%
group_by(pais) %>%
summarise(
Utilidad = sum(Utilidad, na.rm = TRUE), #Suma total de utilidad por pais
Ingresos = sum(Ingresos, na.rm = TRUE) #Suma total de ingresos por pais
) %>%
mutate(
Margen = round((Utilidad / Ingresos) * 100, 2) #Se calcula el margen (%) con 2 decimales
) %>%
arrange(desc(Utilidad)) %>% #Ordena de mayor a menor según utilidad (Forma descendiente)
select(Pais = pais, Utilidad, Margen) #Renombra columna "pais" a "Pais" y selecciona columnas
# Agregar una fila con los totales
total_fila <- tibble(
Pais = "Total", #Se define el nombre de la fila como "Total"
Utilidad = sum(tabla_pais$Utilidad, na.rm = TRUE), #Se calcula la suma total de la utilidad de todos los países
#Fórmula del margen total: (Utilidad total / Ingresos totales) * 100
Margen = round((sum(tabla_pais$Utilidad, na.rm = TRUE) / sum(Appol_Datos$Ingresos, na.rm = TRUE)) * 100, 2)
)
# Unir la fila total a la tabla
tabla_pais_final <- bind_rows(tabla_pais, total_fila)
#Mostrar tabla con estilo
tabla_pais_final %>%
kable("html", align = "c") %>% #Convierte la tabla a HTML y centra el contenido
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), #Agrega estilo visual
full_width = F, #La tabla no ocupa todo el ancho
position = "center") %>% #Centra la tabla en la página
row_spec(0, bold = TRUE, color = "white", background = "#4B0082") %>% #Estilo de la fila del encabezado
row_spec(nrow(tabla_pais_final), bold = TRUE, color = "white", background = "#4B0082") #Estilo de la fila "Total"
```
## Column {data-width="650"}
### M.Utilidad Por Año, Trimestre y Continente
```{r}
#Creación de la grafica de M.Utilidad por Año, Trimestre y Continente
# Paleta de colores personalizada
colores_continentes <- c(
"América" = "#1f77b4", #Azul
"Asia" = "#08306b", #Azul oscuro
"Europa" = "#e6550d", #Naranja
"África" = "#6a3d9a", #Morado
"Oceanía" = "#e377c2" #Rosado
)
#1. Crear etiqueta combinada con "T" y salto de línea para el año
Appol_Datos <- Appol_Datos %>%
mutate(trimestre_limpio = str_replace(trimestre, "Q", ""), #Elimina la Q del trimestre (por ejemplo, Q1 -> 1)
eje_x = paste0("T", trimestre_limpio, "\n", año)) #Crea una nueva variable para el eje X con un formato y combina trimestre y año
#2. Agrupar por esa nueva variable y continente
df_resumen <- Appol_Datos %>%
group_by(eje_x, continente) %>% #Agrupa los datos por la nueva etiqueta eje_x y por continente
summarise(UtilidadTotal = sum(Utilidad, na.rm = TRUE), .groups = "drop") # Calcula la suma total de utilidad por grupo y elimina los atributos de agrupación después del resumen
#3. Asegurar orden correcto en el eje X
df_resumen$eje_x <- factor(df_resumen$eje_x, #Convierte eje_x en factor
levels = unique(Appol_Datos[order(Appol_Datos$año, Appol_Datos$trimestre), ]$eje_x)) #Define el orden basado en año y trimestre
#4. Gráfico de líneas con colores personalizados
ggplot(df_resumen, aes(x = eje_x, y = UtilidadTotal, color = continente, group = continente)) +
geom_line(size = 1.2) + # Dibuja líneas entre puntos por continente, con un respectivo grosor de línea
geom_point(size = 2) + # Agrega puntos en cada observación con el respectivo tamaño
labs(x = "Trimestre", #Etiqueta del eje X
y = "Suma de Utilidad") + #Etiqueta del eje Y
theme_minimal() + #Usa un tema limpio y simple
theme(
axis.text.x = element_text(size = 10) #Ajusta el tamaño del texto en el eje X
) +
scale_color_manual(values = colores_continentes) #Aplica la paleta de colores definida por continente
```
### Utilidad por Pais y Continente
```{r}
#Creación del mpapa de utilidad por pais y continente
#Crear un diccionario de traducciones Español -> Inglés
diccionario_paises <- tibble::tibble(
pais = c("Afganistán", "Albania", "Alemania", "Andorra", "Angola", "Antigua y Barbuda", "Arabia Saudita", "Argelia", "Armenia", "Australia", "Austria", "Azerbaiyán",
"Bahamas", "Bangladés", "Barbados", "Baréin", "Bélgica", "Belice", "Benín", "Bielorrusia", "Birmania", "Botsuana", "Brasil", "Brunéi", "Bulgaria",
"Burkina Faso", "Burundi", "Bután", "Cabo Verde", "Camboya", "Camerún", "Canadá", "Chad", "Chile", "China", "Chipre", "Colombia", "Comoras",
"Congo", "Congo, República Democrática del", "Corea del Norte", "Corea del Sur", "Costa Rica", "Costa de Marfil", "Croacia", "Cuba", "Curazao", "Chipre", "Chequia", "Dinamarca", "Dominica", "Ecuador",
"Egipto", "El Salvador", "Emiratos Árabes Unidos", "Eritrea", "Eslovaquia", "Eslovenia", "España", "Estados Unidos", "Estonia", "Etiopía", "Fiyi", "Filipinas", "Finlandia",
"Francia", "Gabón", "Gambia", "Gana", "Georgia", "Ghana", "Granada", "Grecia", "Groenlandia", "Guatemala", "Guinea", "Guinea Ecuatorial", "Guinea-Bisáu", "Guyana", "Haití",
"Honduras", "Hungría", "India", "Indonesia", "Irak", "Irán", "Irlanda", "Islandia", "Islas Marshall", "Islas Salomón", "Islas Caimán", "Israel", "Italia",
"Jamaica", "Japón", "Jordania", "Kazajistán", "Kenia", "Kirguistán", "Kiribati", "Kosovo", "Kuwait", "Laos", "Lesoto", "Letonia", "Líbano", "Liberia",
"Libia", "Liechtenstein", "Lituania", "Luxemburgo", "Macedonia del Norte", "Madagascar", "Malasia", "Malawi", "Maldivas", "Malí", "Malta", "Marruecos", "Mauricio",
"Mauritania", "México", "Micronesia", "Moldavia", "Mónaco", "Mongolia", "Montenegro", "Mozambique", "Namibia", "Naurú", "Nepal", "Nicaragua",
"Níger", "Nigeria", "Noruega", "Nueva Zelanda", "Omán", "Países Bajos", "Pakistán", "Palau", "Palestina", "Panamá", "Papúa Nueva Guinea", "Paraguay", "Perú",
"Polonia", "Portugal", "Qatar", "Reino Unido", "República Centroafricana", "República Checa", "República Dominicana", "Ruanda", "Rumanía", "Rusia", "Samoa", "San Cristóbal y Nieves",
"San Marino", "San Vicente y las Granadinas", "Santa Lucía", "Santo Tomé y Príncipe", "Senegal", "Serbia", "Seychelles", "Sierra Leona",
"Singapur", "Siria", "Somalia", "Sri Lanka", "Sudáfrica", "Sudán", "Sudán del Sur", "Suecia", "Suiza", "Surinam", "Tailandia", "Taiwán", "Tanzania",
"Tayikistán", "Timor Oriental", "Togo", "Tonga", "Trinidad y Tobago", "Túnez", "Turkmenistán", "Turquía", "Tuvalu", "Ucrania", "Uganda", "Uruguay",
"Uzbekistán", "Vanuatu", "Vaticano", "Venezuela", "Vietnam", "Yemen", "Yibuti", "Zambia", "Zimbabue"),
pais_ingles = c("Afghanistan", "Albania", "Germany", "Andorra", "Angola", "Antigua and Barbuda", "Saudi Arabia", "Algeria", "Armenia", "Australia", "Austria", "Azerbaijan",
"Bahamas", "Bangladesh", "Barbados", "Bahrain", "Belgium", "Belize", "Benin", "Belarus", "Myanmar", "Botswana", "Brazil", "Brunei", "Bulgaria",
"Burkina Faso", "Burundi", "Bhutan", "Cape Verde", "Cambodia", "Cameroon", "Canada", "Chad", "Chile", "China", "Cyprus", "Colombia", "Comoros",
"Congo", "Democratic Republic of the Congo", "North Korea", "South Korea", "Costa Rica", "Ivory Coast", "Croatia", "Cuba", "Curacao", "Cyprus", "Czech Republic", "Denmark", "Dominica", "Ecuador",
"Egypt", "El Salvador", "United Arab Emirates", "Eritrea", "Slovakia", "Slovenia", "Spain", "United States", "Estonia", "Ethiopia", "Fiji", "Philippines", "Finland",
"France", "Gabon", "Gambia", "Ghana", "Georgia", "Ghana", "Grenada", "Greece", "Greenland", "Guatemala", "Guinea", "Equatorial Guinea", "Guinea-Bissau", "Guyana", "Haiti",
"Honduras", "Hungary", "India", "Indonesia", "Iraq", "Iran", "Ireland", "Iceland", "Marshall Islands", "Solomon Islands", "Cayman Islands", "Israel", "Italy",
"Jamaica", "Japan", "Jordan", "Kazakhstan", "Kenya", "Kyrgyzstan", "Kiribati", "Kosovo", "Kuwait", "Laos", "Lesotho", "Latvia", "Lebanon", "Liberia",
"Libya", "Liechtenstein", "Lithuania", "Luxembourg", "North Macedonia", "Madagascar", "Malaysia", "Malawi", "Maldives", "Mali", "Malta", "Morocco", "Mauritius",
"Mauritania", "Mexico", "Micronesia", "Moldova", "Monaco", "Mongolia", "Montenegro", "Mozambique", "Namibia", "Nauru", "Nepal", "Nicaragua",
"Niger", "Nigeria", "Norway", "New Zealand", "Oman", "Netherlands", "Pakistan", "Palau", "Palestine", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Poland",
"Portugal", "Qatar", "United Kingdom", "Central African Republic", "Czech Republic", "Dominican Republic", "Rwanda", "Romania", "Russia", "Samoa", "Saint Kitts and Nevis",
"San Marino", "Saint Vincent and the Grenadines", "Saint Lucia", "São Tomé and Príncipe", "Senegal", "Serbia", "Seychelles", "Sierra Leone",
"Singapore", "Syria", "Somalia", "Sri Lanka", "South Africa", "Sudan", "South Sudan", "Sweden", "Switzerland", "Suriname", "Thailand", "Taiwan", "Tanzania",
"Tajikistan", "Timor-Leste", "Togo", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkmenistan", "Turkey", "Tuvalu", "Ukraine", "Uganda", "Uruguay",
"Uzbekistan", "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Yemen", "Djibouti", "Zambia", "Zimbabwe")
)
# Colores por continente y paleta de colores
colores_continentes <- c(
"América" = "#1f77b4", #Azul
"Asia" = "#08306b", #Azul oscuro
"Europa" = "#e6550d", #Naranja
"África" = "#6a3d9a", #Morado
"Oceanía" = "#e377c2" #Rosado
)
# Agrupar los datos
df_mapa <- Appol_Datos %>%
group_by(pais, continente) %>%
summarise(UtilidadTotal = sum(Utilidad, na.rm = TRUE), .groups = "drop")
# Unir con la tabla de traducción
df_mapa <- df_mapa %>%
left_join(diccionario_paises, by = "pais")
# Crear el gráfico
fig <- plot_ly(
data = df_mapa,
type = 'scattergeo',
locationmode = 'country names',
locations = ~pais_ingles,
text = ~paste("País:", pais, "<br>Continente:", continente, "<br>Utilidad:", round(UtilidadTotal, 2)),
marker = list(
size = ~log1p(UtilidadTotal) * 1.5,
line = list(width = 0.5, color = 'black'),
opacity = 0.8
),
color = ~continente,
colors = colores_continentes
)
fig <- fig %>% layout(
autosize = TRUE,
height = 400, # Altura
margin = list(l = 0, r = 0, t = 0, b = 0), # Márgenes del mapa
geo = list(
showframe = FALSE,
showcoastlines = TRUE,
projection = list(type = 'miller'),
resolution = 50,
landcolor = "rgb(230, 230, 230)",
oceancolor = "rgb(222, 240, 247)",
showland = TRUE,
showocean = TRUE,
lakecolor = "rgb(222, 240, 247)",
showlakes = TRUE,
bgcolor = 'rgb(150, 150, 150)', # Fondo gris más oscuro
showcountries = TRUE,
countrycolor = "rgb(200, 200, 200)",
coastlinecolor = "rgb(190, 190, 190)",
lataxis = list(showgrid = TRUE, gridcolor = 'rgb(210, 210, 210)'),
lonaxis = list(showgrid = TRUE, gridcolor = 'rgb(210, 210, 210)')
),
legend = list(
title = list(text = 'Continentes'),
orientation = "h",
x = 0, #Orientación en el eje x de la sección de continentes
y = 1.1 #Orientación en el eje y de la sección de continentes
)
)
# Agrega nombres de los continentes
fig <- fig %>% add_annotations(
x = c(-50, -60, 80, 15, 130),
y = c(40, -20, 30, 45, -25),
text = c("AMERICA DEL NORTE", "AMERICA DEL SUR", "ASIA", "EUROPA", "OCEANÍA", "AFRICA"),
showarrow = FALSE,
font = list(size = 4, color = c("#1f77b4", "#1f77b4", "#08306b", "#e6550d", "#E77BC0", "#6a3d9a")),
xanchor = 'center',
yanchor = 'top'
)
# Agrega nombres de los océanos con color y tamaño reducido
fig <- fig %>% add_annotations(
x = c(-40, 70, 180),
y = c(20, -20, 0),
text = c("Océano Atlántico", "Océano Índico", "Océano Pacífico"),
showarrow = FALSE,
font = list(size = 8, color = "navy", opacity = 0.7),
xanchor = 'center',
yanchor = 'top'
)
fig
```
## Column {data-width="650"}
### Utilidad por Continente
```{r}
#Creación de la grafica circular de utilidad por continente
#Agrupar utilidad por continente
utilidad_continente <- Appol_Datos %>%
group_by(continente) %>% #Agrupa los datos según el continente
summarise(Utilidad = sum(Utilidad, na.rm = TRUE)) %>% #Suma total de la columna Utilidad por continente
mutate(Percent = Utilidad / sum(Utilidad), #Calcula el porcentaje que representa cada continente del total
Label = paste0(continente, "\n", percent(Percent))) #Crea una etiqueta con nombre y porcentaje para cada continente
#Paleta de colores
colores_continentes <- c(
"América" = "#1f77b4", #Azul
"Asia" = "#08306b", #Azul oscuro
"Europa" = "#e6550d", #Naranja
"África" = "#6a3d9a", #Morado
"Oceanía" = "#e377c2" #Rosado
)
#Crear un gráfico de dona
ggplot(utilidad_continente, aes(x = 2, y = Utilidad, fill = continente)) +
geom_col(width = 1, color = "white") + #Dibuja las barras como sectores circulares con borde blanco
coord_polar(theta = "y") + #Convierte las barras en un gráfico circular
xlim(0.5, 2.5) + #Limita el eje X para crear el efecto de hueco en el centro
geom_text(aes(label = percent(Percent)), #Añade etiquetas con el porcentaje dentro de cada sector
position = position_stack(vjust = 0.5), #Centra verticalmente las etiquetas dentro de cada sector
color = "white", size = 4) + #Define color blanco y tamaño del texto
theme_void() + #Quita ejes, texto, y fondos para un estilo limpio
theme(legend.title = element_blank()) + #Elimina el título de la leyenda
scale_fill_manual(values = colores_continentes) #Aplicar los colores
```
### Utilidad por Categoria Producto
```{r}
#Creación del treemap que representa la utilidad total de cada tipo de producto
#Agrupar por Tipo Producto y sumar la utilidad
df_producto <- Appol_Datos %>%
group_by(`Tipo Producto`) %>% #Agrupa los datos por la columna "Tipo Producto"
summarise(UtilidadTotal = sum(Utilidad, na.rm = TRUE)) #Calcula la suma total de utilidad por tipo de producto
#Mapeo de colores
colores_productos <- c(
"PC" = "#1E90FF", #Azul claro
"Aplicaciones" = "#E66A29", #Naranja
"Celulares" = "#73006E", #Purpura oscuro
"Musica" = "#00008B", #Azul oscuro
"TV" = "#EB4AB1", #Rosado
"Tablets" = "#7956D5", #Morado
"Accesorios" = "#DBB400" #Amarillo dorado
)
#Crear el treemap
ggplot(df_producto, aes(
area = UtilidadTotal, #El tamaño de cada rectángulo es proporcional a la utilidad total
fill = `Tipo Producto`, #El color de cada área depende del tipo de producto
label = `Tipo Producto` #Se muestra el nombre del producto como etiqueta
)) +
geom_treemap() + #Crea el gráfico de tipo treemap
geom_treemap_text( #Añade etiquetas de texto dentro de los rectángulos
colour = "white", #Color del texto
place = "center", #Ubicación del texto dentro del rectangulo
grow = TRUE, #Ajusta el tamaño del texto al espacio disponible
reflow = TRUE, #Permite que el texto se divida en varias líneas si es necesario
size = 0.5 #Escala base del tamaño del texto
) +
scale_fill_manual(values = colores_productos) + #Aplica los colores definidos manualmente a cada producto
theme(legend.position = "none") #Oculta la leyenda para que no se repitan los nombres ya mostrados en el gráfico
```
### Utilidad por Tipo Producto
```{r}
#Creación del treemap de utilida total por categoria de producto
#1. Unir las dos tablas por Tipo Producto
df_categoria <- Appol_Datos %>%
left_join(Appol_Datos_Productos, by = "Tipo Producto") #Une la tabla principal con la tabla de productos por la columna "Tipo Producto"
#2. Agrupar por Categoria Producto y calcular la utilidad total
df_categoria_utilidad <- df_categoria %>%
group_by(`Categoria Producto`) %>% #Agrupa los datos por categoría de producto
summarise(UtilidadTotal = sum(Utilidad, na.rm = TRUE)) #Calcula la suma total de utilidad por cada categoría
#Asignar colores si solo tenés dos categorías
colores_categoria <- c(
"Digital" = "#00008B", #Azul oscuro
"Dispositivos" = "#1E90FF" #Azul claro
)
#Creación el treemap
ggplot(df_categoria_utilidad, aes(
area = UtilidadTotal, #Define el tamaño de cada área según la utilidad
fill = `Categoria Producto`, #Rellena cada rectángulo según la categoría
label = `Categoria Producto` #Etiqueta con el nombre de la categoría
)) +
geom_treemap() + #Dibujo del treemap
geom_treemap_text( #Agrega texto dentro de los rectángulos
colour = "white", #Texto en blanco
place = "centre", #Centrado dentro del área
grow = TRUE, #Ajusta el tamaño del texto para llenar el espacio disponible
reflow = TRUE, #Permite que el texto se divida en múltiples líneas si es necesario
size = 16 #Tamaño base del texto
) +
scale_fill_manual(values = colores_categoria) + #Aplica los colores personalizados definidos arriba
theme(legend.position = "none") #Oculta la leyenda, ya que las etiquetas en el gráfico la hacen innecesaria
```