Matplotlib에 대하여 

Matplotlib란 

Matplotlib는 Python에서 데이터들을 시각화해주는 라이브러리이다. matplotlib는 사실 다른 시각화 라이브러리들에 비해 시각적인 부분에서 뛰어나다고는 할 수 없다. 하지만 matplotlib는 적당한 수준의 시각화를 간단하게 할 수 있기 때문에 가장 대중적인 시각화 라이브러리이다. Python에서 사용되기 때문에 그때그때마다 그래프를 수정해줄 수 있다는 장점이 있다.

Maplotlib 설치하기

먼저 matplotleb를 설치를 해야한다.
matplotlib의 설치 방법은 다음과 같다.
Python을 깔고 cmd 창에 아래 코드를 치면 설치가 된다.

pip install matplolib

시작하기에 앞서..

matplotlib에는 수많은 종류의 그래프를 그릴 수 있는 메서드들이 있다. 그리고 각 그래프마다 스타일을 설정할 수 있는 게 정말 많다. 여기서는 그 모든 것을 설명해주지는 않고 그중에서 자주 쓰이는 그래프, 각 그래프마다 자주 쓰이는 스타일 설정만 알려주려고 한다.

http://matplotlib.org/gallery.html

- 다양한 시각화 예제를 보고 싶다면 위 사이트를 방문하면 된다.

https://matplotlib.org/tutorials/index.html

- 위 사이트에서는 기본적인 사용 가이드를 제공해준다.

Line plot(선 그래프)

선 그래프의 장점은 시간에 따른 추이 변화를 보기 좋다. 즉 연속적인 자료, 통적인 자료를 다룰 때 유용하다. 숫자들의 흐름을 어느 정도 파악할 수 있어 데이터가 없는 중간값도 대략 예측할 수 있다.

먼저 주요 모듈들을 import 해주겠다. 우리는 matplolib의 모듈 중 하나인 pyplot을 사용할 것이다.

참고로 기본적으로 matplotlib에서는 한글 폰트를 지원하지 않는다. 한글을 사용하고 싶다면 한글 폰트를 다운로드하여 사용해야 한다.
여기서는 나눔 고딕 폰트를 사용했다.
http://hangeul.naver.com/2017/nanum
위 사이트에서 폰트 인스톨러를 내려받아 실행한다. 
- mpl.rc('font', family='NanumGothic') 코드를 실행하면 한글 폰트 사용이 가능하다.
mpl.rc('font', family='NanumGothic')

 

아래 코드는 5년간 연도별로 축구선수 메시의 골 수를 선 그래프로 시각화한 것이다.

위에 코드를 line plot 함수의 기본 형태는 다음과 같다.

- plt.plot(x값, y값, 기타 설정들...)
- 기타 설정들의 예로는 위 코드에서 color, marker, linestyle이다. color는 선의 색깔, maker는 값이 찍히는 곳의 모양, linestyle은 선의 모양을 정할 수 있다.
- 만약 설정을 안 해줬다 해도 걱정할 필요가 없다. 값을 주지 않으면 default값이 들어가 그래프를 그리기 때문이다.

아래에서 설정들에 관한 자세한 설명을 하겠다.

기타설정 없이도 잘 그려지는 모습

1) xticks, yticks

위 그래프를 보면 자동으로 그려주는 xtick에는 2015.5등 쓸데없는 것들이 있다.
이런 것들을 xticks를 이용해 처리해줄 수 있다. 

year에 있는 값만 xtick으로 잘 들어갔음을 알 수 있다.

- rotation

지금은 label의 길이가 적당해 문제없지만 label의 수가 많아지고 길이가 길다면 알아보기 힘들어질 것이다.

예를 들어 어떤 선수의 매일 누적 골수를 기록한 데이터를 시각화해보자

x label들이 서로 겹치는 모양이다.
이럴 때는 plt.xticks(rotation)을 이용해 해결해줄 수 있다.

적당한 숫자를 줘 원하는 만큼 회전시킬 수 있다. plt.yticks를 이용하면 y label들도 똑같이 설정 가능하다.

