들어가기에 앞서서...
python으로 데이터 시각화를 할때는 matplotlib 과 seaborn 을 많이 사용합니다. 2가지 패키지를 모두 다 알아야하며 많은 예제와 연습이 필요합니다. 이것만을 별도로 다룬 책은 (제가 보기에는 국내에) 없습니다 ㅠㅠ 보통 파이썬 책에서는 한 두 챕터 정도로만 설명하고 있으며 옵션에 대해서는 공식 문서를 참고하라는 식으로 나오는 정도입니다. 공식 문서와 몇 가지 잘 정리된 블로글 참고해서 재가공해보겠습니다. 좀 더 궁금한 것이 있다면 댓글로 달아주시면 찾아보도록 하겠습니다 :)
matplotlib 패키지를 우선적으로 알아야한다는 생각이 들어서 matplotlib 사용법에 먼저 다뤄보려고 합니다. 저는 먼저 어떤 형태의 그래프를 그릴지에 대해서는 중요하지만 그래프를 그릴 때의 옵션들을 중점적으로 보려고 합니다.
시작하겠습니다!
Matplotlib 패키지에는 pylab 라는 서브패키지가 존재합니다. 이 pylab 서브패키지는 matlab 이라는 수치해석 소프트웨어의 시각화 명령을 거의 그대로 사용할 수 있도록 Matplotlib 의 하위 API를 포장(wrapping)한 명령어 집합을 제공합니다. 간단한 시각화 프로그램을 만드는 경우에는 pylab 서브패키지의 명령만으로도 충분합니다. 다음에 설명할 명령어들도 별도의 설명이 없으면 pylab 패키지의 명령라고 생각하면 된다.
Matplotlib 패키지를 사용할 때는 보통 다음과 같이 주 패키지는 mpl 이라는 별칭(alias)으로 임포트하고 pylab 서브패키지는 plt 라는 다른 별칭으로 임포트하여 사용하는 것이 관례이므로 이를 그대로 따르겠습니다.
%matplotlib inline
주피터 노트북을 사용하는 경우에는 다음처럼 매직(magic) 명령으로 노트북 내부에 그림을 표시하도록 지정해야 합니다.
라인 플롯
이번 포스팅에서는 라인 플롯 중심으로 plt 의 라벨이나 범례, 그리드 옵션 등을 살펴보겠습니다.
가장 간단한 플롯은 선을 그리는 라인 플롯(line plot)입니다. 라인 플롯은 데이터가 시간, 순서 등에 따라 어떻게 변화하는지 보여주기 위해 사용합니다. plot 메서드를 사용하면 기본적으로 라인 플롯이 형성됩니다. 매개변수로는 데이터리스트 혹은 ndarray 객체를 넘겨주면 됩니다.
이 때 x 축의 자료 위치 즉, 틱(tick)은 자동으로 0, 1, 2, 3 이 됩니다. 만약 이 x tick 위치를 별도로 명시하고 싶다면 다음과 같이 두 개의 같은 길이의 리스트 혹은 배열 자료를 넣는다.
plot 메서드 안에서 콤마(,)를 중심으로 왼쪽이 x값 오른쪽이 y값이 됩니다.
공식 설명서를 보면 위처럼 x와 y를 넣고 그 다음에 그래프의 색깔이나 마커 타입을 넣는다고 나와 있습니다. 설명에 나온대로 x값은 안 넣고 y값만 넣고 스타일을 바로 명령을 줄 수도 있습니다.
show 명령은 시각화 명령을 실제로 차트로 렌더링(rendering)하고 마우스 움직임 등의 이벤트를 기다리라는 지시입니다. 주피터 노트북에서는 셀 단위로 플롯 명령을 자동 렌더링 해주므로 show 명령이 필요없지만 일반 파이썬 인터프리터로 가동되는 경우를 대비하여 항상 마지막에 실행하도록 합니다. show 명령을 주면 마지막 플롯 명령으로부터 반환된 플롯 객체의 표현도 가려주는 효과가 있습니다.
한글 폰트 적용
한글 폰트 설정은 설치하는 법은 나중에 따로 다루겠습니다.
위 명령어를 통해서 폰트가 있는지 여부를 확인하시고 있다면 rc parameter 설정으로 그림 전체에 적용되도록 해주시면 됩니다.
만약 객체마다 별도의 폰트를 적용하고 싶을 때는 아래와 같이 폰트 패밀리, 색상, 크기를 정하여 플롯 명령의 fontdict 인수에 넣으면 됩니다.
한글 폰트가 잘 나오는 것이 확인 됩니다 :)
스타일 지정
plot 메서드 안에서는 x값과 y값 다음 매개변수가 스타일을 나타냅니다.
색상과 마커, 선 스타일에 대한 표입니다. 공식문서를 참고하면 더 많은 색상과 마커를 알 수 있습니다.
위의 표는 굉장히 중요합니다. 옵션을 줄 때 위 표의 약자를 통해서 주기 때문입니다.
옵션들을 적용하며 라인 플롯에 스타일을 준 예시들 입니다.
구간 범위 지정
플롯 그림을 보면 몇몇 점들은 그림의 범위 경계선에 있어서 잘 보이지 않는 경우가 있을 수 있습니다. 그림의 범위를 수동으로 지정하려면 xlim 명령과 ylim 명령을 사용한다. 이 명령들은 그림의 범위가 되는 x축, y축의 최소값과 최대값을 지정한다.
xlim과 ylim은 중요합니다.
plot을 그릴 때 scale의 default는 데이터 전체에 걸쳐져 있습니다. 위의 표를 보시면 변화를 알기가 어렵습니다.
이 때 써야하는 것이 xlim과 ylim입니다.
xlim의 구간을 1947에서 1957로 한정하여서 위와 같이 변화를 확인할 수 있습니다.
추가적으로 위에서는 axis 메서드를 이용해서 xlim과 ylim을 적용하였습니다. axis메서드로 한 번에 범위를 지정하는 것을 위 코드를 통해서 확인할 수 있습니다.
틱 설정
플롯이나 차트에서 축상의 위치 표시 지점을 틱(tick)이라고 하고 이 틱에 써진 숫자 혹은 글자를 틱 라벨(tick label)이라고 합니다. 틱의 위치나 틱 라벨은 Matplotlib가 자동으로 정해주지만 만약 수동으로 설정하고 싶다면 xticks 명령이나 yticks 명령을 사용합다.
**여기서 잠깐? xtick 과 xlim은 어떤 차이일까요?**
tick 값 없이 xlim 만 줬더니 그래프가 위처럼 x축과 y축의 lim 값들이 표시되는 것을 볼 수 있습니다.
xlim 과 xtick을 둘 다 줬을 경우에는 xtick을 중심으로 값만 표시가 됩니다. 그래프 상으로 xlim도 반영은 됐지만 x축 y축에서 값이 표시되는 tick 값들만 입니다.
틱에 대한 추가 예제입니다 :)
그리드 설정
기본적으로 그리드 선은 따로 표시한다는 옵션을 주지 않으면 그래프 상에서 보이지 않는 것으로 보입니다.
grid 메서드를 false로 안줘도 그리드 선은 안 나오는 것 같습니다. 아니면 그래프마다 다른 걸까요? 그렇다면 그리드 옵션으로 조절할 필요가 있습니다. 제가 볼 때 grid 디폴트는 false인 것 같습니다. 아니라면 아니라고 누가 말해주시면 감사하겠습니다 ㅎㅎ
위 그래프에서는 grid 값을 true로 해서 메서드를 주었습니다.
겹쳐그리기
plt 객체의 plot 메서드에 여러 값을 주면 한 그래프 안에서 복수의 plot을 그릴 수 있음을 확인할 수 있습니다.
범례
여러개의 라인 플롯을 동시에 그리는 경우에는 각 선이 무슨 자료를 표시하는지를 보여주기 위해 legend 명령으로 범례(legend)를 추가할 수 있다. 범례의 위치는 자동으로 정해지지만 수동으로 설정하고 싶으면 loc 인수를 사용한다. 인수에는 문자열 혹은 숫자가 들어가며 가능한 코드는 다음과 같다.
.legend 명령을 해주지 않으면 범례가 그래프에 붙지 않아서 각 플롯이 무엇인지 그래프를 통해서만은 알기가 어려움을 위에서 알 수 있습니다.
x축, y축 라벨, 타이틀
플롯의 x축 위치와 y축 위치에는 각각 그 데이터가 의미하는 바를 표시하기 위해 라벨(label)를 추가할 수 있습니다. 라벨을 붙이려면 xlabel. ylabel 명령을 사용한다. 또 플롯의 위에는 title 명령으로 제목(title)을 붙일 수 있습니다.
annotate
다음은 어노테이션이라는 기능으로, 그래프에 화살표를 그린후, 그 화살표에 문자열을 출력하는 기능이다. 예를들어 “이값이 최소값" 이런식으로 화살표를 그려서 표현할때 사용하는데 plt.annotate 함수를 사용하면 됩니다.
plt.annotate(‘문자열',xy,xytext,arrowprops) 식으로 사용한다.
문자열은 어노테이션에서 나타낼 문자열이고, xy는 화살표가 가르키는 점의 위치, xytext는 문자열이 출력될 위치, arrowprops는 화살표의 속성으로 칼라등을 정의합니다.
마치면서...
그래프를 그릴 때 먼저 축의 범위, 이름, 타이틀 설정, 범례, 틱의 지정 이런게 제일 우선이라고 생각했습니다.
먼저 판을 그린 뒤에 필요한 그래프들을 넣어줘야 하는데 이번 포스팅에서 다루는 것이 기본적인 스케치라고 생각했기 때문입니다. 그래프를 그리면서 축의 범위 어떻게 하더라...? 범례 표시 뭐였지? 이런식으로 건망증이 빈번히 생겨서 오락가락하기 때문입니다.
물론 시각화를 많이 안해서 그런 것도 있죠...
여하튼 그래프를 그릴 때 많은 도움이 됐으면 좋겠습니다.
아래 제가 참고한 블로그들도 들어가서 보시면 많은 도움이 될 것 같습니다 :)
----참고 블로그----
위 사이트의 “Introduction to Data Visualization with Python” 코스를 참고했습니다
'데이터분석 > 데이터시각화' 카테고리의 다른 글
공공데이터 '아파트 분양가격' 동향 파악하기 - 2단계 (0) | 2020.03.08 |
---|---|
matplotlib 한글폰트 설정하기 (0) | 2020.02.28 |