Altair
Altair expone una API declarativa de gramática de gráficos que compila a Vega-Lite: los gráficos se convierten en especificaciones JSON que puedes versionar, comparar e incrustar en la web.
Busca en todas las páginas de la documentación
Altair expone una API declarativa de gramática de gráficos que compila a Vega-Lite: los gráficos se convierten en especificaciones JSON que puedes versionar, comparar e incrustar en la web.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
import altair as alt
import pandas as pd
df = pd.read_csv("sales.csv", parse_dates=["ordered_at"])
chart = (
alt.Chart(df)
.mark_line(point=True)
.encode(x="ordered_at:T", y="sum(revenue):Q", color="region:N")
.properties(width=600, height=300, title="Ingresos por región")
)
chart.save("revenue.json")Cuándo usar esto:
+, |) con composición legible.import altair as alt
import pandas as pd
import numpy as np
rng = np.random.default_rng(42)
df = pd.DataFrame(
{
"region": np.repeat(["East", "West"], 150),
"revenue": rng.normal(150, 35, 300).clip(20),
"units": rng.integers(1, 60, 300),
}
)
base = alt.Chart(df).encode(
x=alt.X("revenue:Q", bin=alt.Bin(maxbins=20), title="Ingresos"),
color="region:N",
)
hist = base.mark_bar(opacity=0.7).properties(width=400, height=250, title="Distribución")
scatter = (
alt.Chart(df)
.mark_circle(size=60, opacity=0.5)
.encode(
x="units:Q",
y="revenue:Q",
color="region:N",
tooltip=["region", "units", "revenue"],
)
.properties(width=400, height=250, title="Unidades vs ingresos")
)
dashboard = alt.hconcat(hist, scatter).resolve_scale(color="shared")
rule = (
alt.Chart(pd.DataFrame({"y": [150]}))
.mark_rule(color="firebrick", strokeDash=[4, 4])
.encode(y="y:Q")
)
layered = scatter + rule
dashboard.save("dashboard.json")
layered.save("scatter_target.json")Lo que esto demuestra:
+.Chart(data) + mark_* + canales encode (x, y, color, tooltip).:Q cuantitativo, :N nominal, :T temporal, :O ordinal.transform_filter, transform_aggregate) permanecen en la especificación.altair_saver.| Abreviatura | Tipo |
|---|---|
:Q | Cuantitativo |
:N | Nominal (categorías) |
:O | Categorías ordenadas |
:T | Temporal |
import altair as alt
alt.data_transformers.disable_max_rows() # solo cuando aceptas incrustaciones grandes
alt.renderers.enable("json") # el renderizador predeterminado del notebook varía según la versióntransform_fold o melt. Solución: organiza en formato largo previamente.sort=["Ene", "Feb", ...] o :O con orden.vl-convert o altair_saver. Solución: envía JSON al front-end o instala el convertidor en CI.| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Plotly | Rica interactividad incorporada | Quieres portabilidad de la especificación Vega-Lite |
| matplotlib | Flujos de trabajo de impresión maduros | La especificación JSON es el entregable |
| ggplot (plotnine) | Migración de R ggplot | La incrustación de Vega es el objetivo |
| seaborn | EDA rápida con pandas | La serialización de especificaciones importa |
alt.Chart(df).mark_point().encode(x="x", y="y").facet("region:N")alt.Chart(df).transform_filter(alt.datum.revenue > 100).mark_bar().encode(...)hconcat, vconcat, operadores | y & superponen o concatenan.resolve_scale alinea ejes y leyendas.pl.DataFrame cuando sea compatible o .to_pandas().rule = alt.Chart(df).mark_rule(strokeDash=[4,4]).encode(y="mean(revenue):Q")
chart + rulechart.save("out.html") cuando el renderizador HTML esté configurado..encode(color=alt.Color("region:N", scale=alt.Scale(scheme="set2")))mark_geoshape.Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.
Revisado por Chris St. John·Última actualización: 19 jul 2026