3) 축 범위 설정하기

축 범위를 임의로 설정해 주축 범위를 임의로 설정해 줄 수 있다.
이때 2가지 방법이 있다.

- axis

axis를 이용해 x, y축의 최솟값, 최댓값을 지정해 줄 수 있다. 필수적으로 x축 최솟값, x축 최댓값, y축 최솟값, y축 최댓값을 지정해줘야 한다.

아래 코드는 기본 그래프에 상, 하, 좌, 우 여백을 만들어준다.

- 참고로 범위 지정 이외에도 axis에는 많은 기능이 있다.
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.axis.html
 위 사이트에서 다른 기능을 볼 수 있다.

- xlim, ylim

xlim, ylim를 이용해 각 축의 최솟값, 최댓값을 지정해 줄 수 있다.

3) 동시에 여러 개의 선 그리기

동시에 여러 데이터를 비교할 수 있다.

아래 코드는 메시와 호날두의 연도별 골 수를 시각화했다.

그냥 그래프를 그려주는 것은 처음과 똑같이 plt.plot을 사용해주면 된다. 하지만 그냥 그리기만 한다면 어떤 게 메시의 골이고 어떤 게 호날두의 골인지 모를 것이다. 이때 우리는 범례(legend)를 만들어 줘야 된다.

범례가 있어 어떤게 누구의 데이터인지 잘 알 수 있다.
범례의 위치 설정은 아래에서 자세히 다루도록 하겠다.

4) Line plot의 스타일 설정들 

위에 코드에서 본 plt.plot(color, maker, linestyle)을 제외하고도 수많은 것들을 직접 설정해 줄 수 있다. 수많은 설정들을 다 설명하기보다는 자주 쓰이는 설정들을 설명해주겠다.

- 모든 설정들을 보고 싶다면 
-https://matplotlib.org/3.2.1/api/lines_api.html?highlight=line#module-matplotlib.lines
matplotlib 공식 홈페이지에서 볼 수 있다.

- linestyle

linestyle='원하는 선 스타일' 형식으로 원하는 선 형태를 정할 수 있다.

https://matplotlib.org/gallery/lines_bars_and_markers/line_styles_reference.html
 자주 사용되는 기본적인 선 스타일을 볼 수 있다.
https://matplotlib.org/3.1.0/gallery/lines_bars_and_markers/linestyles.html
 좀 더 다양한 선 스타일을 볼 수 있다.

- 자주 쓰이는 기본적인 선 스타일만 정리를 해보자       

기호로 입력 선의 모양 영문로 입력
':' ·············· dotted
'-.' -·-·-·-·-· dashhot
'--' -------- dashed
'-'

solid

아래 코드는 사용 예시이다.

- color

color='원하는 색' 형식으로 원하는 색으로 선의 색을 정할 수 있다.
https://matplotlib.org/examples/color/named_colors
위 사이트에서 사용 가능한 색을 볼 수 있다.

위 홈페이지를 들어가 보면 몇몇 색은 같은 색인데 이름만 다른 것이 있음을 알 수 있다. 그 이유는 matplotlib에서는 몇몇 자주 쓰이는 기본색은 약자를 사용할 수 있게 해 두었다.

약자
blue b
cyan c
green g
black k
magenta m
red r
white w
yellow y

아래 코드는 사용 예시이다.

- marker

데이터 포인트의 위치를 나타내고 싶다면 marker를 사용하면 된다.
maker가 없어도 시각화는 가능하지만 정확한 데이터 포인트를 알기는 어렵다.

  • maker의 모양

다양한 여러 가지 marker를 사용할 수 있다.
https://matplotlib.org/3.1.0/gallery/lines_bars_and_markers/marker_reference.html
- 말로 설명하기보다는 위 사이트에 정리된 사진을 보면서 하는 것이 좋을 것이다.

아래 코드는 사용 예시이다.

  • marker의 여러 가지 설정

marker는 모양 말고도 다양한 설정이 가능하다.

