Matplotlib에서 이미 만들어진 두 개의 플롯을 하나의 플롯으로 합치고 싶은 경우가 종종 있습니다. 이 글에서는 get_xydata()와 argsort()를 활용해 두 플롯의 데이터를 추출하고, 정렬한 뒤 하나의 새로운 플롯으로 병합하는 방법을 단계별로 살펴보겠습니다.
병합 절차
- 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변 여백을 자동으로 조정합니다.
- numpy를 사용하여 x, y1, y2 데이터 포인트를 생성합니다.
- plot() 메서드로 (x, y1)과 (x, y2) 데이터를 각각 플롯합니다.
- 현재 축(current axes)에 있는 선들의 xy 데이터 포인트를 가져옵니다.
- argsort()를 사용해 배열을 정렬했을 때의 인덱스 순서를 반환받습니다.
- 각 플롯에서 추출한 x, y 데이터 포인트를 리스트에 추가합니다.
- 정렬된 X, Y 데이터를 두 번째 서브플롯에 플롯하여 병합 결과를 확인합니다.
- show() 메서드로 최종 그림을 화면에 표시합니다.
예제 코드
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
x = np.linspace(-10, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.subplot(211)
plt.plot(x, y1, color='red', lw=5)
plt.plot(x, y2, color='orange', lw=7)
X, Y = [], []
for lines in plt.gca().get_lines():
for x, y in lines.get_xydata():
X.append(x)
Y.append(y)
idx = np.argsort(X)
X = np.array(X)[idx]
Y = np.array(Y)[idx]
plt.subplot(212)
plt.plot(X, Y, color='green', lw=0.75)
plt.show()코드 설명
위 예제에서는 먼저 -10부터 10까지 100개의 x 값을 생성하고, 이를 바탕으로 사인(sin) 함수와 코사인(cos) 함수 값을 계산합니다. 첫 번째 서브플롯(subplot(211))에는 빨간색과 주황색 선으로 두 곡선을 각각 그립니다.
이후 plt.gca().get_lines()를 통해 현재 축에 존재하는 모든 선 객체를 순회하면서, 각 선의 좌표 데이터를 get_xydata()로 추출하여 X, Y 리스트에 누적합니다. 두 플롯의 데이터가 섞여 있기 때문에 np.argsort(X)로 x값 기준 오름차순 정렬 인덱스를 구한 뒤, 이를 적용해 데이터를 재정렬합니다.
마지막으로 두 번째 서브플롯(subplot(212))에 정렬된 데이터를 초록색 선으로 그리면, 원래 두 개였던 플롯이 하나의 플롯으로 병합된 결과를 확인할 수 있습니다.
실행 결과
위 코드를 실행하면 상단에는 두 개의 개별 곡선이, 하단에는 이들이 병합된 단일 플롯이 함께 표시됩니다.