Lección 15 de 29Mó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.