PyNarrative: una excelente biblioteca de Python para contar historias con datos

Imagina que hay dos personas, A y B. A ambas les das el mismo conjunto de datos para analizar. Sin embargo, la presentación de A resulta mucho más clara e interesante que la de B.

¿Por qué? Porque no solo importa tener los datos: también importa cómo los cuentas. Y seamos honestos: muchos desarrolladores tenemos dificultades con esa parte. Somos lógicos, directos… pero el arte de contar historias no siempre es nuestro fuerte.

Existen muchas bibliotecas conocidas para visualizar datos, como Matplotlib, Seaborn o Altair. Pero la mayoría están pensadas para el análisis técnico, no para la narrativa.

Aquí es donde entra en juego PyNarrative, una nueva biblioteca de Python que facilita muchísimo la creación de historias visuales. Permite añadir subtítulos, resaltar puntos clave y guiar a la audiencia a través de los datos, haciendo que tus informes o dashboards realmente conecten con quien los lee.

En este artículo te mostraré cómo empezar con PyNarrative: instalación, cómo construir narrativas, y algunos recursos útiles al final.

Primeros pasos con PyNarrative

Instalación e importaciones

Primero necesitas tener Python 3.7 o superior y algunas bibliotecas comunes. Abre tu terminal y ejecuta:

pip install pynarrative pandas altair

Esto instalará PyNarrative junto con Pandas y Altair, sus dependencias. También puedes usar un entorno virtual para mantenerlo todo organizado. Luego, importa las siguientes bibliotecas:

import pandas as pd
import pynarrative as pn
import altair as alt  # Opcional para personalizar gráficos

¿Cómo usar PyNarrative para construir una historia?

PyNarrative tiene una clase llamada Story que se encarga de envolver un gráfico de Altair. El flujo básico es el siguiente:

  1. Crear la historia: pasa tu DataFrame a pn.Story y define el gráfico con métodos como .mark_line() y .encode().
  2. Añadir narrativa: usa métodos como .add_title(), .add_context(), .add_annotation() y .add_next_steps() para agregar texto explicativo.
  3. Renderizar: llama a .render() para mostrar el gráfico completo con narrativa.

Ejemplo básico

Supón que tienes un DataFrame con columnas Year y Value:

chart = (pn.Story(df, width=600, height=400)
           .mark_line(color='steelblue')
           .encode(x='Year:O', y='Value:Q')
           .add_title("Tendencia anual", "2000-2020", title_color="#333")
           .add_context("Los valores han aumentado con el tiempo", position='top')
           .render())
chart

¿Qué hace cada parte?

  • .add_title(): agrega un título principal y un subtítulo.
  • .add_context(): añade un comentario contextual al gráfico.
  • .render(): muestra el gráfico con los elementos narrativos.

También puedes usar .add_annotation() para señalar puntos específicos y .add_next_steps() para sugerencias de acción.


Primer ejemplo: datos de COVID-19

covid_df = pd.DataFrame({
    'Month': ['Ene', 'Feb', 'Mar', 'Abr', 'May'],
    'Cases': [1000, 3000, 7000, 5000, 2000]
})

covid_story = (pn.Story(covid_df)
                 .mark_line(color='firebrick')
                 .encode(x='Month:O', y='Cases:Q')
                 .add_title("Casos de COVID-19 a lo largo del tiempo", "Tendencia mensual", title_color="#b22222")
                 .add_context("Los casos alcanzaron su pico en marzo y descendieron en abril/mayo", position='top')
                 .add_annotation('Mar', 7000, "Pico en marzo", arrow_color='gray', label_color='black')
                 .render())
covid_story

Este gráfico muestra claramente cómo los casos subieron y luego cayeron. La anotación en marzo dirige la atención al punto crítico del gráfico. Sin PyNarrative, habrías necesitado calcular coordenadas manuales y escribir muchas más líneas.

Segundo ejemplo: tasas de desempleo

unemp_df = pd.DataFrame({
    'Year': [2018, 2019, 2020, 2021, 2022],
    'UnemploymentRate': [4.5, 3.9, 8.1, 6.2, 5.3]
})

unemp_story = (pn.Story(unemp_df, width=600)
                 .mark_bar(color='teal')
                 .encode(x='Year:O', y='UnemploymentRate:Q')
                 .add_title("Tasa de desempleo estatal", "2018-2022", title_color="#333")
                 .add_context("Aumento brusco en 2020 debido a la pandemia", position='top')
                 .add_annotation(2020, 8.1, "Impacto de la pandemia", arrow_color='red', label_color='darkred')
                 .render())
unemp_story

Aquí usamos un gráfico de barras para mostrar cómo la pandemia afectó el empleo. La anotación en 2020 lo hace evidente, incluso para quienes no conocen los datos.


Conclusión

PyNarrative es ideal si quieres presentar datos de forma que tu audiencia entienda el “por qué”, no solo el “qué”. Puedes usarlo para informes, dashboards interactivos o presentaciones internas.

Para seguir explorando:

Con un poco de práctica, estarás contando historias que tus datos merecen.

Vistas: 1