Plotly
Plotly cria gráficos interativos prontos para a web com hover, zoom e pan - exporte HTML ou incorpore em aplicativos Dash.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import plotly.express as px
import pandas as pd
df = pd.read_csv("sales.csv", parse_dates=["ordered_at"])
fig = px.line(df, x="ordered_at", y="revenue", color="region", title="Tendência de receita")
fig.update_layout(hovermode="x unified")
fig.write_html("revenue.html", include_plotlyjs="cdn")Quando usar isso:
- Dashboards e exploração self-serve para stakeholders
- Dispersão densa necessitando detalhes no hover
- Escovação vinculada entre facetas (Dash)
- Incorporar gráficos em ferramentas web internas
Exemplo de Trabalho
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import numpy as np
rng = np.random.default_rng(42)
df = pd.DataFrame(
{
"region": np.repeat(["East", "West"], 100),
"month": np.tile(np.arange(1, 13).repeat(8)[:100], 2),
"revenue": rng.integers(80, 200, 200),
"units": rng.integers(5, 50, 200),
}
)
# Dispersão Express com hover personalizado
fig_scatter = px.scatter(
df,
x="units",
y="revenue",
color="region",
hover_data=["month"],
opacity=0.7,
title="Unidades vs receita",
)
fig_scatter.update_traces(marker=dict(size=8))
# Objetos de Gráfico para combinação de eixo duplo
monthly = df.groupby(["month", "region"], observed=True)["revenue"].sum().reset_index()
fig_combo = go.Figure()
for region, sub in monthly.groupby("region"):
fig_combo.add_trace(
go.Scatter(x=sub["month"], y=sub["revenue"], mode="lines+markers", name=region)
)
fig_combo.update_layout(
xaxis_title="Mês",
yaxis_title="Receita",
legend_title="Região",
template="plotly_white",
)
fig_scatter.write_html("scatter.html", include_plotlyjs="cdn")
fig_combo.write_html("combo.html", include_plotlyjs="cdn")O que isso demonstra:
- Plotly Express para dispersão rápida com
hover_data - Objetos de Gráfico para figuras multi-trace
templatepara tema claro consistente- JS hospedado em CDN para arquivos HTML menores
Mergulho Profundo
Como Funciona
- Figuras são dicionários serializáveis em JSON renderizados por plotly.js no navegador.
- Express envolve graph_objects com padrões sensatos de colunas do DataFrame.
- Traces contêm dados; layout controla eixos, legendas e anotações.
- Dash constrói aplicativos reativos compartilhando o mesmo modelo de figura.
Express vs Objetos de Gráfico
| Camada | Melhor para |
|---|---|
plotly.express | Gráficos padrão de dados organizados |
plotly.graph_objects | Layouts personalizados, eixos duplos, anotações |
Notas de Python
import plotly.io as pio
# Exportação de imagem estática requer kaleido
pio.write_image(fig, "chart.png", scale=2)Armadilhas
- Plotar milhões de pontos - o navegador trava. Correção: agregue, use hexbin ou datashader primeiro.
- HTML enorme com JS inline -
include_plotlyjs=Trueincha os arquivos. Correção: use"cdn"ou"directory". - Eixo X categórico tratado como numérico - linhas conectam incorretamente. Correção:
astype(str)oucategory_orders. - DataTimes sem fuso horário - o hover mostra o deslocamento local errado. Correção: UTC na origem, formate em
hovertemplate. - Kaleido ausente para PNG -
write_imagefalha em CI. Correção:uv pip install kaleidoem trabalhos de exportação.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| matplotlib | Pipelines estáticos de impressão/PDF | Precisa de tooltips de hover |
| Altair | Especificações declarativas Vega-Lite | Precisa de traces WebGL 3D |
| Bokeh | Grandes conjuntos de dados de streaming | Equipe já usa Plotly/Dash |
| Observable Plot | Gramática nativa da web | Tarefas em lote apenas em Python |
FAQs
Express ou graph_objects?
- Comece com Express; use GO para eixos duplos e anotações personalizadas.
- GO é verboso, mas ilimitado.
Como personalizo o texto do hover?
fig.update_traces(hovertemplate="Receita: %{y:$,.0f}<extra></extra>")Posso usar Plotly no Jupyter?
fig.show()renderiza inline com suporte a nbformat.- Prefira exportação HTML para compartilhamento fora do notebook.
Como corrijo a ordem da legenda?
fig.update_layout(legend_traceorder="reversed")- Ou ordene os traces antes de adicionar.
Como adiciono uma linha de referência horizontal?
fig.add_hline(y=150, line_dash="dash", annotation_text="meta")Plotly funciona com Polars?
- Passe
pl.DataFrameonde suportado ou.to_pandas()primeiro.
Como faço o tema escuro?
fig.update_layout(template="plotly_dark")Como incorporo em Flask?
- Retorne
fig.to_html(full_html=False)em templates. - Carregue plotly.js uma vez no layout base.
O que é Dash?
- Framework de aplicativos reativos da Plotly - veja a página de dashboards.
- Compartilha o modelo de figura com Express/GO.
Como animo?
px.scatter(..., animation_frame="year")para conjuntos de dados pequenos.- Evite animação em quadros enormes.
Relacionado
- Dashboards (Streamlit / Dash / Gradio) - Aplicativos Dash
- Plotando Dados Grandes - amostragem reduzida
- Altair - alternativa declarativa
- Noções Básicas de Visualização - quando a interatividade ajuda
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+.