본문 바로가기

데이터와 함께 탱고를/데이터 시각화

파이썬으로 데이터 시각화하기 1편. matplotlib.

쥬피터에서 데이터를 시각화 하는 일반적인 방법을 정리해보려고 한다.
1편은 matplotlib 을 다루는 것으로, 이후에 pandas, seaborn 등으로 다루기 전에, 가장 기초와 기본이 되는 상식이라 할 수 있다.


기본 형태

일반적인 matplotlib 방식을 따른다.
matploblib 를 사용하던 사람에겐 가장 친숙한 형태이고,
처음하는 사람들한테는, 가장 1차원적이고 직관적인 방법이다.

일단 기본적인 꼴은 다음과 같다.

import matplotlib.pyplot as plt

# figure, 즉 그래프를 표현할 액자를 먼저 만든다.
plt.figure()

# figure 를 출력한다.
plt.show()
<Figure size 640x480 with 0 Axes>

여기에 이제 데이터를 추가해 그래프를 그려보자.

선 그래프

plt.figure()

# (1,1), (2,2), (3,3) 의 데이터를 넣어서 그린다.
plt.plot([1,2,3], [1,2,3])

plt.show()

plt.plot([x축 데이터], [y축 데이터]) 의 꼴로 사용할 수 있다.

  • x축 데이터, y축 데이터list 다.
  • 각 x좌표의 y지점에 점을 찍어 연결한 그래프다.
  • 기본적으로 '선 그래프'로 그려진다.

찍은 점을 표현하고 싶으면 다음과 같이 marker 인자를 추가해주면 된다.

plt.figure()

# marker 인자를 같이 적는다.
plt.plot([1,2,3], [1,2,3], marker='o')

plt.show()

점의 모양은 다양하게 줄 수 있는데, 종류와 사용법은 다음 링크를 참고하면 된다.

스케터 그래프

plt.scatter([x축 데이터], [y축 데이터]) 를 사용한다.

plt.figure()

# (1,1), (2,2), (3,3) 에 점을 찍은 그래프를 그린다.
plt.scatter([1,2,3], [1,2,3])

plt.show()

막대 그래프

막대 그래프를 그리고 싶으면, plt.bar([x축 데이터], [y축 데이터]) 를 사용하면 된다.

plt.figure()

# 각 x축 데이터 지점에 y축 데이터의 길이의 막대를 그린다.
plt.bar([1,2,3], [1,2,3])

plt.show()

파이 그래프를 그리고 싶으면, plt.pie([비율 데이터]) 를 사용하면 된다.

파이 그래프

plt.figure()

# 데이터 비율이 1:2:3 인 파이 그래프를 그린다.
plt.pie([1,2,3])

plt.show()


여러개의 그래프 그리기

한 번에 여러개의 그래프를 그리려면 plt.subplots(행, 열) 를 이용하면 된다.
plt.subplots(행, 열) 은 2개의 변수를 반환하는데,
하나는 전체 액자 figure에 대한 변수고,
다른 하나는 액자 내 여러개의 액자에 대한 리스트 axs다.

fig, ax = plt.subplots(1, 3)
plt.show()

각 액자에 그래프를 그리려면 다음과 같이 plt.plot() 이 아니라, ax[i].plot() 을 사용하면 된다.
ax 는 리스트로, ax[0], ax[1] .. 에 각 액자를 하나씩 담고있다.

# 1행 3열로 액자들을 그린다.
fig, ax = plt.subplots(1, 3)

# 각 액자들에 그래프를 그린다.
ax[0].plot([1,2,3],[1,2,3], )
ax[1].bar([1,2,3],[1,2,3])
ax[2].pie([1,2,3])

plt.show()


좀 더 신경써서 그려보기

이제 대충 어떤식으로 그래프를 그리면 될지 알 수 있게 되었다.
이번에는, 조금 더 세세한 부분까지 신경써서 그래프를 다루는 법을 배워보자.

그래프 크기 변경

그래프 크기를 변경하려면, plt.figure() 안에 figsize=(가로 길이, 세로 길이) 인자를 넣어주면 된다.

# 가로 20, 세로 10인 액자를 만듬.
plt.figure(figsize=(20, 5))
plt.plot([1,2,3], [1,2,3], marker='o')
plt.show()

여러개의 그래프를 그릴 때도 마찬가지로, figsize 를 추가해주면 된다.

# 가로20, 세로10인 큰 액자 안에, 1행 3열로 액자들을 그린다.
fig, ax = plt.subplots(1, 3, figsize=(20, 5))

# 각 액자들에 그래프를 그린다.
ax[0].plot([1,2,3],[1,2,3], )
ax[1].bar([1,2,3],[1,2,3])
ax[2].pie([1,2,3])

plt.show()

그래프 칼라 변경

plt.plot() 안에 color 인자를 추가해준다.

plt.figure()
# red 색상으로 그래프를 그림
plt.plot([1,2,3], [1,2,3], color='red')
plt.show()

color 인자의 값은 다음과 같은 방식으로 줄 수 있다.

fig, ax = plt.subplots(1, 4, figsize=(20, 5))

# 각 액자들에 그래프를 그린다.
ax[0].plot([1,2,3], [1,2,3], color='C0') # matplotlib 에 정의된 색상을 써도 된다.
ax[1].plot([1,2,3], [1,2,3], color='r')  # 'red' 대신 'r'만 써도 된다.
ax[2].plot([1,2,3], [1,2,3], color='#aa1f3c') # 16진수 표기법도 가능하다.
ax[3].plot([1,2,3], [1,2,3], color=(0.5, 0.2, 0.1)) # 0~1로 정규화된 rgb 값도 가능하다. 

