Python 시각화: 기본
파이썬에서 시각화 할 수 있는 여러 패키지들이 있다. 여러가지가 있지만 대표적으로 사용되는 것들은 다음과 같다.
- Plotnine: ggplot2에 기반한 라이브러리를 이용하여, 표현이 가능하다.
- Plotly: 대화식 그레프를 그려주는 라이브러리. 시각화를 위해 D3.js을 사용. 이는 자바스크립트를 기반으로한다. D3는 data driven document 을 의미한다.
- Folium: 지도데이터의 플롯팅. 지도 API이다. 지도를 화면에 그레프를 그릴 수 있다. 지도 이외에 오버레이를 할 수 있어서, 추가정보를 입힐 수 있다.
- Pyecharts: 바이두에서 데이터 시각화를 위해 만든 Echarts.js의 파이선 버전이다.
- Matplotlib: python 2D 플로팅 라이브러리. 플렛폼(운영체제)에 독립적인 대화형 환경을 제공하고, python 스크립트, python 쉘, 노트북, 웹 응용프로그램 서버에서 사용 가능.
이외 웹에서 시각화 할 수 있는 사이트들이 있는데, highcharts.com 에 소스코드를 뿌려줄 수 있다. 위의 종류중 Matplotlib와 Seaborn만 알아도 훌륭하다.
Matplotlib
matplotlib은 파이썬 2D 플로팅 라이브러리로, 플랫폼에 독립적인 대화형 환경을 제공하며, 고품질의 그림을 생성할 수 있게 해준다. 플랫폼에 독립적이지만, 다양한 환경에서 사용할 수 있어, 파이썬 스크립트, 파이썬 및 아이파이썬(IPython) 쉘, 주피터 노트북, 응용웹프로그램 서버에서도 사용이 가능하다.
시각화를 위한 시작은 아래와같다.
1 2 3 4 5 6 7 8 | import matplotlib import matplotlib.pyplot as plt %matplotlib inline %config inLineBackend.figure_format = 'retina' 고해상도를 그리기 위한 코드 %lsmagic # 매직키워드의 리스트를 보여준다. | cs |
[2] pyplot: 플롯을 그려주는 함수들을 가지고있는 서브페키지.
[4] %matplotlib inline: 객체의 주소값만 출력되는 것을, 한번에 그레프가 그려진다.
[5] %config inLineBackend.figure_format = 'retina' 고해상도를 그리기 위한 코드 . png, gif, jpeg, retina 속성들이 있다.
[6] %lsmagic: 매직키워드의 리스트를 보여준다.
%은 매직키워드라고 불리는데, 아래와 같이 두 종류가 있다.
- %: line magic 이 라인에 대한 실행 시간을 보여준다.
- %%time 10+20: cell magic. 셀에 대한 실행시간을 보여준다.
1 2 3 4 5 6 7 8 | import numpy as np import matplotlib import matplotlib.pyplot as plt plt.subplot(2, 1, 1); plt.plot(x, np.sin(x)) plt.subplot(2, 2, 3); plt.plot(x, np.cos(x)) plt.subplot(2, 2, 4); plt.plot(x, np.tan(x)) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np fig, axes = plt.subplots(2, 2) axes[0, 0].plot(x, np.sin(x)) axes[0, 1].plot(x, np.cos(x)) plt.show() # 그려주기 # 행이나 열이 하나면 차원이 하나만 드f어가야한다. fig, axes = plt.subplots(1, 2) axes[0].plot(x, np.sin(x)) # 축이 한차원 axes[1].plot(x, np.cos(x)) # 축이 한차원 plt.show() # 그려주기 | cs |
plot(x, y, data=none, [format])
선 그레프를 그려주는 함수. x, y: data가 따로 분리되어있는 경우, x와 y을 따로 따로 지정해주어야 한다. data가 데이터프레임 형식으로 있다면, x, y에 열 이름을 지정해줘도 된다. format에는 색, 점 라인을 지정할 수 있다.
'ro-': red - 실선을 의미한다.
'cv-.':
'b^:' 파란색, ^삼각형,
같은 축에 플롯을 그리면, 그레프가 덮어써진다.
'kx--': dash 선을 그릴 수 있다.
점만 표현하고 싶으면 , plot+ 'ro'포맷을 쓰거나, scatterplot을 사용할 수 있다.
참고로 ~~plot의 다른 종류의 함수는 다양하게 표현될 수 있다.
Scatterplot(x, y, s=None, c=None, alpha=None)
matplotlib의 scatter함수는 산점도를 그려준다. s는 scale을 의미하며 각 산점도의 크기를 지정할 수 있고, c는 색상을 의미하고, alpha는 산점도의 투명도를 결정한다.
1 2 3 4 5 6 7 8 9 10 11 | import matplotlib import matplotlib.pyplot as plt import numpy as np N = 50 x = np.random.rand(N) y = np.random.rand(N) colors = np.random.rand(N) area = (30* np.random.rand(N))**2 plt.scatter(x, y, s=area, c=colors, alpha=0.5) plt.show() | cs |
s: 산점도의 크기
c, color: 팔레트에서 인덱스를 적용하여 색깔을 입힘. c을 써도되고, color라고 써도된다.
marker = plot은 format 과 유사하게, {'o', '*' 등}을 사용할 수 있음
예제로, 화면을 분할에서 위의 scatter()을 이용하여, 여러가지(기본, s포함, c까지 포함, alpha까지 포함)를 그리고자 한다면 subplots, subplot을 이용하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import matplotlib import matplotlib.pyplot as plt import numpy as np N = 50 x = np.random.rand(N) y = np.random.rand(N) colors = np.random.rand(N) area = (30* np.random.rand(N))**2 fig, axes = plt.subplots(2, 2) axes[0,0].scatter(x, y) axes[0,1].scatter(x, y, s=area) axes[1,0].scatter(x, y, s=area, c= colors) axes[1,1].scatter(x, y, s=area, c= colors, alpha=0.5) plt.show() | cs |
hist()
boxplot()
violinplot()
히스토그램이 bin의 개수에 따라서, 표현이 많이 달라지는데, 커널밀도함수(kernel density funciton)를 표현해서, 데이터의 분포를 분포를 이용하여 완만하게 그려줄 수 있다. 유사하게 바이올린플롯도 kernel density function으로 이용해서, 각 자료의 구간을 완만하게 표현해주는 그레프이다.
text: 텍스트의 왼쪽 하단의 기준점이 2,0에 해당한다는 것이다.
annotate 글씨와 화살표를 같이 표기해준다.
xy= 화살표의 끝점, xytext = 텍스트가 표기될 왼쪽하단의 기준점. xycoords, textcoords= 데이터를 가지고, 축/길이를 생성, connectionstyle= 화살표의 스타일,
이 정도 매개변수랑 함수를 사용할정도면, 그만알아보고, 포토샵으로 하자.
축과 눈금 다루기
Ticker 클레스
Artist 클레스: 미적 속성. 이를 Axis(축)와 tick(눈금)이 상속받는데, Axis는 XAxis, YAxis가 상속받고, Tick은 XTick, YTick을 상속받는다.
set()은 그레프의 제목과 축의 제목, 눈금, 눈금 레이블 등을 한거번에 설정할 수 있다. 그러나 코드의 가독성이 떨어져서, set_xlim 등 따로 따로 함수를 이용해서 구분하여 그림을 그리는게 더 효과적이다.
set_xlim(), set_ylim(),
set_xticks() 눈금 위치를 리스트 형식으로 지정. 반드시 표현하고 싶은 눈금을 []리스트 내에 지정해준다. '|'의 위치를 의미한다.
set_xticklabel, set_ytickslabels: 눈금이 지정된 곳에, 레이블을 적는다.
spines: 박스의 경역
grid(True): 그레프 영역내 눈금을 설정할 경우.
bar(): barplot을 그리는 경우
barh(): barplot을 가로로 그린 경우
xvline(): vertical하게 수직선을 그리는 경우
fill(): 폐곡선을 그려서 시작점과
fill(): 0값을 기준으로 가운데를 채워주는 그레프
축의 공유
하나의 그래프를 영역에 두 개 이상의 그래프를 그리면서, 다른 축을 지정하고 싶은 경우 twinx(), twiny()) 함수를 이용해서 새로운 축 객체를 생성하여 그레프를 그리고 추긍ㄹ다르게 지정할 수 있다.
- twinx() 함수는 x축을 공유하고, y축을 오른쪽에 표시해주는 새로운 축객체를 반환
- twiny() 함수는 y축을 공유하고, x축을 위아래오 표시해주는 새로운 축객체를 반환
1 2 3 4 5 6 7 8 | fig, axes = plt.subplots() x= df['Sepal.Length'] y= df['Sepal.Width'] z= df['Petal.Width'] axes.plot(x, y, 'g^:') ax2 = axes.twinx() ax2.plot(x, z, 'bv--') | cs |
1번 라인처럼 fig객체와 axes 객체를 생성해놓고 일단 axes 객체에 그림을 그린다. 그런데 이 axes 객체에 x, y 축이 있을 텐데, 그 축 중 겹치고 싶은 축을 twin해서 사용하는 것이다(7라인)
Legend
Style
plt.style.available 스타일 찾기
plt.style.use('ggplot') ggplot으로 그리기.
Font
windows/fonts으로 들어가서 글꼴이름으로 한글을 지원하는 글꼴이름복하하면 된다.
그 이후, matplotibrc 파일 내에, font.family : 글꼴 이름을 저장한다음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # print(matplotlib.matplotlib_fname()) # rc 폴더내에 설정파일 # 또는 아래와 같아 폰트를 직접 지정 import matplotlib.font_manager as fm font_path = 'path' font_prop = fm.FontProperties(fname=font_path) plt.style.use('seaborn-paper') fig, ax1 = plt.subplots() ax1.plot(x, y1, 'g^:') ax1.set_xlabel('X data') ax1.set_ylabel('Y data', fontproperties = font_prop) ax1.tick_params(color='white') ax2 = ax1.twinx() ax2.plot(x, y2, 'r^:') ax2.set_ylabel('Y2 data') plt.savefig('foo.png') | cs |
Graph save
savefig(fname, dpi) 함수을 이용. fname: 파일명, dpi: dot per inch
1 | plt.savefig('foo.png') | cs |
PandasDataframe.plot(x=None, y=None)
x, y, kwwds:
kdwds: line, box, bar, bar 그레프에 따라 열
1 2 3 4 5 6 7 8 9 | import numpy as np import pandas as pd import seaborn as sns import satsmodels.api as sm # iris = sns.load_dataset('iris'). [7]번 라인과 같다. iris = sm.datasets.get_rdataset('iris') iris_df = iris.data plt.show() | cs |
[8] data라는 속성을 통해서 데이터 형태를 가지고 온다.
플롯에 x에는 꽃잎의 길이, y에는 꽃잎의 넓이를 표시하여, 산점도, 히스토그램, 라인, 그리고 디폴트로 박스플롯을 그리고자하면, plot에 arguments 해당하는 부분을 입력해주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # scatter plot iris_df.plot(x='petal_Length', y='Petal.Width', kind='scatter') # histogram iris_df.plot(x='petal_Length', y='Petal.Width', kind='hist') # linegraph iris_df.plot(x='petal_Length', y='Petal.Width', kind='line') # Boxplot iris_df.plot(kind='box') # figsize 변경 iris_df.plot(kind='box', figsize=(3,2)) | cs |