Lección 15 de 29•Módulo 3: Visualización de Datos
15. Mejores Prácticas de Visualización
Principios de diseño, color, storytelling y accesibilidad
15 minutos
Aprende principios de diseño, uso de color, storytelling y accesibilidad para crear visualizaciones profesionales.
Principios de diseño
1. Simplicidad
import matplotlib.pyplot as plt
import seaborn as sns
# ❌ Mal: Demasiado complejo
plt.figure(figsize=(12, 8))
plt.plot(data, color='red', linestyle='--', marker='o', markersize=10, linewidth=3)
plt.plot(data2, color='blue', linestyle='-.', marker='s', markersize=10, linewidth=3)
plt.plot(data3, color='green', linestyle=':', marker='^', markersize=10, linewidth=3)
plt.grid(True, which='both', linestyle='--', linewidth=0.5, color='gray')
plt.title('VENTAS MENSUALES POR REGIÓN Y PRODUCTO', fontsize=20)
# ✅ Bien: Simple y claro
plt.figure(figsize=(10, 6))
plt.plot(meses, ventas, marker='o', linewidth=2, color='steelblue')
plt.title('Ventas Mensuales 2024', fontsize=14)
plt.xlabel('Mes')
plt.ylabel('Ventas ($)')
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
2. Jerarquía visual
plt.figure(figsize=(12, 6))
plt.plot(ventas, linewidth=3, color='#2E86AB', label='Ventas Reales', zorder=3)
plt.plot(objetivo, linewidth=1.5, color='gray', linestyle='--', label='Objetivo', alpha=0.7, zorder=2)
plt.fill_between(range(len(ventas)), ventas, objetivo, alpha=0.1, color='green', zorder=1)
plt.title('Ventas vs Objetivo - Q1 2024', fontsize=16, fontweight='bold', pad=20)
plt.legend(fontsize=11, frameon=False)
plt.tight_layout()
plt.show()
Uso de color
Paletas recomendadas
# Categorías: Usar colores distintos
colores_categoricos = ['#E63946', '#F1FAEE', '#A8DADC', '#457B9D', '#1D3557']
# Secuencial: Para magnitudes (de bajo a alto)
import matplotlib.cm as cm
cmap_secuencial = cm.Blues
# Divergente: Para datos con punto medio
cmap_divergente = cm.RdYlGn
# Accesibilidad: Paletas color-blind friendly
sns.set_palette("colorblind")
Ejemplo con paletas
# Ventas por categoría (paleta categórica)
fig, ax = plt.subplots(figsize=(10, 6))
categorias = ['Electrónica', 'Ropa', 'Alimentos', 'Hogar']
ventas_cat = [120000, 95000, 75000, 60000]
colores = ['#264653', '#2A9D8F', '#E9C46A', '#F4A261']
ax.barh(categorias, ventas_cat, color=colores)
ax.set_title('Ventas por Categoría', fontsize=14, fontweight='bold')
ax.set_xlabel('Ventas ($)')
plt.tight_layout()
plt.show()
# Heatmap con paleta secuencial
correlation_matrix = df.corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='Blues', center=0)
plt.title('Matriz de Correlación')
plt.show()
Storytelling con datos
Estructura de una historia
# Historia: "Las ventas crecieron 40% en Q2 gracias a la región Norte"
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# 1. Contexto: Tendencia general
axes[0].plot(meses, ventas, marker='o', linewidth=2, color='steelblue')
axes[0].set_title('1. Las ventas muestran crecimiento', fontsize=12, fontweight='bold')
axes[0].set_ylabel('Ventas ($)')
# 2. Insight principal: Destacar Q2
q2_meses = meses[3:6]
q2_ventas = ventas[3:6]
axes[1].bar(meses, ventas, color='lightgray', alpha=0.5)
axes[1].bar(q2_meses, q2_ventas, color='#E63946')
axes[1].set_title('2. Q2 supera expectativas (+40%)', fontsize=12, fontweight='bold')
axes[1].set_ylabel('Ventas ($)')
# 3. Acción: Por qué (desglose por región)
regiones = ['Norte', 'Sur', 'Este', 'Oeste']
contrib = [45, 20, 20, 15]
colores_region = ['#E63946', '#457B9D', '#457B9D', '#457B9D']
axes[2].pie(contrib, labels=regiones, autopct='%1.0f%%', colors=colores_region,
startangle=90, textprops={'fontsize': 10})
axes[2].set_title('3. Región Norte lidera crecimiento', fontsize=12, fontweight='bold')
plt.tight_layout()
plt.savefig('storytelling_ventas.png', dpi=300)
plt.show()
Accesibilidad
# 1. Usar patrones además de colores
fig, ax = plt.subplots(figsize=(10, 6))
x = range(5)
y1 = [10, 15, 13, 17, 20]
y2 = [12, 18, 14, 19, 22]
ax.bar([i - 0.2 for i in x], y1, width=0.4, label='Producto A',
color='#457B9D', edgecolor='black', linewidth=1.5)
ax.bar([i + 0.2 for i in x], y2, width=0.4, label='Producto B',
color='#E63946', edgecolor='black', linewidth=1.5, hatch='//')
ax.legend()
ax.set_title('Ventas Comparativas (Accesible)')
plt.show()
# 2. Alto contraste
fig, ax = plt.subplots(figsize=(10, 6), facecolor='white')
ax.plot(meses, ventas, linewidth=3, color='#000000', marker='o', markersize=8)
ax.set_title('Ventas 2024', fontsize=16, color='#000000')
ax.set_xlabel('Mes', fontsize=12, color='#000000')
ax.set_ylabel('Ventas ($)', fontsize=12, color='#000000')
ax.grid(alpha=0.2, color='#666666')
plt.show()
Checklist de visualización profesional
"""
✅ ANTES DE COMPARTIR TU VISUALIZACIÓN:
1. ¿Es clara la historia/mensaje principal?
2. ¿Los ejes tienen etiquetas descriptivas?
3. ¿El título explica qué se está mostrando?
4. ¿La leyenda es necesaria y comprensible?
5. ¿Los colores son accesibles (color-blind friendly)?
6. ¿Hay demasiados elementos visuales?
7. ¿Los números están formateados correctamente?
8. ¿La resolución es adecuada para el medio (pantalla/impresión)?
9. ¿Se puede entender sin contexto adicional?
10. ¿Has eliminado elementos innecesarios (chartjunk)?
"""
Resumen de la lección
✅ Simplicidad: Menos es más, elimina elementos innecesarios ✅ Color: Usa paletas apropiadas (categóricas, secuenciales, divergentes) ✅ Storytelling: Contexto → Insight → Acción ✅ Accesibilidad: Alto contraste, patrones, color-blind friendly ✅ Jerarquía: Destaca lo importante, reduce énfasis en lo secundario
🎯 Próxima lección: 16. Proyecto: Dashboard de Social Listening
En la siguiente lección crearás tu primer proyecto integrador completo. 🚀
¿Completaste esta lección?
Marca esta lección como completada. Tu progreso se guardará en tu navegador.