plt.show()

제목, 축 이름 붙이기

방법1. plt 에 직접 설정

그래프 제목은 plt.title()
각 축 이름은 plt.xlabel(), plt.ylabel() 을 사용하면 된다.

plt.figure()
plt.plot([1,2,3], [1,2,3])
plt.title("제목")
plt.xlabel("x축 이름")
plt.ylabel("y축 이름")
plt.show()

한글을 쓰면 위와 같이 폰트가 깨지는데, 한글을 지원하는 폰트를 전역적으로 다음과 같이 설정해야 한다.

plt.rcParams["font.family"] = u'AppleGothic'

이제 다시 그리면, 다음과 같이 잘 뜬다.

plt.figure()
plt.plot([1,2,3], [1,2,3])
plt.title("제목")
plt.xlabel("x축 이름")
plt.ylabel("y축 이름")
plt.show()

방법2. ax에 설정

시각화 코드들을 보다보면, plt.figure() 을 사용하지 않고, 주로 plt.subplots()을 사용하는 경우가 많은데, 이 때 ax를 이용하여 설정할 수 있다.

fig, ax = plt.subplots(1, 1)
ax.plot([1,2,3], [1,2,3])
ax.set_title("제목")
ax.set_xlabel("x축 이름")
ax.set_ylabel("y축 이름")
plt.show()

다음과 같이 여러개의 그래프에 각각 설정할 수도 있다.

fig, ax = plt.subplots(1, 2, figsize=(20, 5))

# 0번 그래프
ax[0].plot([1,2,3], [1,2,3], color='C0')
ax[0].set_title("0번 제목")
ax[0].set_xlabel("0번 x축 이름")
ax[0].set_ylabel("0번 y축 이름")

# 1번 그래프
ax[1].plot([1,2,3], [1,2,3], color='C1')
ax[1].set_title("1번 제목")
ax[1].set_xlabel("1번 x축 이름")
ax[1].set_ylabel("1번 y축 이름")

plt.show()

x축, y축 단위와 범위 바꾸기

이전과 같이 그래프를 '그냥' 그리면, 각 데이터를 파악해서 plt.plot 이 '알아서' 이쁘게 그려준다.
이 과정 중에, 각 축의 단위와 범위도 자연스럽게 자동으로 설정되는데, 이를 좀 더 커스터마이징 해보자.

축 단위 바꾸기

plt.xticks([단위 리스트]) 를 사용하면 x축 단위를 수동으로 바꿀 수 있다.
y축도 마찬가지다.

plt.figure()
plt.plot([1,2,3], [1,2,3])
plt.xticks([1,2,3]) # x축 단위 바꾸기
plt.yticks([1,2,3]) # y축 단위 바꾸기
plt.show()

단위가, 숫자가 아니라 글자면 다음과 같이 [글자 리스트]를 인자에 추가하면 된다.

plt.figure()
plt.plot([1,2,3], [1,2,3])
plt.xticks([1,2,3], ['월', '화', '수']) # x축 단위 바꾸기
plt.yticks([1,2,3], ['저', '중', '고']) # y축 단위 바꾸기
plt.show()

축 범위 바꾸기

plt.xlim([보여줄 최소값, 보여줄 최대값]) 를 사용하면 된다.
y축도 마찬가지다.

plt.figure()
plt.plot([1,2,3], [1,2,3])
plt.xlim([0, 5])  # x축 범위 바꾸기
plt.ylim([0, 10]) # y축 범위 바꾸기
plt.show()

여러 개의 그래프의 경우.

plt.subplots() 로 여러개의 그래프를 한 번에 그리는 경우, 각 그래프에 대한 접근은 모두 ax를 통해서 하면 된다.

plt.xticks()ax[i].set_yticks() 으로,
plt.xlim()ax[i].set_xlim() 로 바꾸면 된다.

다음의 예를 보면 쉽게 이해할 수 있을 것이다.

fig, ax = plt.subplots(1, 2, figsize=(20, 5))

# 0번 그래프
ax[0].plot([1,2,3], [1,2,3])
ax[0].set_xticks([1,2,3])

# 1번 그래프
ax[1].plot([1,2,3], [1,2,3])
ax[1].set_xlim([0, 5])

plt.show()

범례(legend) 표시

범례를 표시하려면, plt.plot 의 인자로 label을 설정해주고
plt.legend() 를 적어주면 된다.

plt.figure()
plt.plot([1,2,3], [1,2,3], label="그래프0")
plt.legend()
plt.show()


마무리

이번 편에서는, 어느정도 '감' 만 잡으면 된다.
더 세세하게 그리기 위해, 각 메쏘드와 함수에 넣는 인자는 엄청나게 많다.
이를 다 외울 것도 아니고, 외울 수도 없다. 그저 쓰다보면 필요한건 외워진다.

'감'을 잡기 위해 가장 기초적인 것만 간략히 설명했다.
사실 구글링 하면 matplotlib에 대해 이 글보다 더 훌륭하게 설명된 페이지가 많다.
더 훌륭한 글들을 읽고 싶다면 다음 링크들을 추천한다.

진짜로 하고싶은, 공유하고 싶은 내용은 다음 편부터다.
이 글에서는 '데이터 시각화' 를 이런 식으로 하는구나 정도로 감을 잡으면, 그게 다다.