파이썬을 이용한 데이터 시각화라 하면 가장 먼저 고려하게 되는 것이 matplotlib이 아닐까 싶은데요. 정말 많은 기능들이 탑재되어 있어서 활용 가능성이 무궁무진한 라이브러리라고 생각됩니다.
본 포스팅에서는 이를 이용하여 파이썬으로 간단한 그래프들을 그릴 수 있는 기초적인 사용방법에 대해 다루어 볼까 합니다.
matplotlib 설치
터미널에 아래 명령어 실행을 통해 설치하실 수 있습니다.
pip install matplotlib
사용하시는 환경에 따라 아래 명령어를 대신 실행해야할 수도 있습니다.
pip3 install matplotlib
그래프 그리기
저는 예시로 한국의 2011 ~ 2023년까지의 인구성장율을 그래프로 그려 보겠습니다.
자료 출처: https://www.index.go.kr/unify/idx-info.do?idxCd=4227
import matplotlib.pyplot as plt
years = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023]
population = [0.77, 0.53, 0.46, 0.63, 0.53, 0.40, 0.28, 0.43, 0.35, 0.14, -0.18, -0.23, -0.14]
plt.plot(years, population, color="b", marker="o", linestyle="--")
plt.title('Population increase in South Korea')
plt.ylabel('unit %')
plt.savefig('population_graph.png', dpi = 600)
plt.show()
위에 코드를 실행하시면 아래와 같은 그래프를 얻을 수 있는데요.
결과:
라인별로 무엇을 의미하며 어떻게 위와 같은 결과를 만들 수 있었는지 아래 설명을 참고해주세요.
import matplotlib.pyplot as plt
matplotlib 라이브러리에서 pyplot이라는 서브 라이브러리를 불러오는 것입니다. 간단하게 말하여 pyplot은 MATLAB이라는 수치해석 프로그램의 기능을 사용할 수 있도록 하는 함수들을 모아놓은 모듈입니다.
pyplot은 plt라는 모듈별칭을 사용하는 것이 관례입니다.
years = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023]
x-axis, x 축에 들어갈 값들을 years라는 변수에 리스트 자료형으로 선언했습니다.
population = [0.77, 0.53, 0.46, 0.63, 0.53, 0.40, 0.28, 0.43, 0.35, 0.14, -0.18, -0.23, -0.14]
y-axis, y 축에 들어갈 값들을 population라는 변수에 리스트 자료형으로 선언했습니다.
plt.plot(years, population, color="b", marker="o", linestyle="--")
그래프에 사용될 데이터를 준비했다면, plot() 함수를 통해 그래프를 생성할 수 있습니다.
매개변수로 먼저 x축과 y축 값들을 순차적으로 넣습니다.
그리고, color, marker, linestyle 매개변수로 그래프에 원하는 색상, 마커와, 선 스타일을 선택할 수 있습니다. 다음 테이블에서 원하시는 마커, 색상, 또는 라인 스타일을 고르실 수 있습니다.
marker 마커 | 설명 |
---|---|
'.' | 포인트 마커 |
',' | 픽셀 마커 |
'o' | 원 마커 |
'v' | 삼각형_아래쪽 마커 |
'^' | 삼각형 위쪽 마커 |
'<' | 삼각형_왼쪽 마커 |
'>' | 삼각형_오른쪽 마커 |
'1' | tri_down 마커 |
'2' | tri_up 마커 |
'3' | tri_left 마커 |
'4' | tri_right 마커 |
'8' | 팔각형 마커 |
's' | 사각형 마커 |
'p' | 오각형 마커 |
'P' | 플러스(채워진) 마커 |
'*' | 별표식 |
'h' | 육각형1 마커 |
'H' | 육각형2 마커 |
'+' | 플러스 마커 |
'x' | x 마커 |
'X' | x(채워진) 마커 |
'D' | 다이아몬드 마커 |
'd' | 얇은 다이아몬드 마커 |
'|' | v라인 마커 |
'_' | h라인 마커 |
linestyle 라인 스타일 | 설명 |
---|---|
'-' | 실선 스타일 |
'--' | 점선 스타일 |
'-.' | 점선 스타일 |
':' | 점선 스타일 |
color 색상 | 설명 |
---|---|
'b' | 파란색 |
'g' | 녹색 |
'r' | 빨간색 |
'c' | 청록색 |
'm' | 마젠타 |
'y' | 노란색 |
'k' | 검은색 |
'w' | 하얀색 |
이 세가지 옵션밖에도 매개변수로 선택할 수 있는 것들이 많지만, 대표적으로 많이 사용되는 것들을 추려보았습니다. 자세한 것은 링크를 참고해주세요.
plt.title('Population increase in South Korea')
title() 함수는 맨 위에 보이는 그래프의 타이틀 또는 제목을 지정합니다. 매개변수로 원하는 문구를 문자열로 넣으시면 됩니다.
plt.ylabel('unit %')
ylabel() 함수를 통해 y축에 라벨을 추가할 수 있습니다. 매개변수로 원하는 라벨을 넣으시면 됩니다. 마찬가지로 xlabel() 함수를 호출하여 x축에 라벨을 추가할 수도 있습니다.
plt.savefig('population_graph.png', dpi = 600)
savefig() 함수로 그래프를 파일로 저장할 수 있습니다. 먼저, 원하는 확장자를 포함하는 파일명을 문자열로 첫 번째 매개변수로 지정하고, dpi를 지정했습니다.
파일은 현재 파이썬 .py 파일이 존재하는 디렉토리에 생성됩니다.
dpi는 dot per inch의 약자로 그래프의 해상도를 의미합니다. 이 외에 savefig() 함수에 대해 자세히 알고 싶으시다면 링크를 참고해주세요.
plt.show()
마지막으로 show() 함수를 호출하면 지금까지 함수들을 호출하면서 생성한 그래프를 보실 수 있습니다. 새로운 팝업창에 그래프가 출력됩니다. 아무리 코드를 잘 써도 마지막에 show() 함수를 호출하지 않으면 결과를 볼 수 없으니 잊지말고 마지막에 호출하셔야 합니다.
그래프 합치기
이제 여러개의 그래프를 하나의 좌표평면에 그리는 방법에 대해 알아보겠습니다.
import matplotlib.pyplot as plt
x = [x for x in range(31)]
y = [x ** 2 for x in range(31)]
z = [x ** 3 for x in range(31)]
plt.plot(x, x, label = 'linear')
plt.plot(x, y, label = 'quadratic')
plt.plot(x, z, label = 'cubic')
plt.xlabel('x')
plt.ylabel('y')
plt.title('linear vs quadratc vs cubic')
plt.grid()
plt.legend()
plt.show()
단순하게 show() 함수를 호출하기 전에 합치고 싶은 개수만큼 plot() 함수를 호출하여 그래프를 생성하면 됩니다. plot 하나당 하나의 그래프라고 이해하시면 편합니다.
예시로, y=x, y=x^2 그리고 y=x^3 함수를 x값 0부터 30까지 그려보았습니다. 여러개의 그래프를 한 번에 그리다 보니 구분하기 쉽게 label 매개변수로 그래프 각각 이름을 지정하고, legend() 함수로 범례를 생성한 모습입니다. (grid()로 줄도 그었습니다.)
결과:
물론 한 화면에 여러개의 좌표평면을 그릴 수도 있습니다.
import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 2, figsize=(7, 7))
x = [x for x in range(101)]
y = [x**2 for x in range(101)]
z = [x**3 for x in range(101)]
a = [x**4 for x in range(101)]
ax[0, 0].plot(x, x, color="r")
ax[0, 0].set_title("y=x")
ax[1, 0].plot(x, y, color="b")
ax[1, 0].set_title("y=x^2")
ax[0, 1].plot(x, z, color="g")
ax[0, 1].set_title("y=x^3")
ax[1, 1].plot(x, a, color="y")
ax[1, 1].set_title("y=x^4")
fig.suptitle('functions compared')
plt.show()
중요한 점은 subplots() 함수를 통해 몇 행, 몇 열의 좌표평면을 생성할 것인지, figsize 매개변수로 각 좌표평면의 사이즈를 지정하는 것입니다. 위 예시에서는 2행 2열로 총 4개의 좌표평면을, figsize = (7, 7)으로 가로, 세로가 모두 7인치인 좌표평면을 생성하였습니다.
2차원말고 1차원 나열도 가능합니다. (4행 1열 : fig, ax = plt.subplots(4, figsize=(7, 7)), 1행 4열: fig, ax = plt.subplots(1, 4, figsize=(7, 7)))
subplots() 함수는 fig와, ax 두 개의 객체를 반환합니다. 이 두 객체를 통해 여러 작업을 실행할 수 있는데요.
예로, ax[행,열].plot() 함수를 호출하면 해당하는 행과 열의 원하는 그래프를 생성할 수 있습니다. 또한 ax[행,열]로 예시처럼 해당 위치에 있는 그래프에 접근하여 set_title() 함수 등으로 제목을 설정하는 작업 등이 가능합니다. (1차원으로 subplots 크기를 정하신 경우 ax[행] 또는 ax[열]로 그에 맞게 접근하셔야 됩니다.)
fig 객체의 suptitle() 함수로 이미지 전체의 제목도 설정할 수 있습니다.
결과:
다음 링크에서 subplots() 함수에 대해 더 자세히 알아보실 수 있습니다.
마무리
이렇게 matplotlib 라이브러리를 이용해서 파이썬으로 간단한 그래프를 생성하는 방법에 대해 알아보았습니다. 이 밖에도 본 포스팅에서 다루지 못 한 여러가지 기능들이 있으며, 막대 그래프, 히스토그램, 파이 차트, 산포도 그래프, 상자 차트 등등 다양한 그래프도 지원하니 공식 웹사이트를 한 번 참고하셔도 좋을 것 같습니다.