HOWTO · Matplotlib

Como desenhar uma linha arbitrária no Matplotlib

Desenhe segmentos de linha finitos no Matplotlib com plot(), hlines(), vlines() e LineCollection.

Nesta página

Para desenhar um único segmento de linha finito no Matplotlib, passe as coordenadas dos dois pontos finais para Axes.plot(). Use hlines() ou vlines() quando o segmento for horizontal ou vertical, e use LineCollection quando houver muitos segmentos independentes. Essas APIs usam coordenadas de dados; axhline(), axvline() e axline() resolvem um problema diferente, de uma linha que atravessa os eixos ou é infinita.

Os exemplos usam Python com Matplotlib. Instale o Matplotlib com python -m pip install matplotlib se ele ainda não estiver disponível. Cada exemplo executável salva um PNG para que possa ser verificado em um ambiente não interativo; substitua savefig() por plt.show() quando quiser uma janela interativa.

Desenhar um segmento finito com plot()

Para um segmento de (x1, y1) a (x2, y2), passe a plot() uma sequência com dois valores de x e outra com dois valores de y. O Matplotlib conecta os valores nas mesmas posições, então o primeiro par x/y é uma extremidade e o segundo par é a outra.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([3, 5], [1, 6], color="tab:green", marker="o")
ax.set(xlabel="x", ylabel="y", title="Finite segment with plot()")
fig.savefig("plot-segment.png", dpi=120)
print("saved: plot-segment.png")
saved: plot-segment.png

Um segmento verde finito unindo os dois pontos finais desenhados

Os marcadores tornam visíveis as duas extremidades. Adicione mais pares de valores somente quando quiser criar uma polilinha: plot() conecta pontos consecutivos em vez de criar segmentos independentes.

Desenhar segmentos horizontais ou verticais finitos

Use hlines(y, xmin, xmax) para um segmento horizontal e vlines(x, ymin, ymax) para um segmento vertical. A coordenada mantida constante é o primeiro argumento; os outros dois argumentos são as extremidades finitas em coordenadas de dados.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.hlines(3, 2, 5, color="tab:red")
ax.vlines(6, 1, 5, color="tab:green")
ax.set(xlim=(0, 7), ylim=(0, 6), xlabel="x", ylabel="y")
fig.savefig("horizontal-vertical-segments.png", dpi=120)
print("saved: horizontal-vertical-segments.png")
saved: horizontal-vertical-segments.png

Um segmento horizontal vermelho e um segmento vertical verde, ambos finitos

Aqui, o segmento vermelho vai de (2, 3) a (5, 3), enquanto o segmento verde vai de (6, 1) a (6, 5). Limites explícitos deixam clara a faixa de dados pretendida e evitam interpretar uma linha cortada como um segmento mais curto.

Não substitua por uma linha de referência que atravessa os eixos

axhline() e axvline() são linhas de referência úteis, mas atravessam os eixos em uma direção em vez de usar duas extremidades em coordenadas de dados. Da mesma forma, axline() representa uma linha infinita que passa por pontos ou tem uma inclinação. Use uma dessas APIs somente quando esse comportamento for necessário no gráfico.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
segment = ax.hlines(3, 2, 5, color="tab:red")
reference = ax.axhline(3, color="0.35", linestyle="--")
assert segment.get_segments()[0].tolist() == [[2.0, 3.0], [5.0, 3.0]]
assert reference.get_transform() is ax.get_yaxis_transform()
print("hlines endpoints: [2.0, 3.0] to [5.0, 3.0]")
print("axhline uses axes-relative x coordinates")
hlines endpoints: [2.0, 3.0] to [5.0, 3.0]
axhline uses axes-relative x coordinates

A asserção demonstra o limite: hlines() mantém extremidades finitas em coordenadas de dados, enquanto axhline() usa coordenadas relativas aos eixos para sua extensão horizontal. Essa diferença importa ao aplicar zoom, alterar limites ou exportar um gráfico.

Desenhar muitos segmentos independentes com LineCollection

Quando precisar de muitos segmentos desconectados, crie uma LineCollection a partir de uma sequência de segmentos com dois pontos e adicione-a a um eixo. Chamar autoscale() depois de add_collection() permite que os eixos incluam a coleção; defina limites explícitos quando uma faixa de visualização fixa fizer parte do gráfico.

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

segments = [[(1, 10), (6, 9)], [(1, 7), (3, 6)]]
collection = LineCollection(segments, colors=["tab:red", "tab:green"])

fig, ax = plt.subplots()
ax.add_collection(collection)
ax.autoscale()
ax.set(xlabel="x", ylabel="y", title="Two independent segments")
fig.savefig("line-collection.png", dpi=120)
print("segments: 2")
print("saved: line-collection.png")
segments: 2
saved: line-collection.png

Dois segmentos independentes adicionados a uma LineCollection do Matplotlib

LineCollection é adequada para muitos segmentos porque os agrupa em uma única coleção. Ela não conecta o fim de um segmento ao início do próximo, que é a principal diferença em relação a passar uma sequência de pontos mais longa para plot().

Escolha a API que corresponde à geometria

Escolha plot() para um segmento ou caminho conectado, hlines() e vlines() para segmentos finitos alinhados aos eixos, e LineCollection para um conjunto de segmentos desconectados. Prefira axhline() ou axvline() somente para uma guia que atravessa os eixos e lembre-se de que axline() é infinita.

Para detalhes dos parâmetros e opções de estilo, consulte a documentação oficial de plot(), hlines(), vlines() e LineCollection. Os exemplos acima foram executados com Matplotlib 3.11.2 no contêiner Polyglot local registrado.