HOWTO · Seaborn

Como criar gráficos de linhas do Seaborn

Este tutorial demonstra como criar gráficos de linhas em Python usando o módulo Seaborn. Aprenda a visualizar dados de forma eficaz com gráficos de linhas personalizáveis, intervalos de confiança e várias linhas para análise comparativa. Perfeito tanto para iniciantes como para utilizadores experientes que procuram melhorar as suas competências de visualização de dados.

Nesta página

Um gráfico de linhas do Seaborn mapeia os valores de uma variável x e de uma variável y para pontos unidos por uma linha. É frequentemente usado para séries temporais, mas x pode ser qualquer variável ordenada ou contínua. A função seaborn.lineplot() também pode resumir observações repetidas e desenhar linhas separadas para categorias, o que a torna útil para explorar como as medições mudam e para comparar grupos.

Começar com o Seaborn

O Seaborn é uma biblioteca de gráficos estatísticos construída sobre o Matplotlib. Os exemplos abaixo usam um DataFrame do pandas, uma forma conveniente de manter colunas nomeadas juntas. Instale o Seaborn e as suas dependências no seu ambiente Python, caso ainda não estejam disponíveis; depois importe o Seaborn e o Matplotlib. Nos exemplos de gráficos não é necessário nenhum comando de instalação separado.

Os exemplos deste tutorial foram executados e verificados com o Seaborn 0.13.2, o Matplotlib 3.11.2 e o pandas 3.1.0 em Python 3.12, e cada figura abaixo é o resultado que esses exemplos realmente produziram.

Criar um gráfico de linhas básico

Passe o DataFrame para data e indique as colunas para x e y. O exemplo seguinte usa valores fixos, pelo que os pontos desenhados são reprodutíveis. A chamada a plt.show() abre a figura num ambiente interativo; num notebook, a figura é normalmente apresentada como o resultado da célula.

Execute este exemplo:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "day": [1, 2, 3, 4, 5],
    "visitors": [12, 15, 13, 18, 21],
})

sns.lineplot(data=data, x="day", y="visitors")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Visitors by day")
plt.tight_layout()
plt.show()

Gráfico de linhas do Seaborn de visitantes para os dias 1 a 5, a subir de 12 para 21 com uma queda para 13 no dia 3.

O eixo horizontal usa day, e o eixo vertical usa visitors. Substitua estes nomes e valores por colunas da sua própria tabela. Se as linhas partilharem um valor de x, o Seaborn pode agregar as observações de y nessa posição e mostrar uma banda de incerteza; as secções seguintes explicam como interpretar essas características.

Personalizar gráficos de linhas

As definições de aparência ajudam o leitor a distinguir uma série ou a seguir os seus valores. Por exemplo, color define a cor de uma linha, marker coloca um símbolo em cada observação, e linestyle altera o padrão do traço. São escolhas visuais; não criam grupos nem alteram quais linhas pertencem aos dados. Escolha cores e marcadores que continuem fáceis de distinguir no tamanho em que a figura será lida.

Use a mesma tabela determinística acima num script em que as importações e a definição de data estejam incluídas. Esta variante completa enfatiza os pontos com uma linha tracejada:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "day": [1, 2, 3, 4, 5],
    "visitors": [12, 15, 13, 18, 21],
})

sns.lineplot(data=data, x="day", y="visitors", color="darkorange", marker="o", linestyle="--")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Visitors by day")
plt.tight_layout()
plt.show()

O mesmo gráfico de linhas de visitantes com um novo estilo: linha tracejada laranja-escura e um marcador circular em cada observação.

Para uma aparência diferente, altere estes argumentos ou use métodos do Matplotlib para definir rótulos e títulos. Mantenha o mapeamento de x e y explícito para que os leitores posteriores possam saber o que cada ponto representa.

Adicionar intervalos de confiança

Uma banda de incerteza em torno de uma linha resume a variação ou a incerteza em torno de uma estimativa. O seu significado depende dos dados e do estimador: quando várias observações contribuem para uma posição x, a linha central pode resumi-las, e a banda comunica a incerteza em torno desse resumo. Não é simplesmente outro nome para o desvio padrão. O desvio padrão descreve a dispersão entre as observações; um intervalo de confiança descreve a incerteza de uma quantidade estimada.

O exemplo seguinte atribui a cada dia três observações. O código imprime primeiro a média de cada grupo, para que possa verificar a linha desenhada em relação a números simples:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
    "visitors": [10, 12, 14, 14, 16, 18, 13, 15, 17, 19, 21, 23],
})

print(data.groupby("day")["visitors"].mean())

sns.lineplot(data=data, x="day", y="visitors", marker="o")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Mean visitors by day with 95% confidence band")
plt.tight_layout()
plt.show()

Saída:

day
1    12.0
2    16.0
3    15.0
4    21.0
Name: visitors, dtype: float64

Média de visitantes por dia como uma linha que passa pelas médias dos grupos 12, 16, 15 e 21, com uma banda de confiança sombreada de 95% em redor.

A linha central passa pelas médias impressas (12, 16, 15 e 21): com observações repetidas, o lineplot() agrega cada grupo de x com a média, por predefinição. A banda sombreada é o intervalo de confiança de 95% para essa média, calculado por bootstrapping. Onde um grupo está mais disperso, a banda é mais larga; nada diz sobre onde caem as observações individuais.

