Matplotlib에서 확대 삽입(zoomed inset) 그래프 안에 원본 그래프와는 다른 X축, Y축 스케일을 표시하고 싶다면 inset_axes() 메서드를 활용하면 됩니다. 이 방법을 사용하면 본 그래프의 특정 영역을 잘라내어 확대 보여주되, 가로세로 비율이나 축 범위를 자유롭게 조절할 수 있습니다.
구현 단계
- 그림(figure) 크기를 설정하고, 서브플롯 사이와 주변의 여백을 자동으로 조정합니다.
- numpy를 사용하여 x, y 데이터 포인트를 생성합니다.
- 현재 figure에 서브플롯을 추가합니다.
- plot() 메서드로 x, y 데이터 포인트를 그려 기본 그래프를 완성합니다.
- 지정한 너비와 높이를 갖는 삽입(inset) axes를 생성합니다.
- 원본과 다른 x축, y축 스케일(범위)을 삽입 axes에 설정합니다.
- mark_inset()으로 본 그래프 위에 해당 영역의 위치를 표시하는 박스와 연결선을 그립니다.
- show() 메서드를 호출하여 최종 figure를 화면에 출력합니다.
예제 코드
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1.inset_locator import mark_inset, inset_axes
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
x = np.linspace(0, 1, 100)
y = x ** 2
ax = plt.subplot(1, 1, 1)
ax.plot(x, y)
axins = inset_axes(ax, 1, 1, loc=2, bbox_to_anchor=(0.2, 0.55),
bbox_transform=ax.figure.transFigure)
axins.plot(x, y)
x1, x2 = .4, .6
y1, y2 = x1 ** 2, x2 ** 2
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
mark_inset(ax, axins, loc1=1, loc2=3, fc="none", ec="0.5")
plt.show()코드 설명
inset_axes()의 첫 번째 인자는 부모 axes(ax)이며, 이어서 너비와 높이를 지정합니다. loc=2는 좌측 상단 배치를 의미하고, bbox_to_anchor와 bbox_transform을 함께 사용하면 figure 기준 좌표로 삽입 위치를 더 세밀하게 조정할 수 있습니다.
x 범위 0.4~0.6에 대응하는 y 값(x²)을 계산해 set_xlim()과 set_ylim()에 전달하면, 해당 구간만 확대된 삽입 그래프가 만들어집니다. 마지막으로 mark_inset()은 본 그래프의 확대 영역과 삽입 그래프를 직사각형 박스와 연결선으로 시각적으로 연결해 줍니다.
실행 결과
위 코드를 실행하면 좌측 상단에 y=x² 곡선의 일부 구간(0.4~0.6)이 확대된 삽입 그래프가 나타나며, 본 그래프에는 회색 박스로 해당 영역이 표시됩니다. 삽입 그래프는 별도의 축 범위를 갖기 때문에, 필요에 따라 X축과 Y축 스케일을 서로 다르게 설정할 수 있습니다.
