- 과제2 팀플 조원 샘이님에게 받은 함수이다. 오늘은 아래 함수에 대하여 자세히 공부하고,
- Hwi's ML doc님의 matplotlib 완벽 정리 편을 공부해 보겠다.
def plot_example(idx_list):
# 한 장에 여러 이미지(6장)를(을) 담을 것이다
# fig, axes = plt.subplots(1, 6) = 6개(1*6; 한줄에 6장)의 ax들을 가지는 하나의 figure 생성
fig, axes = plt.subplots(1, 6, figsize=(24, 10))
# 서브 플롯 간의 간격 맞추기
# subplots_adjust(left, bottom, right, top, wspace, hspace)
# (left, bottom, right, top=4면의 위치 조정)
# (wspace, hspace=너비와 높이 비율조절)
fig.subplots_adjust(hspace = .2, wspace=.2)
# flatten = 다차원 배열을 1차원 배열로 평평하게
axes = axes.flatten()
# 6개씩
for i in range(6):
# train_data에 있는 image_id는 X-ray사진과 매칭되는 파일명
# idx_list에 담겨져 있는 0번째 .... 6번째 를 돌면서 파일명을 가져온다
image_id = train_data.loc[idx_list[i], 'image_id']
# dicom형식 파일에 접근
data_file = pydicom.dcmread(train_dir + image_id+'.dicom')
# 시각화 하기 위해 (이미지 파일)배열로 변환
img = data_file.pixel_array
axes[i].imshow(img, cmap='gray')
# 서브 플롯당 제목 설정
axes[i].set_title(train_data.loc[idx_list[i], 'class_name'])
# box 정보가 없는 Nofinding을 제외하고
if train_data.loc[idx_list[i], 'class_name'] != 'No finding':
bbox = [train_data.loc[idx_list[i], 'x_min'],
train_data.loc[idx_list[i], 'y_min'],
train_data.loc[idx_list[i], 'x_max'],
train_data.loc[idx_list[i], 'y_max']]
# matplotlib.patches.Rectangle = 도형 시각화
# ((x, y), width, height)
p = matplotlib.patches.Rectangle((bbox[0], bbox[1]),
bbox[2]-bbox[0],
bbox[3]-bbox[1],
# ec(=edgecolor; 테두리 색)
# fc(=facecolor; 면 색)
# lw(=linewidth; 선 굵기)
ec='r', fc='None', lw=1)
# add_patch = 도형 시각화
axes[i].add_patch(p)
- 더 편리한 사용을 위해 pyplot이라는 wrapper 모듈을 만들었고, 놀랍게도 이 모듈을 이용하는 방법이 stateful 방법입니다.
- 따라서 저희가 matplotlib를 import 할 때, 그냥 import matplotlib가 아닌 import matplotlib.pyplot 을 했던 것입니다.
(stateless 방법만 사용한다면 import matplotlib 만 하면 됩니다)- 단점은 stateful은 stateless 만큼 정교한 작업은 할 수 없습니다.
figure 와 ax 객체를 생성하는 방법
#1. fig = plt.figure() : ax 없는 빈 figure 생성 (후에 ax를 추가해줘야함)
#2. fig, ax = plt.subplots() : 하나의 ax 만을 가지는 하나의 figure 생성
#3. fig, axes = plt.subplots(2,2) : 4개(2*2)이 ax들을 가지는 하나의 figure 생성
# fig, axes = plt.subplots(1, 6) = 6개(1*6; 한줄에 6장)의 ax들을 가지는 하나의 figure 생성
import os
import pydicom
# pydicom에서 dicom/dcm 파일을 읽어줄때는 dcmread를 사용한다
test_1 = '/content/drive/MyDrive/과제2/test'
text_h = os.listdir(test_1)
def test_order(num):
num = int(num)
dcm = []
for i in text_h[:num] :
test_path = test_1+'/'+i
dcm.append(pydicom.dcmread(test_path))
return(dcm)
test_order(3)