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

  1. Obtener datos que sigan la ley de Zipf a partir de un corpus de texto.
  2. Generar un gráfico en escala log-log con Matplotlib.
  3. Optimizar la figura para que sea adecuada para una publicación científica.
  4. Incluir una leyenda, etiquetas, formato en blanco y negro, y seguir buenas prácticas en visualización científica.
  5. 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

  1. Utilizar nltk.corpus.gutenberg para obtener un corpus de texto.
  2. Contar la frecuencia de aparición de cada palabra en el texto.
  3. Ordenar las palabras por frecuencia y asignarles un rango (posición en el ranking de palabras más comunes).
  4. 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

  1. Generar un gráfico log-log con una línea de referencia.
  2. Aplicar buenas prácticas en visualización científica.
  3. Optimizar el diseño en blanco y negro.
  4. Incluir etiquetas de ejes, título, leyenda y un caption adecuado.
  5. 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

  1. 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.
  2. 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.
  3. Ejes y Leyenda:

    • Etiquetas de ejes claras y consistentes.
    • Leyenda sin fondo, con símbolos bien diferenciados.
  4. Grid y Anotaciones:

    • Líneas de referencia sutiles, no invasivas.
    • Anotaciones claras y bien alineadas.
  5. 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.