logo

파이썬 matplotlib에서 원하는 임의의 위치에 서브플랏 그리거나, 겹쳐서 그리는 법 📂프로그래밍

파이썬 matplotlib에서 원하는 임의의 위치에 서브플랏 그리거나, 겹쳐서 그리는 법

개요

plt.subplot이나 gridspec을 이욯하면 격자 기반의 간단하거나 복잡한 레이아웃으로 서브플랏을 그릴 수 있다. 본 글에서는 격자에 의존하지 않고, 사용자가 원하는 완전히 임의의 위치에 서브플랏을 그리는 방법을 소개한다.

코드

  • fig.add_axes([left, bottom, width, height])

add_axes를 이용하면 figure 위의 원하는 위치에 새 서브플랏을 생성할 수 있다. 이때 서브플랏의 영역은 입력 인수인 [left, bottom, width, height]으로 결정된다. 각 항목은 전체 figure에서의 비율을 나타내므로 $0 \le$ left, bottom, width, height $\le 1$을 만족해야한다. 가령 fig.add_axes([0.1, 0.1, 0.2, 0.3])은 왼쪽에서부터 전체 가로길이의 $1/10$만큼 떨어지고 아래에서부터 전체 세로길이의 $1/10$만큼 떨어진 곳에, 전체 figure 크기에 비례해서 $0.2 \times 0.3$ 크기의 서브플랏을 만든다. 위치의 기준은 서브플랏의 좌하단이다.

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()

ax1 = fig.add_axes([0.1, 0.1, 0.2, 0.3])
ax1.plot(np.random.randn(10))

plt.show()

완전히 임의의 위치에 그릴 수 있기 때문에 겹쳐서도 그릴 수 있다. 먼저 그린 그림이 밑에 깔리게 된다.

fig = plt.figure()

ax1 = fig.add_axes([0.1, 0.1, 0.4, 0.8])
ax1.plot(np.random.randn(10))

ax2 = fig.add_axes([0.4, 0.5, 0.4, 0.4])
plt.bar(np.arange(10), np.random.randn(10))

ax3 = fig.add_axes([0.7, 0.4, 0.2, 0.2])
ax3.scatter(np.random.randn(10), np.random.randn(10))

plt.show()

환경

  • OS: Windows11
  • Version: Python 3.9.13, matplotlib==3.6.2, numpy==1.23.5