Python tiene una multitud de paquetes de visualización, los tres más conocidos son: Matplotlib (y nacido en el mar), Con argumentoy Diagrama de flujo hvCada uno de estos 3 paquetes tiene sus puntos fuertes, pero es necesario pagar un coste inicial para aprender a utilizar el paquete, a veces bastante sustancial.
La idea de este artículo me surgió cuando descubrí la Mapa mental de los métodos de Pandas ofrecido por el Boletín informativo sobre ciencia de datos y dosis diaria (un boletín que recomiendo mucho). Al mismo tiempo, estaba descubriendo el paquete de visualización Hvplot. Pensé que la idea de cambiar de un backend de visualización a otro tan fácilmente como con Hvplot era brillante (aquí es un ejemplo para cambiar de Hvplot a Plotly desde Hvplot). Al ver que también podríamos hacerlo con pandas, encontré la idea demasiado interesante como para no compartirla.
Pandas es el núcleo de la ciencia de datos en Python y todos sabemos cómo utilizarlo. Pero Matplotlib integrado en Pandas está envejeciendo y otros paquetes lo están superando tanto en facilidad de uso como en presentación. La potencia del backend de visualización de Pandas le permite aprovechar los últimos paquetes de visualización para la exploración de datos y la representación de resultados, sin tener que invertir tiempo en aprender estos paquetes, que, no obstante, son superpoderosos.
Pandas se creó en dos paquetes: Numpy y Matplotlib. Esto explica por qué usamos scripts de Matplotlib para generar gráficos y, por lo tanto, los gráficos generados son gráficos de Matplotlib.
Desde su creación, Pandas ha evolucionado y ofrece al usuario la posibilidad de modificar el backend de visualización utilizado por Pandas.
Los 6 backends disponibles que encontré durante mi investigación son:
- Trama nueve (ggplot2)
- Con argumento
- Altair
- Holovistas
- Diagrama de flujo hv
- Pandas_bokeh
- Matplotlib (backend predeterminado)
Hay varios métodos disponibles para cambiar un backend:
pd.set_option("plotting.backend", '<name of backend>')
# OR
pd.options.plotting.backend = '<name of backend>'
df.plot(backend='<name of backend>', x='...')
Nota: Cambiar el backend requiere Pandas >= 0.25 y, a veces, requiere que dependencias específicas sean importantes, como con Hvplot a continuación.
A continuación se muestran dos ejemplos:
import pandas as pd # Basic packagespd.options.plotting.backend = "plotly"
df = pd.DataFrame(dict(a=[1,3,2], b=[3,2,1]))
fig = df.plot()
fig.show()
import numpy as np
import pandas as pd # Basic packagesimport hvplot
import hvplot.pandas # ! Specific dependency to install
pd.options.plotting.backend = 'hvplot' # Backend modification
data = np.random.normal(size=[50, 2])
df = pd.DataFrame(data, columns=['x', 'y'])
df.plot(kind='scatter', x='x', y='y') # Plotting
2.1. Matplotlib
Matplotlib es el backend de visualización predeterminado de Pandas. En otras palabras, si no especifica un backend, se utilizará Matplotlib. Es un paquete eficiente para visualizar rápidamente sus datos para explorarlos o extraer resultados, pero está envejeciendo y otros paquetes lo están superando tanto en facilidad de uso como en potencia de representación.
La ventaja de Matplotlib es que como Pandas se ha construido sobre Matplotlib desde su creación, la integración de Matplotlib en pandas es perfecta, todas las funciones de matplotlib se pueden utilizar en Pandas.
A modo de recordatorio, aquí se encuentran los 11 métodos de visualización de Matplotlib integrados en Pandas:
- “área” para parcelas de área,
- “barra” para gráficos de barras verticales,
- “barh” para gráficos de barras horizontales,
- “caja” para diagramas de caja,
- “hexbin” para gráficos de hexbin,
- “hist” para histogramas,
- “kde” para gráficos de estimación de densidad del kernel,
- “densidad” un alias para “kde”,
- “línea” para gráficos de líneas,
- “pie” para gráficos circulares,
- “dispersión” para gráficos de dispersión.
2.2. Argumentalmente
Con argumento es un paquete de visualización desarrollado por la empresa Plotly. La empresa ha desarrollado el framework Plotly.js para permitir la visualización interactiva de datos dentro de Python. La empresa Plotly también ofrece el paquete de dashboarding de Python Estrellarse.
Para utilizar Plotly desde Pandas, simplemente importe Expresar con argumento y cambia el backend:
import pandas as pd
import plotly.express as px # Import packagesdf = pd.read_csv("iris.csv")
# Modifying locally Pandas backend
df.plot.scatter(backend = "plotly", x = "sepal.length", y = "sepal.width")
Pandas devuelve un objeto con el mismo tipo que Plotly:
df.plot.scatter(backend = "plotly", x = "sepal.length", y = "sepal.width")
# → <class 'plotly.graph_objs._figure.Figure'>px.scatter(x=df["sepal.length"], y = df["sepal.width"])
# → <class 'plotly.graph_objs._figure.Figure'>
¡La ventaja es que puedes integrar directamente un gráfico creado en Pandas en el universo Plotly, especialmente Dash!
Una limitación es que la integración de Plotly con Pandas aún no es perfecta como se detalla en el sitio web de Plotly (detalles en el sitio web de Plotly).
2.3. Diagrama de flujo horizontal
Diagrama de flujo hv es un paquete de visualización interactiva basado en bokeh.
Es un paquete apasionante, que descubrí hace algún tiempo y que sigue fascinándome, tanto por Hvplot que integra la noción de backend como en Pandas como por el Suite Holoviz y paquetes relacionados como Panel para crear sitios web dinámicos del lado del cliente.
Sin siquiera la noción del backend de Pandas, Hvplot no requiere un aprendizaje excesivo para comenzar a usarse, solo reemplaza .trama() de Pandas con .hvplot():
import pandas as pd
import hvplotdf = pd.read_csv("iris.csv")
# Plot with Pandas
df.plot.scatter(backend = "hvplot", x = "sepal.length", y = "sepal.width")
# Same plot with hvplot
df.hvplot.scatter(backend = "hvplot", x = "sepal.length", y = "sepal.width")
El uso del backend Hvplot se realiza de la misma manera que para el backend Plotly, solo necesita importar una dependencia del paquete Hvplot:
import numpy as np
import pandas as pd # Basic packagesimport hvplot
import hvplot.pandas # Specific dependency to install
pd.options.plotting.backend = 'hvplot' # Backend modification
data = np.random.normal(size=[50, 2])
df = pd.DataFrame(data, columns=['x', 'y'])
df.plot(kind='scatter', x='x', y='y') # Plotting
Al igual que Plotly, los gráficos generados desde Pandas con el backend hvplot son del tipo Hvplot:
df.plot.scatter(backend = "hvplot", x = "sepal.length", y = "sepal.width")
# → <class 'holoviews.element.chart.Curve'>df.hvplot.scatter(backend = "hvplot", x = "sepal.length", y = "sepal.width")
# → <class 'holoviews.element.chart.Curve'>
Hvplot es parte de la extremadamente poderosa suite Holoviz con muchas otras herramientas asociadas para llevar el análisis de datos muy lejos, es decir, herramientas como Panel, vistas geográficas, sombreador de datos y otros. Este tipo de concordancia permite crear gráficos a partir de pandas y aún así poder aprovechar la suite Holoviz.
Los backends de Pandas son una solución extremadamente eficiente para descubrir y aprovechar los últimos paquetes de visualización de Python sin tener que invertir tiempo: en 18 caracteres incluidos los espacios, es posible transformar localmente un gráfico estándar de matplotlib en un gráfico interactivo de Plotly, y así aprovechar todos los beneficios de este tipo de visualización.
Sin embargo, esta solución tiene ciertas limitaciones: no es adecuada para objetivos de visualización muy avanzados que requieren un alto grado de personalización, como la visualización avanzada en periodismo de datos, porque la integración de paquetes en Pandas aún no es perfecta. Además, esta solución solo cubre los paquetes de visualización creados sobre Pandas y excluye otras soluciones de visualización como D3.js.
Hvplot es actualmente mi paquete favorito para visualización: es extremadamente fácil comenzar a usarlo al principio, funciona con todos los principales paquetes de manipulación de datos (Polars, Dask, Xray, …) y es parte de un continuo de aplicaciones que le permite pasar de gráficos a sitios web dinámicos completos del lado del cliente.
Durante mi investigación, no encontré tanta documentación como esperaba. Creo que el concepto es genial, por lo que esperaba muchos artículos. Así que no dudes en decirme en los comentarios si esta solución te parece realmente útil o si es simplemente algo interesante que no tiene ninguna utilidad real.
¡Gracias por leer!