파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기

힘센캥거루
2025년 10월 7일(수정됨)
5
10

지난 글에서는 Pandas와 Matplotlib을 이용하여 데이터를 시각화해보는 실습 문제를 다루었다.

이번 글에서는 Matplotlib으로 여러개의 그래프를 한번에 그려보는 subplots에 대해 알아보려고 한다.

1. Subplots

subplots는 그래프를 그릴 공간의 좌표를 받아 전체 그래프각 그래프의 축을 반환한다.

fig, axis = plt.subplots(2,2, constrained_layout=True)
axis

axis 안의 내용을 확인해보면 각각의 축이 2행 2열의 형태로 들어있는 것을 확인할 수 있다.

모두 객체이기 때문에 따로따로 다루는 것이 가능하다.

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-1

주피터 노트북에서는 그래프도 바로 그려준다.

아직 입력된 내용이 없기에 아무것도 없는 4개의 그래프가 나타난다.

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-2

그래프를 하나씩 채워보자. 동일한 x 값에 서로다른 y 값을 가진 그래프들을 그려보았다.

aixs의 형태가 아래 주석과 같기 때문에, 좌표처럼 접근하면 된다. 

x = [1,2,3,4,5]
y1 = [1,2,3,4,5]
y2 = [1,3,5,7,9]
y3 = [1,4,9,16,26]
y4 = [1,8,27,64,125]

# axis 내부는 왼쪽 상단부터 오른쪽 방향으로 
# [[첫번째, 두번째],[세번째, 네번째]] 그래프 객체가 들어있다.
axis[0][0].plot(x,y1)
axis[0][1].plot(x,y2)
axis[1][0].plot(x,y3)
axis[1][1].plot(x,y4)
fig

위의 코드와 아래 이미지를 비교해보면 어떻게 매칭이 되는지 보일 것이다. 

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-3

각각의 그래프 객체에 접근해서 세부적인 수정을 해줄 수 있다.

예전에 plt에서 썼던 함수 앞에 set_을 붙여주면 된다.

axis[0][0].plot(x,y1, label="y=x")
axis[0][0].set_title("첫번째 그래프")
axis[0][0].set_xlabel("이것은 x축")
axis[0][0].set_ylabel("이것은 y축")
axis[0][0].set_xticks(x)
axis[0][0].set_yticks(y1)
axis[0][0].legend()

아래처럼 첫번째 그래프가 잘 수정된 것을 볼 수 있다.

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-4

나머지 그래프도 같은 방식으로 고쳐보자.

하드코딩으로 고치는 것은 멋지지 않으니 2중 for문을 통해 각각의 객체에 접근한 후 고쳐주기로 해보자.

x = [1,2,3,4,5]
y1 = [1,2,3,4,5]
y2 = [1,3,5,7,9]
y3 = [1,4,9,16,26]
y4 = [1,8,27,64,125]

# y값과 범례가 담긴 리스트를 만듦
# nums를 이용해 4개의 값을 돌아가면서 추가할 수 있도록 만듦
ys = [y1,y2,y3,y4]
legends = ["y=x", "y=2x-1", "y=x^2", "y=x^3"]
nums = 0

# for문을 2중으로 돌면서 (0,0), (0,1), (1,0), (1,1)을 순회함
for i in range(2):
    for j in range(2):
        # x 값과 ys 안에 있는 nums 번째 값 추가
        axis[i][j].plot(x,ys[nums], label=legends[nums])
        axis[i][j].set_title(f"{nums+1}번째 그래프")
        axis[i][j].set_xlabel("이것은 x축")
        axis[i][j].set_ylabel("이것은 y축")
        axis[i][j].set_xticks(x)
        axis[i][j].set_yticks(ys[nums])
        axis[i][j].legend()
        nums += 1
fig

마지막 그래프의 축이 조금 마음에 들지 않지만, 모두 잘 수정되었다.

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-5

2. 활용 예제