Antes de interpretar uma banda, verifique se cada valor de x tem observações repetidas e o que essas observações representam. Medições repetidas do mesmo sujeito, por exemplo, não representam necessariamente amostras independentes. Com uma única observação em cada valor de x, não há replicação dentro da posição a partir da qual inferir a variação da mesma forma. A interpretação apropriada também depende da versão do Seaborn e das opções de gráfico em uso. Os exemplos aqui usam o parâmetro errorbar, disponível desde o Seaborn 0.12; no Seaborn 0.13.2, a predefinição é errorbar=("ci", 95), e errorbar="sd" desenha, em vez disso, uma banda que abrange um desvio padrão em cada lado da média. Consulte a documentação da versão instalada quando precisar de controlar o estimador ou o método do intervalo. Se a banda não for significativa para os seus dados, configure o gráfico em conformidade ou omita-a e explique como a linha foi calculada.

Quando a banda não for significativa, desative-a com errorbar=None. A agregação continua a acontecer — a linha continua a ligar as médias dos grupos —, mas não é desenhada nenhuma banda:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
    "visitors": [10, 12, 14, 14, 16, 18, 13, 15, 17, 19, 21, 23],
})

sns.lineplot(data=data, x="day", y="visitors", marker="o", errorbar=None)
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Mean visitors by day without uncertainty band")
plt.tight_layout()
plt.show()

Média de visitantes por dia desenhada com errorbar definido como None, pelo que a linha liga as mesmas médias dos grupos sem banda de incerteza.

As duas figuras desenham as mesmas médias; apenas a banda difere. Escolha entre elas com base no facto de o resumo da incerteza ajudar o leitor, e não na figura que parece mais limpa.

Desenhar várias linhas

Para comparações baseadas em categorias, inclua uma coluna de categoria e mapeie-a para hue. O Seaborn desenha uma linha colorida separada para cada categoria e adiciona uma legenda. Mapeie style para a mesma coluna categórica ou para outra quando os padrões de linha puderem proporcionar uma distinção visual adicional. Use categorias apenas quando as linhas partilham as mesmas medidas de x e y; mantenha os rótulos e as unidades consistentes entre os grupos.

Aqui está um exemplo completo de dados agrupados com observações fixas:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "week": [1, 2, 3, 1, 2, 3],
    "orders": [8, 11, 14, 6, 9, 10],
    "store": ["North", "North", "North", "South", "South", "South"],
})

sns.lineplot(data=data, x="week", y="orders", hue="store", style="store", markers=True, dashes=True)
plt.xlabel("Week")
plt.ylabel("Orders")
plt.title("Orders by store")
plt.tight_layout()
plt.show()

Dois gráficos de linhas numa figura: os pedidos semanais da loja North a subir de 8 para 14, acima da loja South a subir de 6 para 10, distinguidos por cor, marcador e estilo de linha.

Quando, em vez disso, os dados têm colunas numéricas separadas para cada série, remodele-os numa tabela longa com uma coluna de valores e uma coluna com o nome da série, e depois mapeie o nome da série para hue. Em alternativa, desenhe cada coluna y em eixos partilhados do Matplotlib e atribua um rótulo a cada linha antes de adicionar uma legenda. Em qualquer das abordagens, a legenda deve identificar cada linha e corresponder aos seus dados. Não use o estilo por categorias para ocultar unidades ou escalas diferentes; considere eixos separados ou figuras separadas quando a comparação direta puder induzir em erro.

Corrigir um nome de coluna mal escrito

Os nomes passados para x e y têm de corresponder exatamente aos nomes das colunas em data. Se um nome estiver mal escrito, o lineplot() levanta um erro antes de desenhar qualquer coisa. Esta chamada pede uma coluna chamada visitor, mas o DataFrame só tem visitors:

import pandas as pd
import seaborn as sns

data = pd.DataFrame({
    "day": [1, 2, 3, 4, 5],
    "visitors": [12, 15, 13, 18, 21],
})

sns.lineplot(data=data, x="day", y="visitor")

Saída:

ValueError: Could not interpret value `visitor` for `y`. An entry with this name does not appear in `data`.

A mensagem indica o argumento (y), o valor que falhou (visitor) e o motivo, o que torna este erro rápido de corrigir: compare o nome com as colunas reais — imprimir data.columns enumera-as — e corrija a ortografia. O mesmo erro aparece para x ou para uma coluna hue ou style mal escrita.

Conclusão

Use seaborn.lineplot() para ligar as medições de y ao longo dos valores de x e, em seguida, escolha definições de aparência ou mapeamentos de categorias para tornar a figura legível. Verifique como as observações repetidas são resumidas antes de interpretar uma banda de incerteza, e rotule claramente cada série comparada.

Perguntas frequentes

  1. O que é que o Seaborn acrescenta ao Matplotlib? O Seaborn fornece uma interface de nível superior para gráficos estatísticos e trabalha com o Matplotlib para a apresentação das figuras e formatação adicional.
  2. Posso passar um DataFrame do pandas? Sim. Defina data como o DataFrame e passe os nomes das colunas para x e y.
  3. Como altero a aparência da linha? Use opções como color, marker e linestyle; estas alteram a aparência, enquanto hue mapeia as categorias para linhas separadas.
  4. O que significa a banda sombreada? Representa um resumo da incerteza associado à estimativa desenhada. A sua interpretação depende das observações repetidas, do estimador e do método de intervalo escolhido; não é automaticamente um desvio padrão.
  5. Como posso comparar várias linhas? Mapeie uma coluna de categoria para hue, ou desenhe séries rotuladas separadamente em eixos partilhados. Certifique-se de que a legenda nomeia cada linha com precisão.
  6. Como removo a banda sombreada? Passe errorbar=None. A linha continua a agregar as observações repetidas com a média; apenas a banda de incerteza é omitida.