Ejercicio 49: Creación de Figuras Científicas de Publicación con Matplotlib
Este ejercicio tiene como objetivo que los estudiantes generen gráficos de calidad para papers científicos en disciplinas como física, matemáticas o ingeniería. Se trabajará con la ley de Zipf, representándola en una escala log-log, asegurando que la figura cumpla con estándares de publicación en revistas científicas.
Objetivos
- Obtener datos que sigan la ley de Zipf a partir de un corpus de texto.
- Generar un gráfico en escala log-log con Matplotlib.
- Optimizar la figura para que sea adecuada para una publicación científica.
- Incluir una leyenda, etiquetas, formato en blanco y negro, y seguir buenas prácticas en visualización científica.
- Escribir un caption claro y preciso para la figura.
Parte A: Construcción del Dataset (Ley de Zipf en Texto)
Se analizará la distribución de frecuencia de palabras en un texto para verificar la ley de Zipf.
Tareas
- Utilizar
nltk.corpus.gutenberg
para obtener un corpus de texto. - Contar la frecuencia de aparición de cada palabra en el texto.
- Ordenar las palabras por frecuencia y asignarles un rango (posición en el ranking de palabras más comunes).
- Graficar Frecuencia vs. Rango en escala log-log.
Código Base
import nltk
from collections import Counter
import numpy as np
import matplotlib.pyplot as plt
# Descargar corpus de Gutenberg si no está disponible
nltk.download('gutenberg')
from nltk.corpus import gutenberg
# Elegir un texto (Ejemplo: 'Moby Dick')
words = gutenberg.words('melville-moby_dick.txt')
# Contar la frecuencia de cada palabra (ignorando mayúsculas y puntuación)
word_counts = Counter([word.lower() for word in words if word.isalpha()])
# Ordenar por frecuencia
sorted_counts = sorted(word_counts.values(), reverse=True)
# Crear datos de rango y frecuencia
ranks = np.arange(1, len(sorted_counts) + 1)
frequencies = np.array(sorted_counts)
Parte B: Creación de una Figura Científica de Calidad
Se generará un gráfico de alta calidad en escala log-log, siguiendo estándares de publicación científica.
Tareas
- Generar un gráfico log-log con una línea de referencia.
- Aplicar buenas prácticas en visualización científica.
- Optimizar el diseño en blanco y negro.
- Incluir etiquetas de ejes, título, leyenda y un caption adecuado.
- Guardar la figura en formato adecuado para publicaciones científicas.
Código Base
plt.figure(figsize=(6, 4)) # Tamaño adecuado para una publicación
# Gráfico en escala log-log
plt.loglog(ranks, frequencies, marker='o', linestyle='none', markersize=3, color='black', label="Datos de Zipf")
# Línea de referencia (esperado teóricamente)
alpha = 1.0
zipf_ref = frequencies[0] * (ranks / ranks[0]) ** -alpha
plt.loglog(ranks, zipf_ref, linestyle='dashed', color='gray', label=r"$\propto x^{-1}$")
# Etiquetas de ejes y título
plt.xlabel("Rango de la palabra", fontsize=12)
plt.ylabel("Frecuencia", fontsize=12)
plt.title("Distribución de Frecuencia de Palabras (Ley de Zipf)", fontsize=14)
# Ajuste de ticks en log-log
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
# Grid sutil en fondo blanco y negro
plt.grid(True, which="both", linestyle="--", linewidth=0.5, color='gray', alpha=0.7)
# Leyenda en ubicación óptima
plt.legend(frameon=False, fontsize=10)
# Guardar en formato adecuado para papers
plt.savefig("zipf_distribution.pdf", bbox_inches="tight", dpi=300)
plt.show()
Parte C: Requisitos para la Figura Científica
La figura debe cumplir con los estándares de publicación en revistas científicas.
Tareas
Tamaño y formato adecuados:
- La figura debe tener un tamaño de 6x4 pulgadas (ideal para artículos).
- Guardar en formato PDF o EPS para garantizar calidad vectorial.
Line Art y Estilo en Blanco y Negro:
- No usar colores (debe ser completamente en escala de grises o negro).
- Evitar líneas muy finas (< 0.1 mm).
- Usar fuentes tipo sans-serif (Arial o Helvetica) de 8-12 pt.
Ejes y Leyenda:
- Etiquetas de ejes claras y consistentes.
- Leyenda sin fondo, con símbolos bien diferenciados.
Grid y Anotaciones:
- Líneas de referencia sutiles, no invasivas.
- Anotaciones claras y bien alineadas.
Caption Científico:
- Escribir una leyenda explicativa para la figura siguiendo los estándares de revistas científicas.
Ejemplo de Caption
Fig. 1 Distribución de frecuencia de palabras en el corpus "Moby Dick" en escala log-log. Se observa que la frecuencia de las palabras sigue una ley de Zipf con un exponente cercano a -1, lo que sugiere una relación de potencia inversa entre el rango y la frecuencia de aparición. La línea punteada indica la relación teórica esperada para un exponente de -1.
Entrega esperada
- Código en Python bien estructurado y documentado utilizando Matplotlib y NLTK.
- Un gráfico en escala log-log optimizado para papers científicos.
- Un caption bien redactado siguiendo normas de publicación.
- Reflexión sobre cómo mejorar la visualización de datos en ciencia.