지난번에 연도별 범죄 발생 건수, 검거 건수를 subplots 로 그래프를 그려보자.

당연히 pandas로 먼저 값을 불러온다.

import pandas as pd

# 모듈 호출 및 한글폰트 설정
import matplotlib.pyplot as plt
import matplotlib

# MacOS에서 폰트설정
# matplotlib.rcParams["font.family"] = "AppleGothic"

# 윈도우에서 폰트설정
matplotlib.rcParams["font.family"] = "Malgun Gothic"

# 폰트 크기 설정
matplotlib.rcParams["font.size"] = 13

# 마이너스 출력 문제 해결
plt.rcParams['axes.unicode_minus'] = False

crime = pd.read_excel("./crime_statistics.xlsx")
crime.head(3)
파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-6파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-7

데이터의 열 중에 '해킹'이 포함된 것을 모두 찾아보았다.

그래프는 총 4개이니, 4개의 열만 고르도록 리스트를 줄였다.

그리고 x를 연도, y1은 데이터 중 발생건수, y2는 검거건수로 지정했다.

cols = [i for i in crime.columns if "해킹" in i]
cols = cols[:4]
x = crime.iloc[:,0].unique()
y1 = crime.loc[crime.구분=="발생건수",cols[0]]
y2 = crime.loc[crime.구분=="검거건수",cols[0]]
파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-8

이것으로 첫번째 그래프를 한번 그려보았다.

fig, axis = plt.subplots(2,2, constrained_layout=True)
axis[0][0].plot(x,y1,label="발생건수")
axis[0][0].plot(x,y2,label="검거건수")
axis[0][0].legend()
axis[0][0].set_title(cols[0])
axis[0][0].legend()

그래프가 잘 그려졌다. 범례의 위치나 글자의 크기가 마음에 조금 들지 않지만, 이는 일단 먼저 그려보고 수정하면 되는 일이다.

이제 코드를 2중 for문으로 만들어 전체 그래프를 그리도록 만들자.

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-9

전체 코드를 for문 안으로 넣고 바꿔야 할 부분들을 바꾸어 준다.

먼저 축 부분을 axis[i][j] 로 바꿔야 하는데 하나씩 바꾸면 힘들고 멋지지 않다.

Alt + Shift + 마우스 드래그를 해주면 멀티커서가 활성화된다.

[0][0] 부분을 지우고 [i][j] 로 바꾸어 준다.

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-10파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-11

코드를 모두 수정하면 아래와 같이 된다.

이걸 실행하면 그래프를 잘 그려준다.

fig, axis = plt.subplots(2,2, constrained_layout=True)
col_nums = 0
for i in range(2):
    for j in range(2): 
        y1 = crime.loc[crime.구분=="발생건수",cols[col_nums]]
        y2 = crime.loc[crime.구분=="검거건수",cols[col_nums]]
        axis[i][j].plot(x,y1,label="발생건수")
        axis[i][j].plot(x,y2,"--",label="검거건수")
        axis[i][j].legend()
        axis[i][j].set_title(cols[col_nums])
        axis[i][j].legend()
        col_nums += 1

범례가 마음에 들지 않는다면 fontsize 파라미터로 글자의 크기를 줄이거나, bbox_to_achor를 이용해 범례의 위치를 변경할 수 있다.

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-12

이제 코드가 완성되었다. 다른 데이터를 확인하고 싶다면 cols에 담는 열이름만 바꿔주면 된다.

이번에는 '도박'으로 바꿔보았다.

그리고 나머지 코드를 실행하면 자동으로 도박에 대한 그래프를 그려준다.

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-13파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-14

이번에는 사이버 금융범죄에 대한 그래프를 그려보자. 

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-15

그래프를 보니 범죄의 양상이 2016년~2018년을 기점으로 많은 변화가 일어난 것이 보인다. 

파이썬 데이터 시각화 입문 7 - Matplotlib 객체 다루기-16

3. 글을 마치며

