파이썬

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

fecu 2023. 11. 15.

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

 

 

파이썬 데이터 시각화 입문 6 : 연습문제

이번에는 데이터 시각화 연습문제이다. 기존 자료를 쓰면 또 재미없지 않은가? 새로운 데이터를 이용해보자. 1. 파일 및 문제 아래 파일은 공공데이터 포털에서 받은 연간 범죄 발생 건수, 검거

fecu.tistory.com

 

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

 

1. Subplots

 

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

 

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

 

axis 안의 내용을 확인해보면 각각의 축이 2행 2열의 형태로 들어있는 것을 확인할 수 있다. 모두 객체이기 때문에 따로따로 다루는 것이 가능하다.

 

 

주피터 노트북에서는 그래프도 바로 그려준다. 아직 입력된 내용이 없기에 아무것도 없는 4개의 그래프가 나타난다.

 

 

그래프를 하나씩 채워보자. 동일한 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

 

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

 

 

각각의 그래프 객체에 접근해서 세부적인 수정을 해줄 수 있다. 예전에 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()

 

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

 

 

나머지 그래프도 같은 방식으로 고쳐보자. 하드코딩으로 고치는 것은 멋지지 않으니 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

 

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

 

 

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)

 

 

데이터의 열 중에 '해킹'이 포함된 것을 모두 찾아보았다. 그래프는 총 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]]

 

 

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

 

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문으로 만들어 전체 그래프를 그리도록 만들자.

 

 

전체 코드를 for문 안으로 넣고 바꿔야 할 부분들을 바꾸어 준다. 먼저 축 부분을 axis[i][j] 로 바꿔야 하는데 하나씩 바꾸면 힘들고 멋지지 않다. Alt + Shift + 마우스 드래그를 해주면 멀티커서가 활성화된다. [0][0] 부분을 지우고 [i][j] 로 바꾸어 준다.

 

 

 

코드를 모두 수정하면 아래와 같이 된다. 이걸 실행하면 그래프를 잘 그려준다.

 

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를 이용해 범례의 위치를 변경할 수 있다.

 

 

이제 코드가 완성되었다. 다른 데이터를 확인하고 싶다면 cols에 담는 열이름만 바꿔주면 된다. 이번에는 '도박'으로 바꿔보았다. 그리고 나머지 코드를 실행하면 자동으로 도박에 대한 그래프를 그려준다.

 

 

 

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

 

 

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

 

 

3. 글을 마치며

 

오늘은 matplotlib에서 subplots를 이용하는 법에 대해 알아보았다. 여기서는 단순하게 plot만을 이용해 그래프를 그렸지만 이 이외에 막대, 수평바, 바이올린 플롯 등 다양한 그래프를 적용할 수 있다. 다음 시간에는 numpy라는 모듈을 이용해 선형회귀분석 그래프를 그려 보기로 하자. 그럼 끝.

댓글

💲 추천 글