Integración perfecta con ggplot2 para gráficos estáticos
Gráficos interactivos con plotly y DT
Workflows optimizados data.table → visualización
Dashboards dinámicos con tablas interactivas
Técnicas avanzadas de presentación de datos
11.1 Integración con ggplot2: Gráficos Estáticos Profesionales
11.1.1 1. El Workflow Fundamental: data.table → ggplot2
La filosofía es clara: hacer toda la manipulación pesada de datos con data.table y pasar el resultado final limpio a ggplot2.
# PASO 1: Preparación con data.table (rápido y eficiente)ventas_mensuales <- ventas_detalladas[, .(revenue_total =sum(revenue),unidades_vendidas =sum(cantidad),ticket_promedio =round(mean(revenue), 2),num_transacciones = .N,satisfaccion_media =round(mean(satisfaccion_cliente), 2) ), by = .(año, mes)][, `:=`(fecha_mes =as.Date(paste(año, mes, "01", sep ="-")),crecimiento = (revenue_total / data.table::shift(revenue_total, 1) -1) *100)]# PASO 2: Visualización con ggplot2 (hermoso y profesional)p1 <-ggplot(ventas_mensuales, aes(x = fecha_mes, y = revenue_total)) +geom_line(color ="#2E8B57", size =1.3, alpha =0.8) +geom_point(color ="#2E8B57", size =3, alpha =0.9) +geom_smooth(method ="loess", se =TRUE, color ="#FF6B35", alpha =0.3) +scale_y_continuous(labels =dollar_format(prefix ="$", suffix ="K", scale =1e-3),expand =expansion(mult =c(0.02, 0.1)) ) +scale_x_date(date_labels ="%b %Y", date_breaks ="3 months",expand =expansion(mult =c(0.02, 0.02)) ) +labs(title ="Evolución del Revenue Mensual",subtitle ="Tendencia de ventas con línea de regresión suavizada",x =NULL,y ="Revenue Total",caption ="Datos procesados con data.table | Visualización: ggplot2" ) +theme_minimal(base_size =12) +theme(plot.title =element_text(color ="#2E8B57", size =16, face ="bold", hjust =0),plot.subtitle =element_text(color ="gray40", size =12, hjust =0),axis.text.x =element_text(angle =45, hjust =1),panel.grid.minor =element_blank(),plot.caption =element_text(color ="gray50", size =9) )print(p1)
11.1.2 2. Gráficos Multidimensionales Avanzados
# Análisis complejo con múltiples dimensionesanalisis_completo <- ventas_detalladas[, .(revenue_total =sum(revenue),margen_promedio =round(mean(1- descuento), 3),satisfaccion_media =round(mean(satisfaccion_cliente), 2),variacion_precios =sd(precio_final) /mean(precio_final),dias_activos =uniqueN(fecha) ), by = .(region, producto, año)][, `:=`(revenue_per_dia = revenue_total / dias_activos,categoria_revenue =cut(revenue_total, breaks =quantile(revenue_total, c(0, 0.33, 0.66, 1)),labels =c("Bajo", "Medio", "Alto"),include.lowest =TRUE))]# Gráfico de burbujas multivariablep2 <-ggplot(analisis_completo, aes(x = margen_promedio, y = satisfaccion_media)) +geom_point(aes(size = revenue_total, color = region, shape =factor(año)), alpha =0.7, stroke =1) +geom_text(aes(label = producto), vjust =-1.2, hjust =0.5, size =2.5, color ="gray30") +scale_size_continuous(name ="Revenue Total", labels =dollar_format(prefix ="$", suffix ="K", scale =1e-3),range =c(3, 15),guide =guide_legend(override.aes =list(alpha =1)) ) +scale_color_brewer(name ="Región", type ="qual", palette ="Set2" ) +scale_shape_manual(name ="Año",values =c(16, 17),guide =guide_legend(override.aes =list(size =5)) ) +scale_x_continuous(labels =percent_format(),expand =expansion(mult =c(0.05, 0.05)) ) +labs(title ="Análisis Multidimensional: Performance por Región y Producto",subtitle ="Margen vs Satisfacción vs Revenue | Tamaño = Revenue, Color = Región, Forma = Año",x ="Margen Promedio",y ="Satisfacción Media del Cliente",caption ="Cada punto representa una combinación región-producto-año" ) +theme_minimal(base_size =11) +theme(plot.title =element_text(color ="#2E8B57", size =15, face ="bold"),plot.subtitle =element_text(color ="gray40", size =11),legend.position ="bottom",legend.box ="horizontal",panel.grid.minor =element_blank() ) +guides(color =guide_legend(title.position ="top", title.hjust =0.5),size =guide_legend(title.position ="top", title.hjust =0.5),shape =guide_legend(title.position ="top", title.hjust =0.5) )print(p2)
11.1.3 3. Series Temporales con Múltiples Métricas
# Preparar datos para series temporales múltiplesseries_temporales <- datos_temporales[, .(cpu_promedio =round(mean(cpu_usage), 1),memory_promedio =round(mean(memory_usage), 1),response_time_p95 =round(quantile(response_time, 0.95), 0),error_total =sum(error_count),load_promedio =round(mean(load_score), 1) ), by = .(fecha, hora)][, timestamp :=as.POSIXct(paste(fecha, sprintf("%02d:00:00", hora)))]# Transformar a formato largo para ggplotseries_largo <-melt(series_temporales, id.vars =c("timestamp", "fecha", "hora"),measure.vars =c("cpu_promedio", "memory_promedio", "load_promedio"),variable.name ="metrica",value.name ="valor")# Mapear nombres más descriptivosseries_largo[, metrica_clean :=fcase( metrica =="cpu_promedio", "CPU Usage (%)", metrica =="memory_promedio", "Memory Usage (%)", metrica =="load_promedio", "Load Score",default =as.character(metrica))]# Gráfico de series temporales múltiplesp3 <-ggplot(series_largo[fecha >=as.Date("2024-01-01") & fecha <=as.Date("2024-01-07")], aes(x = timestamp, y = valor, color = metrica_clean)) +geom_line(size =0.8, alpha =0.8) +geom_smooth(method ="loess", se =FALSE, size =1.2, alpha =0.9) +scale_color_viridis_d(name ="Métrica", option ="plasma", end =0.8) +scale_x_datetime(date_labels ="%d %b\n%H:%M",date_breaks ="12 hours" ) +scale_y_continuous(expand =expansion(mult =c(0.02, 0.1)) ) +labs(title ="Monitoreo de Sistema - Primera Semana de Enero 2024",subtitle ="Tendencias de CPU, Memoria y Load Score con líneas de regresión suavizada",x ="Timestamp",y ="Valor",caption ="Datos agregados por hora | Líneas suavizadas con método LOESS" ) +theme_minimal(base_size =11) +theme(plot.title =element_text(color ="#2E8B57", size =14, face ="bold"),plot.subtitle =element_text(color ="gray40", size =11),axis.text.x =element_text(angle =45, hjust =1),legend.position ="bottom",panel.grid.minor.x =element_blank(),strip.text =element_text(size =10, face ="bold") ) +facet_wrap(~ metrica_clean, scales ="free_y", ncol =1)print(p3)
11.1.4 4. Heatmaps y Visualizaciones de Correlación
# Preparar matriz de correlación usando data.tablecorrelacion_por_region <- ventas_detalladas[, .(precio_promedio =mean(precio_final),revenue_promedio =mean(revenue),satisfaccion_promedio =mean(satisfaccion_cliente),descuento_promedio =mean(descuento),cantidad_promedio =mean(cantidad) ), by = .(region, producto)]# Crear heatmap de performance por región-productoheatmap_data <- correlacion_por_region[, .( region, producto,revenue_normalizado =scale(revenue_promedio)[,1],satisfaccion_normalizada =scale(satisfaccion_promedio)[,1],eficiencia = (scale(revenue_promedio)[,1] +scale(satisfaccion_promedio)[,1]) /2)]p4 <-ggplot(heatmap_data, aes(x = region, y = producto, fill = eficiencia)) +geom_tile(color ="white", size =0.3) +geom_text(aes(label =round(eficiencia, 2)), color =ifelse(heatmap_data$eficiencia >0, "white", "black"),size =3.5, fontface ="bold") +scale_fill_gradient2(name ="Índice de\nEficiencia",low ="#d73027", mid ="#f7f7f7", high ="#1a9850",midpoint =0,guide =guide_colorbar(title.position ="top", title.hjust =0.5) ) +labs(title ="Mapa de Calor: Eficiencia por Región y Producto",subtitle ="Índice combinado de Revenue y Satisfacción del Cliente (valores estandarizados)",x ="Región",y ="Producto",caption ="Verde = Alta eficiencia, Rojo = Baja eficiencia" ) +theme_minimal(base_size =11) +theme(plot.title =element_text(color ="#2E8B57", size =14, face ="bold"),plot.subtitle =element_text(color ="gray40", size =11),axis.text.x =element_text(angle =45, hjust =1),axis.text.y =element_text(size =10),legend.position ="right",panel.grid =element_blank() )print(p4)
11.2 Gráficos Interactivos con Plotly
11.2.1 1. Conversión de ggplot2 a Plotly
# Crear gráfico base con ggplot2datos_interactivos <- ventas_detalladas[, .(revenue_diario =sum(revenue),unidades =sum(cantidad),transacciones = .N,satisfaccion_avg =round(mean(satisfaccion_cliente), 2),productos_unicos =uniqueN(producto) ), by = .(fecha, region)]# Gráfico base para conversióngrafico_base <-ggplot(datos_interactivos[fecha >=as.Date("2024-01-01") & fecha <=as.Date("2024-03-31")], aes(x = fecha, y = revenue_diario, color = region)) +geom_line(alpha =0.8, size =1) +geom_point(aes(size = transacciones, text =paste("Fecha:", fecha,"<br>Región:", region,"<br>Revenue:", scales::dollar(revenue_diario),"<br>Transacciones:", transacciones,"<br>Satisfacción:", satisfaccion_avg)),alpha =0.7) +scale_color_brewer(type ="qual", palette ="Set2") +scale_size_continuous(range =c(2, 8)) +labs(title ="Revenue Diario por Región (Interactivo)",x ="Fecha",y ="Revenue Diario",color ="Región",size ="Transacciones" ) +theme_minimal() %>%suppressWarnings()# Convertir a plotlyif(requireNamespace("plotly", quietly =TRUE)) { grafico_interactivo <- plotly::ggplotly(grafico_base, tooltip ="text") %>% plotly::layout(title =list(text ="Revenue Diario por Región<br><sub>Hover para detalles | Click en leyenda para filtrar</sub>"),hovermode ="closest" ) grafico_interactivo} else { grafico_basecat("💡 Instala 'plotly' para ver la versión interactiva: install.packages('plotly')\n")}
11.2.2 2. Gráficos 3D y Superficies
if(requireNamespace("plotly", quietly =TRUE)) {# Preparar datos para superficie 3D superficie_data <- ventas_detalladas[año ==2024, .(revenue_total =sum(revenue),satisfaccion_media =mean(satisfaccion_cliente),margen_promedio =mean(1- descuento) ), by = .(mes, region) ]# Crear matriz para la superficie matriz_revenue <-dcast(superficie_data, mes ~ region, value.var ="revenue_total", fill =0) matriz_vals <-as.matrix(matriz_revenue[, -1])# Gráfico 3D p3d <- plotly::plot_ly(z = matriz_vals,x =colnames(matriz_vals),y = matriz_revenue$mes,type ="surface",colorscale ="Viridis" ) %>% plotly::layout(title ="Superficie 3D: Revenue por Mes y Región",scene =list(xaxis =list(title ="Región"),yaxis =list(title ="Mes"),zaxis =list(title ="Revenue") ) ) p3d} else {cat("💡 Instala 'plotly' para ver gráficos 3D interactivos\n")}
11.5 Próximo Capítulo: Aplicaciones del Mundo Real
En el siguiente capítulo exploraremos: - Aplicaciones Shiny para dashboards dinámicos - Integración con tidymodels para machine learning - Conexión con bases de datos y herramientas Big Data - Casos de uso industriales reales
🎯 Puntos Clave de Este Capítulo
data.table + ggplot2 = Combinación perfecta para análisis visual profesional
Plotly añade interactividad sin sacrificar la estética de ggplot2
DT transforma tablas estáticas en dashboards interactivos potentes
El workflow óptimo: Procesar con data.table → Visualizar con ggplot2/plotly/DT
Sparklines y formato avanzado elevan las tablas a herramientas de análisis
Los dashboards integrados combinan múltiples visualizaciones para insights completos
Has dominado la visualización de datos con data.table. En el próximo capítulo veremos cómo construir aplicaciones completas del mundo real.