Python

[파이썬] 맷플롯립 (Matplotlib)

eyoo 2022. 5. 2. 16:19

matplotlib을 사용해서 차트를 통해 데이터를 분석할수 있다.

 

import matplotlib.pyplot as plt
import seaborn as sb

# 이후에 seaborn도 사용하니 미리 임포트 하자

 

가장 기본적인 차트인 플롯차트 (선형 그래프)를 만들어보자

 

in:

x = np.arange(0,10)
y = x
plt.plot(x,y)
plt.show()

out:

# x와 y를 정하고 plot함수를 통해 플롯차트를 만들었다.

# show 함수로 사용자에게 차트를 보여준다.

 

 

이렇게 만들어진 차트는 savefig를 통해 파일로 저장할수있다.

 

plt.savefig('test1.jpg')

 

 

countplot 함수를 이용하여 바 차트 (막대그래프)를 만들수 있다.

 

 

in:

sb.countplot(data = df, x = 'generation_id')
plt.show()

out:

# generation_id 데이터 관련 막대그래프가 생성되었다.

 

 

막대그래프에 파라미터를 설정하여 여러가지 형태로 보여줄수 있다.

 

in:

sb.countplot(data = df, x = 'type_1', color = sb.color_palette()[1], order = df['type_1'].value_counts().index)
plt.xticks(rotation = 45)
plt.show()

out:

# data와 x 파라미터로 데이터프레임을 설정하고 분석하는 기준을 설정해줘야 한다.

# 먼저 countplot 함수에서 제공되는 파라미터인 color에 color_palette함수로 볼수있는 색상중 두번째 색상인 오렌지 색으로 골라 설정했다.

# 그후 order 파라미터로 해당 데이터에 value_counts 함수를 사용하여 내림차순으로 정렬한 후 그 인덱스 순서를 설정했다.

# xtick함수에 rotation 파라미터를 사용하여 x축의 값들을 원하는 방향으로 회전시켜 잘 보일수 있게 설정했다.

 

 

위와 같은 데이터를 y로 설정해 다른 방향으로 그래프를 만들수 있다.

 

in:

sb.countplot(data = df, y = 'type_1', color = sb.color_palette()[1], order = df['type_1'].value_counts().index)
plt.show()

out:

 

 

데이터를 퍼센트로 비교해서 보고싶을때 파이차트를 사용한다.

 

각 데이터프레임 속 데이터 중 하나인 'generation_id' 로 파이차트를 그린다.

 

 

in:

sorted_data = df['generation_id'].value_counts()
plt.pie(sorted_data, autopct= '%.1f' , labels= sorted_data.index , startangle= 90 , wedgeprops= {'width':0.7})
plt.title('Generation Id Pie Chart')
plt.legend()
plt.show()

out:

# 먼저 파이차트에 쓰일수 있는 데이터로 가공하여 파이차트에 적용시켰다.

# autopct 파라미터로 값을 나타낼때 소수점자리를 어디까지 나타낼지 설정한다. (%. 옆의 숫자가 소수점 자리를 뜻한다.)

# labels 파라미터를 사용하여 각 파이 데이터 명을 알아볼수 있게끔 설정했다. (가공한 데이터의 인덱스로 구분할수 있으면 index함수를 활용하자)

# startangle 파라미터에 각도를 입력하여 파이 구분이 시작되는 각도를 설정할수 있다.

# legend함수로 범례를 보이게 할수있다.

 

 

구간(bin)을 설정하여 해당 구간에 포함되는 데이터가 몇개인지 세는 차트를 히스토그램이라 한다.

동일한 히스토그램 데이터에 구간을 어떻게 나누느냐에 따라 차트 모양이 바뀔수 있다.

 

속도 값을 기준으로 히스토그램을 만들어보자.

 

 

in:

plt.hist(data = df, x = 'speed', rwidth= 0.8, bins= 20)
plt.show()

out:

# rwidth 파라미터로 각 막대의 사이 넓이를 설정할수있다.

# bins 파라미터를 설정하여 구간을 조정할수있다. (기본값은 10이다.)

 

 

스피드의 최소값이 5, 최대값이 160이라 할때 간격을 균등하게 나누어 보자

 

in:

plt.hist(data = df, x='speed', rwidth= 0.8, bins = np.arange(5,167,7))
plt.show()

out:

# np.arange 함수를 사용하여 bins 값을 균등하게 설정할수있다.

 

 

subplot함수를 이용하여 하나의 차트영역에 여러 차트를 표시할수있다.

 

in:

plt.figure(figsize= (12,5))

plt.subplot(1,2,1)
plt.hist(data=df,x='speed',rwidth=0.8, bins = 10)

plt.subplot(1,2,2)
plt.hist(data=df,x='speed',rwidth=0.8, bins = 20)

plt.show()

out:

# 각각의 차트 위에 subplot을 입력시키면된다.

# 파라미터중 첫번째와 두번째는 차트영역의 행과 열을 의미하며 나머지는 몇번째에 오게할것인지 정하는 파라미터이다.

# 위의 figure함수는 figsize파라미터를 통해 차트영역의 크기를 조정할수있다.

 

 

scatter 함수로 두 컬럼간의 관계를 나타낼수있다. (상관계수 or 상관관계)

 

배기량(displ)과 연비(comb)의 관계를 scatter로 나타내보자

 

in:

plt.scatter(data = df , x = 'displ', y = 'comb')
plt.title('Displ Vs Comb')
plt.xlabel('Displacement (L)')
plt.ylabel('Combined Fuel Eff (mpg)')
plt.show()

out:

# x값과 y값으로 비교할 컬럼을 넣었다.

# 관계를 나타내는 차트는 plt.scatter 외에 sb.regplot, sb.pairplot이 있다.

 

pairplot을 사용한 예:

 

in:

sb.pairplot(data = df, vars = ['displ','comb'])
plt.show()

out:

# kind = 'reg'로 선을 그을수 있다.

 

 

 

corr 함수를 이용하여 상관계수를 알아보자

 

in:

df[['displ','comb']].corr()

out:

# 양수면 정비례, 음수면 반비례관계이며, -1 부터 1까지 표시한다.

 

 

hist2d함수를 사용해 밀도를 나타내는 heatmap을 만들수있다.

 

in:

plt.hist2d(data = df, x = 'displ',y = 'comb',cmin = 0.5, cmap = 'viridis_r' , bins = 20)
plt.title('배기량과 연비의 관계')
plt.xlabel('Displacement (L)')
plt.ylabel('Combined Fuel Eff (mpg)')
plt.colorbar()
plt.show()

out:

# 짙은 색일수록 밀도가 높음을 나타낸다.

# cmin 파라미터로 일정 값이하일때 색이 나타나지 않도록 설정한다.

# cmap을 이용해 높은값을 가진 데이터가 더 짙게 나타난다 (기본값은 값이 높을수록 노란빛을 띈다)

# colorbar함수로 범례를 나타낸다.

 

 

한국어를 나타내는 유용한 코드가 있다. 위에는 넘파이, 판다스와 같은 자주쓰이는 임포트코드들이 있으니 편하게 써보자

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

%matplotlib inline

import platform

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    path = "c:/Windows/Fonts/malgun.ttf"
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~')