HOWTO · Matplotlib

Como conectar pontos de dispersão com linha em Matplotlib

Conecte os pontos do gráfico de dispersão do Matplotlib na ordem dos dados com `plot()`, defina o estilo da linha e controle qual camada aparece por cima com `zorder`.

Nesta página

Para conectar os pontos de dispersão na ordem dos dados, passe os mesmos valores de x e y para scatter() e plot() e, em seguida, chame show() para exibir a figura. scatter() desenha os marcadores como uma coleção independente, plot() desenha o caminho que conecta os pontos na ordem fornecida e show() exibe a figura concluída.

Os exemplos deste tutorial foram executados e verificados com Matplotlib 3.11.2 no Python 3.12, e cada figura abaixo é a saída renderizada do exemplo logo acima dela.

Conectar pontos de dispersão na ordem dos dados com scatter() e plot()

Forneça às duas funções as mesmas sequências de coordenadas. plot() conecta cada par na ordem fornecida, portanto a sequência determina o caminho; o Matplotlib não ordena os pontos pela coordenada x. Mantenha cada valor x emparelhado com o seu valor y correspondente: o primeiro valor x pertence ao primeiro valor y, o segundo ao segundo, e assim por diante. Se ordenar as observações por x, reordene os valores y juntamente com essas mesmas observações, em vez de ordenar as duas listas independentemente.

Isto é importante quando os dados representam uma rota, uma série temporal ou outra sequência em que a ordem tem significado. Por exemplo, valores x que avançam de 1 para 3 e depois voltam para 2 produzem um caminho que se move para a direita e depois para a esquerda. Isso pode estar correto para uma trajetória. Se o seu objetivo for, em vez disso, uma curva que progride da esquerda para a direita, ordene primeiro as observações emparelhadas. Uma linha também pode conter segmentos verticais quando observações vizinhas partilham um valor x; plot() continua a uni-las na ordem fornecida.

Este exemplo sobrepõe os marcadores e a linha de conexão usando um único conjunto de coordenadas:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.scatter(x, y)
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Quatro pontos de dispersão em (1, 2), (2, 1), (3, 3) e (4, 2) ligados na ordem dos dados por uma linha contínua.

Usar as mesmas entradas x e y mantém os marcadores e a linha alinhados. Se as duas camadas parecerem deslocadas, verifique se nenhuma das sequências foi transformada ou reordenada para apenas uma das chamadas. Para dados armazenados numa tabela, selecione ambas as colunas das mesmas linhas e na mesma ordem. O exemplo usa a interface pyplot, pelo que não precisa de uma variável de figura separada; com a interface orientada a objetos, crie uma figura e eixos com fig, ax = plt.subplots() e, em seguida, chame ax.scatter(...) e ax.plot(...) nesses eixos.

Definir o estilo da linha e dos marcadores com plot()

Use linestyle e color para definir o estilo do caminho desenhado por plot(). O exemplo seguinte mantém uma camada scatter() separada para os marcadores e desenha o caminho de conexão como uma linha azul tracejada:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.scatter(x, y, color="blue")
plt.plot(x, y, linestyle="--", color="blue")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Os mesmos quatro pontos ligados por uma linha azul tracejada, com um marcador azul em cada ponto.

Chamar scatter() e plot() separadamente oferece um controlo independente sobre a coleção de pontos e o caminho de conexão: o tamanho e a cor dos marcadores podem mudar sem tocar na linha, o que é útil quando os pontos precisam de mais ênfase enquanto o caminho permanece visualmente simples. Forneça às duas chamadas as mesmas sequências de coordenadas para que cada marcador fique sobre o seu ponto correspondente na linha.

Uma única chamada a plot() também pode desenhar as duas camadas de uma só vez através de uma string de formato como "xb-", em que x seleciona a forma do marcador, b seleciona o azul e - seleciona uma linha contínua. A string de formato é compacta quando uma chamada deve desenhar tudo; os argumentos de palavra-chave como color, marker e linestyle são mais claros quando precisa de outras propriedades, como o tamanho do marcador, a largura da linha ou a transparência. Seja qual for a abordagem escolhida, show() fica depois de todas as chamadas de estilo e de camada, porque só exibe a figura depois de esses elementos terem sido adicionados.

Controlar qual camada aparece por cima com zorder

O elemento com o zorder mais elevado é desenhado por cima do que tem o valor mais baixo. Isto apenas altera a ordem de desenho; não altera as coordenadas nem o caminho. A definição é importante quando uma linha espessa atravessa um marcador e oculta o seu centro, ou quando a linha deve permanecer visível entre marcadores densos.

O exemplo seguinte torna a linha deliberadamente espessa e atribui aos marcadores o zorder mais elevado, para que cada marcador redondo permaneça inteiro onde a linha passa por baixo dele:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.plot(x, y, linewidth=6, zorder=2)
plt.scatter(x, y, s=120, zorder=3)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Uma linha espessa através dos quatro pontos, com marcadores redondos maiores desenhados por cima da linha em cada ponto.

Para os marcadores ficarem por cima da linha, atribua à coleção de dispersão o valor maior, como zorder=3 para scatter() contra zorder=2 para plot() acima. Para colocar a linha por cima dos marcadores, troque os valores. Use uma diferença modesta entre os dois valores para expressar a ordem pretendida e defina zorder em ambos os elementos quando a sobreposição deva ser inequívoca. A mesma comparação aplica-se a quaisquer outros elementos do gráfico que adicione mais tarde: o elemento com o zorder mais elevado é desenhado sobre os restantes.

Corresponder os comprimentos de x e de y para evitar o erro de tamanho

Ambas as funções emparelham os valores posição a posição, pelo que as duas sequências têm de ter o mesmo comprimento. Quando não têm, a chamada levanta um ValueError e nenhuma figura é desenhada. Este exemplo omite por engano o último valor y:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3]

plt.scatter(x, y)
plt.plot(x, y)
plt.show()

A sua execução falha na chamada a scatter() com:

ValueError: x and y must be the same size

Chamar apenas plot() com as mesmas entradas também falha, com a sua própria formulação do mesmo problema: ValueError: x and y must have same first dimension, but have shapes (4,) and (3,). Para corrigir o erro, localize a observação em falta ou a mais e faça com que as duas sequências voltem a descrever os mesmos pontos. Comparar len(x) e len(y) antes de desenhar indica qual dos lados é mais curto. Quando os dados provêm de uma tabela, filtre as linhas uma única vez e depois retire ambas as colunas das linhas filtradas, em vez de filtrar cada coluna separadamente e deixar que os seus comprimentos se desencontrem.

Duas sequências vazias são um caso diferente: são aceites e produzem um conjunto de eixos vazio sem erro. Uma figura vazia significa, portanto, normalmente que os dados de entrada estavam vazios, e não que os comprimentos não correspondiam.