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
LineCollection은 많은 선분을 하나의 컬렉션으로 묶기 때문에 적합합니다. 한 선분의 끝을 다음 선분의 시작과 연결하지 않는다는 점이, 더 긴 점 시퀀스를 plot()에 전달하는 것과의 핵심적인 차이입니다.
도형에 맞는 API 선택하기
하나의 선분이나 연결된 경로에는 plot(), 유한하고 축에 평행한 선분에는 hlines()와 vlines(), 독립적인 선분 묶음에는 LineCollection을 선택하세요. axhline()이나 axvline()은 축 전체에 걸친 가이드에만 사용하고, axline()은 무한한 선이라는 점을 기억하세요.
매개변수와 스타일 옵션에 대한 자세한 내용은 공식 plot() 문서, hlines() 문서, vlines() 문서, LineCollection 문서를 참조하세요. 위 예제는 기록된 로컬 Polyglot 컨테이너에서 Matplotlib 3.11.2로 실행했습니다.