Gráficos de Linha com Matplotlib em Python — Guia Completo
Aprenda a criar e personalizar gráficos de linha em Python com Matplotlib. Inclui cores, estilos, marcadores, múltiplas linhas, anotações e salvamento.
A função plot() do Matplotlib é a ferramenta principal para gráficos de linha — gráficos que conectam pontos de dados com uma linha contínua para mostrar tendências ao longo do tempo ou de uma variável contínua. Este capítulo abrange tudo, desde o seu primeiro gráfico de onda senoidal até toques profissionais como anotações, regiões sombreadas e salvamento de arquivos prontos para publicação.
Antes de começar, certifique-se de que o Matplotlib está instalado:
pip install matplotlibSe você é novo na biblioteca, consulte primeiro os capítulos Introdução ao Matplotlib e Primeiros Passos.
Quando Usar um Gráfico de Linha
Use um gráfico de linha quando:
- Você quer mostrar tendências ao longo do tempo (preços de ações, temperatura ao longo dos meses, perda de treinamento ao longo das épocas).
- O eixo x representa uma variável contínua ou ordenada (tempo, distância, frequência).
- Você precisa comparar múltiplas séries que compartilham o mesmo eixo x.
Evite gráficos de linha para categorias sem ordem — um gráfico de barras é mais claro nesses casos. Para a relação entre duas variáveis numéricas independentes sem ordem implícita, considere um gráfico de dispersão.
Criando um Gráfico de Linha Básico
A assinatura mínima é plt.plot(x, y). Tanto x quanto y podem ser listas Python ou arrays NumPy.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100) # 100 evenly-spaced points from 0 to 10
y = np.sin(x)
plt.plot(x, y)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Sine Wave')
plt.tight_layout()
plt.show()np.linspace(start, stop, num) retorna num valores igualmente espaçados — uma forma conveniente de gerar curvas suaves sem escrever um loop. plt.tight_layout() ajusta o espaçamento para que os rótulos dos eixos nunca sejam cortados; é um bom hábito incluí-lo antes de cada chamada show() ou savefig().
Alterando a Cor e o Estilo da Linha
Usando o Formato Abreviado de String
Passe uma string de formato '[color][marker][linestyle]' como o terceiro argumento posicional:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, 'r--') # red dashed line
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Red Dashed Sine Wave')
plt.tight_layout()
plt.show()Letras de cor comuns: b azul, g verde, r vermelho, c ciano, m magenta, y amarelo, k preto, w branco.
Códigos de estilo de linha comuns: - sólido (padrão), -- tracejado, -. traço-ponto, : pontilhado.
Usando Parâmetros Nomeados
Os parâmetros nomeados são mais legíveis e oferecem maior controle:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(
x, y,
color='steelblue',
linestyle='--',
linewidth=2,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Styled Line')
plt.tight_layout()
plt.show()| Parâmetro | O que controla | Exemplos de valores |
|---|---|---|
color | Cor da linha | 'red', '#3498db', (0.2, 0.6, 0.8) |
linestyle | Padrão de traço | '-', '--', '-.', ':' |
linewidth | Espessura em pontos | 1 (padrão), 2, 3 |
alpha | Transparência 0–1 | 0.5 para 50% de opacidade |
Adicionando Marcadores aos Pontos de Dados
Os marcadores desenham um símbolo em cada ponto de dado, o que é útil quando os dados brutos têm poucos pontos e você quer mostrá-los explicitamente.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 9) # only 9 points — markers are visible
y = np.sin(x)
plt.plot(
x, y,
color='darkorange',
linewidth=1.5,
marker='o', # circle marker
markersize=8,
markerfacecolor='white',
markeredgewidth=1.5,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave with Markers')
plt.tight_layout()
plt.show()Códigos de marcadores comuns: 'o' círculo, 's' quadrado, '^' triângulo para cima, 'D' diamante, '+' mais, 'x' cruz, '*' estrela.
Consulte o capítulo Marcadores do Matplotlib para a lista completa e opções avançadas de formatação.
Plotando Múltiplas Linhas
Chame plt.plot() mais de uma vez antes de plt.show(). Cada chamada adiciona uma nova linha nos mesmos eixos. Passe um argumento label e então chame plt.legend() para gerar uma legenda automaticamente.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.exp(-x / 5) # damped sine
plt.plot(x, y1, label='sin(x)', linewidth=1.5)
plt.plot(x, y2, label='cos(x)', linewidth=1.5, linestyle='--')
plt.plot(x, y3, label='damped sin(x)', linewidth=1.5, linestyle='-.')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Multiple Lines')
plt.legend()
plt.tight_layout()
plt.show()O Matplotlib percorre automaticamente sua paleta de cores padrão, portanto você não precisa especificar cores diferentes para cada linha, a menos que queira substituí-las.
Controlando os Limites dos Eixos
plt.xlim() e plt.ylim() definem o intervalo visível de cada eixo. Passe (min, max) para ampliar ou reduzir:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y)
plt.xlim(0, 5) # show only the first half
plt.ylim(-1.2, 1.2)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave (Zoomed In)')
plt.tight_layout()
plt.show()Para deixar o Matplotlib determinar um limite automaticamente enquanto fixa o outro, use None como espaço reservado: plt.xlim(None, 5) deixa o limite inferior automático.
Adicionando uma Grade
plt.grid(True) adiciona uma grade leve que facilita a leitura de valores no gráfico. Você pode segmentar apenas as marcações principais ou secundárias e controlar o estilo:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=2)
plt.grid(True, linestyle='--', color='grey', alpha=0.5)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave with Grid')
plt.tight_layout()
plt.show()Consulte o capítulo Grade do Matplotlib para uma discussão completa sobre personalização de grades.
Anotando Pontos
plt.annotate() desenha um rótulo de texto com uma seta opcional apontando para uma coordenada de dado específica. Isso é útil para destacar picos, vales ou eventos significativos.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=1.5)
# Annotate the first peak (approx. x = pi/2)
plt.annotate(
'peak',
xy=(np.pi / 2, 1), # point to annotate
xytext=(np.pi / 2 + 1, 1.1), # position of the text
arrowprops=dict(arrowstyle='->', color='black'),
fontsize=10,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Annotated Sine Wave')
plt.tight_layout()
plt.show()Preenchendo Entre Linhas
plt.fill_between() sombreia a região entre duas curvas (ou entre uma curva e uma constante). Isso é comum para mostrar intervalos de confiança ou bandas de incerteza.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
# Simulate an upper and lower confidence bound
upper = y + 0.3
lower = y - 0.3
plt.plot(x, y, color='steelblue', linewidth=2, label='mean')
plt.fill_between(x, lower, upper, alpha=0.2, color='steelblue', label='±0.3 band')
plt.xlabel('x')
plt.ylabel('Amplitude')
plt.title('Line with Confidence Band')
plt.legend()
plt.tight_layout()
plt.show()O argumento alpha controla o quão transparente é o sombreamento — valores em torno de 0.2–0.3 geralmente funcionam bem para que a linha permaneça claramente visível.
Usando a API Orientada a Objetos
Todos os exemplos acima usam a interface sem estado plt.*, que é conveniente para scripts de um único gráfico. Para figuras mais complexas (múltiplos subgráficos, gráficos embutidos), use a API orientada a objetos, onde você trabalha com objetos explícitos Figure e Axes:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(x, y1, label='sin(x)', color='steelblue', linewidth=1.5)
ax.plot(x, y2, label='cos(x)', color='darkorange', linewidth=1.5, linestyle='--')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('OO-style Line Plot')
ax.legend()
ax.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()A API orientada a objetos espelha as chamadas plt.* com prefixos ax.set_* para rótulos e títulos. É o estilo preferido quando você precisa organizar múltiplos gráficos — consulte Subgráficos do Matplotlib para detalhes.
Salvando um Gráfico de Linha em um Arquivo
Use plt.savefig() antes de plt.show(). Especifique o formato do arquivo através da extensão:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=2)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Saved Line Plot')
plt.tight_layout()
plt.savefig('sine_wave.png', dpi=150) # raster PNG at 150 dpi
plt.savefig('sine_wave.svg') # vector SVG (ideal for web/print)
plt.show()Opções de formato comuns: png, pdf, svg, eps. Use svg ou pdf quando precisar de uma imagem escalável e pronta para impressão. Chame savefig() antes de show() — após show() a figura é limpa e savefig() produziria uma imagem em branco.
Controlando o Tamanho da Figura
A figura padrão tem 6,4 × 4,8 polegadas a 100 dpi. Substitua com figsize=(largura_pol, altura_pol):
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
fig, ax = plt.subplots(figsize=(10, 4)) # wide and short
ax.plot(x, np.sin(x), label='sin', linewidth=1.5)
ax.plot(x, np.cos(x), label='cos', linewidth=1.5, linestyle='--')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Wide Figure')
ax.legend()
plt.tight_layout()
plt.show()Referência Rápida
| Tarefa | Código |
|---|---|
| Gráfico de linha básico | plt.plot(x, y) |
| Linha vermelha tracejada (abreviado) | plt.plot(x, y, 'r--') |
| Parâmetros de estilo nomeados | plt.plot(x, y, color='steelblue', linestyle='--', linewidth=2) |
| Adicionar marcadores | plt.plot(x, y, marker='o', markersize=6) |
| Múltiplas linhas com legenda | chame plt.plot() duas vezes; plt.legend() |
| Definir limites dos eixos | plt.xlim(0, 5) / plt.ylim(-1, 1) |
| Adicionar grade | plt.grid(True, linestyle='--', alpha=0.5) |
| Anotar um ponto | plt.annotate('text', xy=(x0, y0), xytext=(xt, yt), arrowprops={...}) |
| Sombrear entre curvas | plt.fill_between(x, y_lower, y_upper, alpha=0.2) |
| Salvar em arquivo | plt.savefig('file.png', dpi=150) |
| Definir tamanho da figura | plt.subplots(figsize=(10, 4)) |
Capítulos Relacionados
- Introdução ao Matplotlib — visão geral da biblioteca e instalação
- Matplotlib Pyplot — a interface
pyplotem profundidade - Marcadores do Matplotlib — formas de marcadores e formatação
- Rótulos do Matplotlib — rótulos de eixos, títulos e anotações
- Grade do Matplotlib — adicionando e estilizando linhas de grade
- Gráficos de Dispersão do Matplotlib — relações entre duas variáveis
- Gráficos de Barras do Matplotlib — comparando quantidades entre categorias
- Subgráficos do Matplotlib — múltiplos gráficos em uma figura