Uma figura, um Axes, uma linha
Um gráfico é a forma mais rápida de ver que uma série de preços está limpa, em tendência ou quebrada. No matplotlib uma Figure é toda a tela e um Axes é um gráfico nela, com suas linhas, rótulos e legenda. O modo orientado a objetos é fig, ax = plt.subplots() seguido de chamadas em ax: ax.plot(x, y) desenha uma linha, ax.set_title, ax.set_xlabel e ax.set_ylabel dão nome ao gráfico. Desenhar em um Axes explícito e devolvê-lo torna uma função de desenho fácil de reutilizar e testar.
import matplotlib
matplotlib.use("Agg") # draw without a window (no screen needed)
import matplotlib.pyplot as plt
import pandas as pd
prices = pd.Series([100.0, 102, 101, 105, 107, 106, 110], index=pd.bdate_range("2026-03-02", periods=7))
fig, ax = plt.subplots()
ax.plot(prices.index, prices.values, label="AAPL")
ax.set_title("Closing price")
ax.set_xlabel("Date")
ax.set_ylabel("Price (USD)")
print(ax.get_title(), "|", ax.get_xlabel(), "|", ax.get_ylabel()) # Closing price | Date | Price (USD)
print(len(ax.lines), ax.lines[0].get_ydata().tolist()) # 1 [100.0, 102.0, 101.0, 105.0, 107.0, 106.0, 110.0]Rótulos e legenda
Com várias linhas em um gráfico, cada uma precisa de um nome. Passe label="..." para ax.plot e chame ax.legend() uma vez no fim: a legenda lista os rótulos na ordem em que as linhas foram desenhadas. Um gráfico sem rótulos, título e unidades é uma imagem, não um resultado. As linhas também têm estilo: linestyle="--" dá uma linha tracejada, útil para uma média que não deve esconder os preços, e color, linewidth e marker refinam mais.
ma = prices.rolling(3).mean()
ax.plot(ma.index, ma.values, label="MA3", linestyle="--")
ax.legend()
print([line.get_label() for line in ax.lines]) # ['AAPL', 'MA3']
print([text.get_text() for text in ax.get_legend().get_texts()]) # ['AAPL', 'MA3']
print(ax.lines[1].get_linestyle(), ax.lines[1].get_ydata().tolist()[:3]) # -- [nan, nan, 101.0] NaN points are simply not drawnLinhas de referência e gráficos que você não vê
Uma linha horizontal marca um nível como um strike, um stop ou a média: ax.axhline(105, linestyle="--") a desenha por todo o gráfico (axvline faz o mesmo na vertical). O matplotlib também pode desenhar sem nenhuma janela: com o backend Agg, fig.savefig("chart.png") grava o gráfico em um arquivo, que é como relatórios e servidores produzem gráficos. Como tudo o que você desenha fica no objeto Axes, um programa (ou um teste) pode lê-lo de volta: as linhas com ax.lines, seus dados com get_ydata(), os rótulos com get_label(), o título com get_title().
ax.axhline(105, linestyle=":", label="level")
level_line = ax.lines[-1]
print(list(level_line.get_ydata()), level_line.get_linestyle(), level_line.get_label()) # [105, 105] : level
fig.savefig("prices.png") # writes the chart to a file; no window, no plt.show() needed
plt.close(fig) # release the figure when you are done with itdef plot_prices(prices):
fig, ax = plt.subplots()
ax.plot(prices.index, prices.values)
ax.set_title("Closing price")
return ax # the caller can add lines, save the chart or inspect it
ax = plot_prices(prices)
print(len(ax.lines), ax.get_title()) # 1 Closing price
plt.close("all")plt.subplots() mantém sua figura na memória até você chamar plt.close(fig). Em um laço que desenha centenas de gráficos, ou em um servidor, esquecer isso vaza memória e acaba disparando um aviso. Crie a Figure dentro da função, devolva o que quem chama precisa e deixe que ele a feche.fig, ax = plt.subplots()e depoisax.plot(x, y); dê nome ao gráfico comset_title,set_xlabeleset_ylabel.- Dê a cada linha um
label=e chameax.legend();linestyle="--"desenha tracejado;ax.axhline(y)uma linha horizontal. - Desenhe em um Axes e devolva-o:
ax.lines,get_ydata()eget_label()leem o gráfico; usesavefigeplt.closeem vez deshowem programas.
A seguir: os gráficos de candlestick, para desenhar abertura, máxima, mínima e fechamento de cada dia.
Lab: o que é avaliado
- Desenhar a linha de preços com
plot_prices25 pts - Comparar duas séries em um gráfico com
plot_comparison25 pts - Adicionar uma média móvel tracejada com
plot_with_average25 pts - Marcar um nível de preço com
plot_with_level25 pts