Data science/Python

Python 시각화: 기본

연금(Pension)술사 2019. 5. 30. 10:48


파이썬에서 시각화 할 수 있는 여러 패키지들이 있다. 여러가지가 있지만 대표적으로 사용되는 것들은 다음과 같다.

  • 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. 셀에 대한 실행시간을 보여준다.

Figure 객체
Matplotlib에서 그래프를 그리기 위한 객체. 그레프를 그리기 위한 도화지라고 생각하면 된다. 이 도화지를 plt.subplots()으로 분할해서 각 부분에 그레프를 그리는 방식으로 시각화한다. subplot도 있고, subplots도 있는데, 도화지를 나눠서 그리고 싶다면, 어쨋든 둘다 사용이 가능한데, 사용하는 방법만 다르다.


Subplot(nrows, ncols, index, **kwargs)
분할하기 위한 row, column을 지정해줘야한다. 예를 들어, 위 아래로 분할하고 싶으면, (2 rows, 1 columns, 1번째) . ( 2 rows, 1 columns, 2번째) 로 나눠서 지정하면된다. 화면을 나눠 가면서, 부르는 것을 axis라고 하는데, 나눠가면서 그릴 때 사용하는게 subplot이다.

args에 입력을 다음과 같이하면 된다.
만약 화면을, 2x2로 나누고 싶다면, (2,2,1), (2,2,2), (2,2,3), (2,2,4) 이렇게 나눌 수 있는데, 221,222,223,224이렇게 연달아서 써도 된다. 
위에 1개. 아래에 2개로 표현하고 싶을 때, 221, 223, 224 이렇게 쪼갤 수 있다.
어찌 되었는 이 함수의 리턴값은 Figure 객체와 axes.Axes 객체를 반환한다. 

1
2
3
4
5
6
7
8
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
 
plt.subplot(211); plt.plot(x, np.sin(x))
plt.subplot(223); plt.plot(x, np.cos(x))
plt.subplot(224); plt.plot(x, np.tan(x))
 
cs


plt.show() 을 쓰면 객체 주소가 나오지 않는다.

Subplots(nrow, ncol, sharex=False, Shrey=False, .... fig_kw)
미리 나눠놓고 한번에 그리는 방법. 이 객체 함수 또한 리턴값으로 figure 객체와 axes 객체가 리턴이 된다. Figure 객체는 도화지이기 때문에, 우리는 그림을 그릴 때, 어느 구역에서 그릴지만 지정해주면 된다. 바로 axis[0,0], axis[0,1] 처럼 몇 번째 구역에 그릴 것인지, 바로 직관적으로 그릴 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
 
fig, axes = plt.subplots(22
axes[00].plot(x, np.sin(x))
axes[01].plot(x, np.cos(x))
plt.show() # 그려주기
 
# 행이나 열이 하나면 차원이 하나만 드f어가야한다.
fig, axes = plt.subplots(12
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
= 50
= np.random.rand(N)
= 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
= 50
= np.random.rand(N)
= np.random.rand(N)
colors = np.random.rand(N)
area = (30* np.random.rand(N))**2
 
fig, axes = plt.subplots(22)
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




반응형