OpenCV 비전 실무2장 · 이미지 입출력과 영상 시각화10 / 21← 이전목차다음 →MetaContents

2장. 이미지 입출력과 영상 시각화

여러 장 나란히 놓기

사진 앨범의 한 쪽에 사진 여섯 장을 두 줄 세 칸으로 붙인다고 해 봅시다. 칸에 1번부터 6번까지 번호를 매기고, 사진을 순서대로 한 장씩 꽂으면 빠르고 실수가 없습니다. plt.subplots 로 칸을 나누고 axes.flat 으로 칸을 차례로 꺼내는 일이 이것입니다.

![plt.subplots(2, 3) 로 나눈 여섯 칸의 이름 axes[행, 열] 과 axes.flat 의 순서를 적은 그림](assets/img/diagram/ch02_subplots.svg)

그림의 여섯 칸에 칸 이름(axes[행, 열])과 axes.flat 으로 꺼낼 때의 순서를 적었습니다. 다홍 테두리의 왼쪽 위 칸이 첫째이고, 왼쪽에서 오른쪽으로, 윗줄에서 아랫줄로 차례가 이어집니다. 여기서 앨범의 칸이 axes, 칸 번호대로 꽂는 일이 zip(axes.flat, 그림들) 입니다.

격자를 정하는 값

값원래 말뜻예
plt.subplots(2, 3)sub plots(작은 그래프들)2줄 3칸의 칸을 만든다돌려받은 axes 의 모양은 (2, 3)
axes[1, 2]둘째 줄 셋째 칸번호는 0부터
axes.flatflat(납작한)칸을 한 줄로 펴서 차례로 꺼낸다6칸이 1번부터 6번까지
figsize=(9, 5)figure size도화지 크기(인치)칸이 많으면 크게
layout="constrained"constrained(맞춰 조인)제목과 칸이 겹치지 않게 간격을 맞춘다tight_layout() 과 비슷한 일

줄 수 구하기

그림이 7장이고 한 줄에 3칸씩 놓으면 줄이 몇 개 필요할까요? 7 ÷ 3 = 2.33… 이므로 2줄로는 모자라고 3줄이 필요합니다. 나눗셈을 올림하는 math.ceil(ceiling, 천장)로 구합니다. 3줄 × 3칸 = 9칸 가운데 남는 2칸은 axis("off") 로 비워 둡니다.

Python
import math
import matplotlib.pyplot as plt

n, cols = 7, 3
rows = math.ceil(n / cols)            # 결과: 3
fig, axes = plt.subplots(rows, cols, figsize=(6, 6), layout="constrained")
print("칸 배열의 모양:", axes.shape)    # 결과: (3, 3)
for k, ax in enumerate(axes.flat):
    if k < n:
        ax.set_title(f"{k + 1}번")
    else:
        ax.axis("off")                # 남는 칸은 눈금과 테두리를 지운다
plt.show()

주의할 점

  • plt.subplots(1, 3) 처럼 한 줄이면 axes 는 axes[0], axes[1] 처럼 번호 하나로 고릅니다. 두 줄 이상일 때만 axes[행, 열] 입니다. axes.flat 은 어느 쪽이든 똑같이 쓸 수 있습니다.
  • 칸 수보다 그림이 많으면 zip 은 짧은 쪽에 맞춰 멈추므로 남는 그림이 조용히 빠집니다. 줄 수를 넉넉히 구합니다.
← 이전 절2장 · Matplotlib 의 짜임다음 절 →2장 · 확대해서 보기