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.flat | flat(납작한) | 칸을 한 줄로 펴서 차례로 꺼낸다 | 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") 로 비워 둡니다.
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은 짧은 쪽에 맞춰 멈추므로 남는 그림이 조용히 빠집니다. 줄 수를 넉넉히 구합니다.