Visualización Pro: Del EDA al Storytelling
19 Conceptos para dejar de hacer gráficos y empezar a comunicar datos.
Fase 1: Fundamentos
1. La Mentira de la Escala
En datos reales (salarios, tiempos), la mayoría se agrupa abajo y los extremos rompen la escala visual. Un histograma normal no sirve.
trip_duration. Se verá horrible. Aplica plt.xscale('log') para ver la verdad oculta.
sns.histplot(data=df, x='duration')
plt.xscale('log') # La clave mágica
Fase 1: Fundamentos
2. Orden Significativo
El orden alfabético no aporta valor. El orden debe contar una historia (de mayor a menor impacto).
order = df['day'].value_counts().index sns.countplot(..., order=order)
Fase 1: Fundamentos
3. Anatomía de una Figura
Deja de usar plt.plot(). Usa la interfaz orientada a objetos para control total.
ax.
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(x, y)
ax.set_title("Título Controlado")
El Lienzo Completo] --> Axes[Objeto AXES
El Gráfico en sí] Axes --> XAxis[Eje X] Axes --> YAxis[Eje Y] Axes --> Title[Título] Axes --> Legend[Leyenda] style Figure fill:#003366,color:white style Axes fill:#FFCC00,color:black
Fase 1: Fundamentos
4. Títulos Activos
Un título no debe describir los ejes ("Ventas por Año"). Debe dar la conclusión ("Las Ventas Cayeron").
❌ Ventas por Trimestre
✅ El tráfico decae un 40% los Domingos
Fase 2: Big Data
5. El Desastre del Sólido
Con 1.4M de puntos, un scatter plot normal es una mancha de tinta inútil.
alpha=0.05 y s=1. Verás patrones ocultos.
plt.scatter(x, y, alpha=0.05, s=1)
Fase 2: Big Data
6. Hexbins (Densidad)
Cuando hay demasiados puntos, visualiza la densidad, no los individuos.
sns.jointplot(kind="hex"). Crea un mapa de calor hexagonal.
Fase 2: Big Data
7. Mapas sin Mapas
Podemos usar latitud y longitud como ejes X/Y para recrear la ciudad sin librerías complejas.
Fase 3: Relaciones
8. Heatmaps Temporales
La mejor forma de ver patrones cíclicos (Hora vs Día de Semana).
sns.heatmap. ¿Cuál es la peor hora del Viernes?
Fase 3: Relaciones
9. Small Multiples
No metas 5 líneas en un gráfico. Haz 5 gráficos pequeños comparables (FacetGrid).
col='vendor_id' en Seaborn para separar histogramas y comparar proveedores.
Fase 3: Relaciones
10. Boxplots y Violines
Comparar medias es peligroso. Hay que ver la dispersión y los outliers.
distance_km por passenger_count. ¿Grupos grandes viajan más lejos?
sns.boxplot(x='passengers', y='dist')
Fase 4: Estética
11. Menos es Más
Elimina bordes, fondos grises y líneas innecesarias. El dato es el rey.
sns.despine() para quitar bordes superiores y derechos. Limpia tu gráfico.
Fase 4: Estética
12. Color con Significado
No uses arcoíris aleatorios. Usa colores para indicar intensidad o categorías semánticas.
Fase 4: Estética
13. Anotaciones Directas
Las leyendas externas distraen. Señala lo importante directamente en el gráfico.
ax.annotate() para señalar el mínimo del Domingo con una flecha.
ax.annotate("Mínimo", xy=(x, y), xytext=(...))
Fase 4: Estética
14. Exportación HQ
Las capturas de pantalla son para amateurs. Guarda con DPI alto para reportes impresos.
plt.savefig('plot.png', dpi=300, bbox_inches='tight').
Default (72 DPI)
300 DPI (Nítido)
Fase 5: Capstone
15. Setup del Reporte PDF
Automatización total: Python generando PDFs sin intervención humana.
FPDF, agrega página y título centrado "Reporte de Movilidad".
from fpdf import FPDF
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", "B", 16)
Fase 5: Capstone
16. Generador de Assets
Crea funciones que generen y guarden imágenes temporales, no que las muestren en pantalla.
def generar_grafico(df): ... plt.savefig('temp.png') plt.close()
Fase 5: Capstone
17. Datos Tabulares
Los DataFrames no se pegan solos. Conviértelos a strings o listas formateadas.
Fase 5: Capstone
18. Integración Final
Ensambla el rompecabezas. Inserta la imagen generada en el PDF.
pdf.image('temp.png', w=190) para colocar el gráfico bajo el título.
Fase 5: Capstone
19. Narrativa Dinámica
El reporte debe "leer" los datos. Usa f-strings para insertar métricas calculadas en el texto.
f"Analizamos {total} viajes...".
total = df.shape[0]
pdf.multi_cell(0, 10, f"Total: {total}")
¡Módulo 1 Completado!
Has dominado Python, Pandas y Visualización Pro.