Altair
Altair expõe uma API declarativa de gramática de gráficos que compila para Vega-Lite - gráficos se tornam especificações JSON que você pode versionar, comparar e incorporar na web.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
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="Receita por região")
)
chart.save("revenue.json")Quando usar isso:
- Especificações que você deseja no git como JSON, não como código de plotagem imperativo
- Gráficos em camadas (
+,|) com composição legível - Incorporação em sites estáticos via Vega-Embed
- Ensino de gramática de visualização sem o boilerplate do matplotlib
Exemplo de Trabalho
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="Receita"),
color="region:N",
)
hist = base.mark_bar(opacity=0.7).properties(width=400, height=250, title="Distribuição")
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 receita")
)
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")O que isso demonstra:
- Codificação de bin em forma declarativa
- Concatenação horizontal com escala de cores compartilhada
- Regra em camadas com anotação
+ - Exportação JSON para incorporação
Mergulho Profundo
Como Funciona
Chart(data)+mark_*+ canaisencode(x,y,color,tooltip).- Atalhos :Q quantitativo, :N nominal, :T temporal, :O ordinal.
- Transformações (
transform_filter,transform_aggregate) permanecem na especificação. - O compilador emite JSON Vega-Lite renderizado por JS no navegador ou PNG via altair_saver.
Tipos de Codificação
| Atalho | Tipo |
|---|---|
:Q | Quantitativo |
:N | Nominal (categorias) |
:O | Categorias ordenadas |
:T | Temporal |
Notas Python
import altair as alt
alt.data_transformers.disable_max_rows() # apenas quando você aceita embeds grandes
alt.renderers.enable("json") # o padrão do notebook varia por versãoArmadilhas
- Limite padrão de 5000 linhas - Altair amostra frames grandes. Correção: agregue em pandas/Polars primeiro ou desative o número máximo de linhas conscientemente.
- Dados largos - Múltiplas colunas y precisam de
transform_foldou melt. Correção: organize em formato longo upstream. - Ordenando eixos nominais - a ordem alfabética padrão desordena os meses. Correção:
sort=["Jan", "Fev", ...]ou:Ocom ordem. - Salvar PNG sem dependências - requer vl-convert ou altair_saver. Correção: envie JSON para o front-end ou instale o conversor em CI.
- Seleções interativas em dados enormes - lentas no lado do cliente. Correção: filtre os dados no lado do servidor antes do gráfico.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Plotly | Interatividade integrada rica | Você quer portabilidade da especificação Vega-Lite |
| matplotlib | Fluxos de trabalho de impressão maduros | JSON declarativo é o entregável |
| ggplot (plotnine) | Migração do ggplot do R | O embed Vega é o alvo |
| seaborn | EDA rápida com pandas | A serialização da especificação importa |
FAQs
Por que JSON Vega-Lite?
- O front-end pode renderizar sem reexecutar Python.
- Especificações diferem de forma limpa na revisão de código.
Como faço facet?
alt.Chart(df).mark_point().encode(x="x", y="y").facet("region:N")Como filtro na especificação?
alt.Chart(df).transform_filter(alt.datum.revenue > 100).mark_bar().encode(...)Como combino gráficos?
hconcat,vconcat, operadores|e&empilham ou concatenam.resolve_scalealinha eixos e legendas.
Altair pode ler Polars?
- Passe Polars via
pl.DataFramequando suportado ou.to_pandas().
Como adiciono uma linha de média?
rule = alt.Chart(df).mark_rule(strokeDash=[4,4]).encode(y="mean(revenue):Q")
chart + ruleComo incorporo em HTML?
- Salve JSON; use a tag de script Vega-Embed em uma página estática.
- Ou
chart.save("out.html")quando o renderizador HTML estiver configurado.
E a acessibilidade?
- Forneça tooltips e títulos de eixo significativos.
- Não dependa apenas da cor - use forma ou facet também.
Como defino o esquema de cores?
.encode(color=alt.Color("region:N", scale=alt.Scale(scheme="set2")))Altair é bom para mapas?
- Geo básico suportado via mark_geoshape.
- GIS pesado geralmente requer ferramentas dedicadas.
Relacionado
- Plotly - alternativa interativa
- Básicos de Visualização - escolha de gráficos
- Melhores Práticas de Visualização - cor acessível
- Plotando Dados Grandes - agregue primeiro
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 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+ e uv 0.6+.