오늘은 matplotlib에서 subplots를 이용하는 법에 대해 알아보았다.

여기서는 단순하게 plot만을 이용해 그래프를 그렸지만 이 이외에 막대, 수평바, 바이올린 플롯 등 다양한 그래프를 적용할 수 있다.

다음 시간에는 numpy라는 모듈을 이용해 선형회귀분석 그래프를 그려 보기로 하자.

관련 글

학교 업무 자동화 - AI를 이용한 생활기록부 점검 과목별 세부능력 특기사항편
학교 업무 자동화 - AI를 이용한 생활기록부 점검 과목별 세부능력 특기사항편
학교에서 가장 의미없고 힘들며 지루한 업무를 하나 뽑으라고 하면 나는 생기부 점검을 뽑을 것이다.중학교에서는 생활기록부가 그리 중요치 않지만 고등학교에서는 입시와 관련되어 있기 때문에 무척 중요하다.문제는 이런 생기부 점검에서 찾는 것이 고작 단순 오탈자, 기재 금지용...
밑바닥부터 만들면서 배우는 LLM 7장 독서 후기 및 챌린지 후기
밑바닥부터 만들면서 배우는 LLM 7장 독서 후기 및 챌린지 후기
7장 내용은 지시를 따르도록 미세 튜닝하는 과정이다.어떤 질문에 대해 기대하는 응답을 하도록 하는 것.역시나 필요한 것은 데이터이다.1. 지시 미세 튜닝 절차여기서의 핵심은 질문-응답 데이터 셋을 준비하여 입력-출력 쌍으로 훈련시키는 것.이걸 프롬프트 스타일이라고 한다...
밑바닥부터 만들면서 배우는 LLM 6장 독서 후기
밑바닥부터 만들면서 배우는 LLM 6장 독서 후기
6장은 분류를 위한 미세 튜닝하기이다.예제로 나오는 것은 스팸 분류기 만들기.스팸 분류기는 이것이 스팸인지, 스펨이 아닌지를 분류하는 것이므로 출력의 결과가 0, 1과 같은 값으로 나와야 한다.1. 미세튜닝의 순서미세 튜닝의 과정은 모델을 훈련시키는 과정과 비슷하다.데...
밑바닥부터 만들면서 배우는 LLM 5장 독서 후기
밑바닥부터 만들면서 배우는 LLM 5장 독서 후기
오늘은 12월 14일이다.사실 챌린지 기간은 이미 2주나 지나 버렸지만, 그렇다고 후기를 포기할 순 없었다.이렇게 남기는 TIL이 나중에 피와 살이 되기 때문.코드 자체보다는 의미에 집중해서 적어보려고 한다.1. 모델의 손실 계산GPT 모델을 만든 후에 어떤 방식으로 ...
밑바닥부터 만들면서 배우는 LLM 4장 독서 후기
밑바닥부터 만들면서 배우는 LLM 4장 독서 후기
오늘이 11월 26일이니, 매일 1장식 독파하면 챌린지 성공이다.첫째와 둘째의 방해 속에서 가능할지 모르겠다.1. 더미 트랜스포머GPT 모델을 만들면서 파이토치에서 트랜스포머 더미 블록을 가져오는 것을 봤다.찾아보니 pytorch의 nn 안에는 이미 여러 트랜스포머 모...
밑바닥부터 만들면서 배우는 LLM 3장 독서 후기
밑바닥부터 만들면서 배우는 LLM 3장 독서 후기
맥북에 물을 한바가지 쏟은 후, 멘붕이 와서 3~4일 정도를 허비했다.지금 생각해보니 그냥 어차피 맥북은 나간거고, 수리 맡긴다고 생각하고 뭐라도 할걸 그랬나 싶다.어쨌든 조금 늦었지만, 그래도 끝까지 달려봐야 한다는 생각에 3장 후기를 남긴다.1. 어텐션 메커니즘3장...

댓글을 불러오는 중...