호출명 설정 약자
markersize maker의 크기  ms
markeredgecolor marker의 선 색깔  mec
markeredgewidth marker의 선 굵기  mew
markerfacecolor marker의 내부 색깔  mfc


※ 색을 정하는 건 위에 color에서 했던 거와 같다.

아래 코드는 사용 예시이다.

만들고 보니 좀 이상한 모양 기긴 하지만 각 설정이 무엇을 의미하는지 잘 알아볼 수 있을 것이다.
본인 것을 시각화할 때는 예쁘게 잘 만들기를 바란다.

5) legend(범례)

한 번에 많은 데이터를 시각화하면 어느 선이 어떤 데이터인지 나타내 주는 범례가 필요하다.

- legend 만들기

plt.legend(범례 위치)를 이용해 범례를 만들 들어줄 수 있다.

동시에 여러 개의 선 그리기 파트에서 범례를 다룬 코드를 그대로 가져왔다.

이때 plt.plot()에서 선 스타일을 정할 때 범례에 들어갈 label값을 줘야 한다.

아래 코드는 label값을 주지 않았을 때 경우이다.

label 값을 준 ronaldo만 범례에 들어가 있는 모습이다. 만약 ronaldo도 label값을 주지 않았다면 아무것도 들어 있지 않은 작은 네모칸만 생긴다.

- legend 위치 조정하기

가장 기본적으로는
plt.legend(loc)을 이용해 박스 안에서의 범례의 위치를 바꿀 수 있다.
영문을 이용해도 되고 숫자를 이용해도 된다.

영문으로 입력 숫자로 입력
best 0
upper right 1
upper left 2
lower left 3
lower right 4
right 5
center left 6
center right 7
lower center 8
upper center 9
center 10

 
 영문을 이용해도 되고 숫자를 이용해도 된다.

아래 코드는 위 그래프에서 위쪽 중앙에 있는 범례를 오른쪽 상단으로 옮긴 것이다.

잘 옮겨진 모습이다.

그러나 위 방식에도 한계가 존재한다. 지금은 데이터가 적고 변동이 많이 없어 충분히 figure 박스 안에서 범례가 들어갈 빈 공간을 쉽게 찾을 수 있지만 그렇지 않을 경우도 생기기 마련이다.

여기서 만약에 messi가 2019년도에 60골을 넣었다 가정해보고 아래와 같은 Neymar의 골 수가 추가된다고 가정해보자

범례가 예쁘게 들어갈만한 figure 박스 안의 공간이 딱히 보이지 않는다. figure박스 안에 넣을 공간이 없다면 우리는 범례를 박스 밖으로 꺼내 줘야 할 것이다.
이럴 때는 bbox_to_anchor()을 사용해 박스 밖으로 범례를 꺼내 줄 수 있다.

bbox_to_anchor(x, y)을 제대로 사용하려면 안에 들어가는 숫자가 무슨 의미를 가지는지 이해를 해야 한다.
figure박스를 가로, 세로가 각각 0~1인 좌표계라 생각하고 x, y는 figure에서 범례가 들어갈 좌표를 설정해준다.
즉 왼쪽 아래에 위치시키고 싶으면 bbox_to_anchor(x, y)=(0,0) 오른쪽 위면 bbox_to_anchor (x, y)=(1,1)를 해주면 된다.
여기서 주의할 점은 bbox_to_anchor(x, y)로 범례의 순서를 정한 후 loc값을 적용한다는 것이다.
위 코드를 보면 (0.5 , 1)로 위치를 정한 후 loc ='center left'를 적용했음을 알 수 있다. 

 

위에서 다룬 스타일 설정들 중 ticks, legend, color, marker 등등은 line plot 말고도 다른 그래프들에도 공통으로 포함되어 있는 설정들이다. 그러므로 다른 그래프의 스타일을 설정할 때 line plot에서 했던 거와 똑같이 사용하면 된다. 앞으로 쓸 다른 matplotlib 그래프를 설명할 때 공통된 부분은 제외하겠다. 
728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기