HOWTO · Matplotlib

Matplotlib에서 임의의 선을 그리는 방법

Matplotlib에서 plot(), hlines(), vlines() 및 LineCollection을 사용하여 유한한 선분을 그립니다.

이 페이지의 내용

Matplotlib에서 하나의 유한한 선분을 그리려면 두 끝점의 좌표를 Axes.plot()에 전달합니다. 선분이 수평 또는 수직이면 hlines()나 vlines()를 사용하고, 독립적인 선분이 많으면 LineCollection을 사용합니다. 이 API들은 데이터 좌표를 사용하며, axhline(), axvline(), axline()은 축을 가로지르거나 무한한 선이라는 다른 문제를 해결합니다.

예제는 Python과 Matplotlib를 사용합니다. Matplotlib가 아직 설치되어 있지 않다면 python -m pip install matplotlib으로 설치하세요. 각 실행 가능한 예제는 대화형이 아닌 환경에서도 확인할 수 있도록 PNG 파일을 저장합니다. 대화형 창에 표시하려면 savefig()을 plt.show()로 바꾸세요.

plot()으로 유한한 선분 그리기

(x1, y1)에서 (x2, y2)까지의 선분에는 두 x 값으로 이루어진 시퀀스와 두 y 값으로 이루어진 시퀀스를 plot()에 전달합니다. Matplotlib는 같은 위치의 값들을 연결하므로 첫 번째 x/y 쌍이 한 끝점이고 두 번째 쌍이 다른 끝점입니다.

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

두 플롯 끝점을 연결하는 유한한 녹색 선분

마커를 사용하면 두 끝점이 잘 보입니다. 폴리라인을 만들려는 경우에만 값 쌍을 더 추가하세요. plot()은 서로 관련 없는 선분을 만드는 대신 연속된 점들을 연결합니다.

유한한 수평 또는 수직 선분 그리기

수평 선분에는 hlines(y, xmin, xmax)를, 수직 선분에는 vlines(x, ymin, ymax)를 사용합니다. 일정하게 유지되는 좌표가 첫 번째 인수이며, 나머지 두 인수가 데이터 좌표에서 유한한 끝점을 지정합니다.

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

유한한 빨간색 수평 선분과 유한한 녹색 수직 선분

여기서 빨간 선분은 (2, 3)에서 (5, 3)까지, 녹색 선분은 (6, 1)에서 (6, 5)까지 이어집니다. 명시적인 범위를 지정하면 의도한 데이터 영역이 분명해지고, 잘린 선을 더 짧은 선분으로 잘못 해석하는 것을 막을 수 있습니다.

축을 가로지르는 기준선으로 대체하지 않기

axhline()과 axvline()은 유용한 기준선이지만 데이터 좌표의 두 끝점을 사용하는 대신 한 방향으로 축 전체에 걸쳐 그려집니다. 마찬가지로 axline()은 점을 통과하거나 기울기를 지정한 무한한 선을 나타냅니다. 차트에 이러한 동작이 필요할 때만 이 API들을 사용하세요.

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

이 어설션은 차이를 보여 줍니다. hlines()는 유한한 데이터 좌표 끝점을 유지하지만 axhline()은 수평 범위에 축 상대 좌표를 사용합니다. 확대/축소하거나 범위를 변경하거나 플롯을 내보낼 때 이 차이가 중요합니다.

LineCollection으로 독립적인 선분 여러 개 그리기

서로 연결되지 않은 선분이 많다면 두 점으로 구성된 선분 시퀀스에서 LineCollection을 만들고 이를 축에 추가하세요. add_collection() 뒤에 autoscale()을 호출하면 컬렉션이 축의 스케일에 포함됩니다. 차트의 표시 범위를 고정해야 한다면 대신 명시적인 범위를 설정하세요.

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

Matplotlib LineCollection에 추가한 두 개의 독립적인 선분

LineCollection은 많은 선분을 하나의 컬렉션으로 묶기 때문에 적합합니다. 한 선분의 끝을 다음 선분의 시작과 연결하지 않는다는 점이, 더 긴 점 시퀀스를 plot()에 전달하는 것과의 핵심적인 차이입니다.

도형에 맞는 API 선택하기

하나의 선분이나 연결된 경로에는 plot(), 유한하고 축에 평행한 선분에는 hlines()와 vlines(), 독립적인 선분 묶음에는 LineCollection을 선택하세요. axhline()이나 axvline()은 축 전체에 걸친 가이드에만 사용하고, axline()은 무한한 선이라는 점을 기억하세요.

매개변수와 스타일 옵션에 대한 자세한 내용은 공식 plot() 문서, hlines() 문서, vlines() 문서, LineCollection 문서를 참조하세요. 위 예제는 기록된 로컬 Polyglot 컨테이너에서 Matplotlib 3.11.2로 실행했습니다.