카테고리 없음

[Python] 다양한 정규분포 그래프를 그려보자 / subplots, scatter, bar, fill_between

대장코린이 2023. 7. 18. 22:37

안녕하세요 대장코린이입니다.

오늘은 다양한 그래프를 그려볼건데요.

도움이 되었으면 좋겠습니다.

 


목차
1. 정규분포 데이터 생성
2. 그래프 여러개 그리기 : subplots, subplots_adjust
3. 산점도 그래프 그리기 : scatter
4. 막대그래프 그리기 : bar
5. 그래프 내부 채우기 : fill_between

1. 정규분포 데이터 생성

그래프를 그리기 위한 데이터로 정규분포를 사용해보겠습니다.

mu = 3 , sigma =3인 정규분포와

mu = 0, sigma = 5인 정규분포 두개를 생성했습니다.

# 모듈 불러오기
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sb

## 테마 설정
sb.set_style('whitegrid')

## 정규분포 데이터 생성
mu = 3
sigma=3
x = np.linspace(-10,10,30)
y =  (1 / np.sqrt(2 * np.pi * sigma**2)) * np.exp(-(x-mu)**2 / (2 * sigma**2))

mu=0
sigma=5
y2 = (1 / np.sqrt(2 * np.pi * sigma**2)) * np.exp(-(x-mu)**2 / (2 * sigma**2))
vmin,vmax = y.min() , y.max()

자 이제 이 정규분포를 다양한 방법으로 그려보도록 합시다.

 


2. 그래프 여러개 그리기 : subplots, subplots_adjust

먼저 도화지와 그릴 영역을 정해주기 위해 matplotlib의 subplots 함수를 사용해주도록 할게요.

fig, ax = plt.subplots(nrows=2,ncols=2,figsize=(6,6))
plt.subplots_adjust(wspace=0.3, hspace=0.3, left=0.1, bottom=0.1, right=0.94, top=0.9)
fig.suptitle('various plots',fontsize=15)

subplots은 figure와 ax를 모두 반환해줍니다.

여기서 입력값으로 들어간 nrows는 세로로 몇개의 그래프 칸을 그릴 것인지, ncols는 가로로 몇개의 그래프 칸을 그릴 것인지를 나타냅니다.

여기서 nrows = 2, ncols = 2로 입력해줬다면 2x2 총 4개의 그래프 칸이 그려지게 되겠죠?

ax의 순서는 아래 그림과 같습니다.

 subplots_adjust는 제가 시각화할 때 반드시 사용하는 함수입니다.

left, bottom, right, top을 입력해줘서 아주 간편하고 자유롭게 그래프 영역을 미세 조정 가능하기 때문에 매우 편리합니다.

wspace는 그래프들끼리 가로로 얼마나 간격을 띄울 것인지를 설정하는 것입니다. 대충 width space일까요

hspace는 그래프들끼리 세로로 얼마나 간격을 띄울 것인지를 설정하는 것입니다. height space가 아닐까,,,

 

fig.suptitle()으로 제 도화지의 제목을 설정해줍시다.

 

좀더 세세한 기능들은 아래 링크에 나와있습니다.

subplots 상세 정보 : https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplots.html

subplots_adjust 상세 정보 : https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplots_adjust.html


3. 산점도 그래프 그리기 : scatter

산점도 그래프 그리기입니다.

상황에 따라 다르겠지만 저는 산점도와 선을 같이 그리는 것을 선호해요.

color  = 'cornflowerblue'

size = 17
ax[0,0].plot(x,y,color=color,alpha=0.5)
ax[0,0].scatter(x,y, color=color,s=size)
ax[0,0].set_title('simple plot')
ax[0,0].set_ylim([vmin,vmax*1.05])

위에서부터 설명드리자면,

색은 'cornflowerblue'로 설정했습니다. 투명도를 살짝 줬을 때 파스텔 톤의 색이 나와서 제가 자주 사용하는 색이에요.

다양한 색은 https://matplotlib.org/stable/gallery/color/named_colors.html를 참고하시면 되겠습니다.

 

 

List of named colors — Matplotlib 3.7.2 documentation

List of named colors This plots a list of the named colors supported in matplotlib. For more information on colors in matplotlib see Helper Function for Plotting First we define a helper function for making a table of colors, then we use it on some common

matplotlib.org

점의 크기는 17로 설정했습니다.

 

추가로  set_title 메소드를 통해 그래프의 소제목을 설정해줬어요.

아직 메소드가 뭔지, 함수와는 뭐가 다른건지 헷갈리는 사람들이 있을 수 있는데, 그건 나중에 차차 알아가보도록 해요 ^^7

그리고 다른 그래프들과 x 범위를 일치시키기위해 set_ylim 메소드를 통해 범위를 지정해줄건데요,

여기서 "저 범위만 그려라"가 아니라 "모두 그린뒤 저 범위로 확대해라" 정도만 기억하고 가시면 훌륭할 것 같습니다~

 

 

scatter 상세정보 : https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html 


4. 막대그래프 그리기 : bar

이번엔 막대그래프를 그려볼게요.

막대그래프에서도 x축에 대해 그리는 방법과 y축에 대해서 그리는 방법이 있는데 둘다 그려보도록 해봅시다~

dx = x[1] - x[0]
ax[0,1].bar(x,y,color=color,alpha=0.5,edgecolor=color,width=dx)
ax[0,1].scatter(x,y,color=color,zorder=2,s=size)
ax[0,1].set_title('bar plot')
ax[0,1].set_ylim([vmin,vmax*1.05])

color = 'coral'
ax[1,0].barh(x,y,color=color,alpha=0.5,edgecolor=color,height=dx)
ax[1,0].scatter(y,x,color=color,zorder=2,s=size)
ax[1,0].set_title('barh plot')
ax[1,0].set_xlim([vmin,vmax*1.05])

x축에 대하여 그릴 땐 bar를 사용할건데요,

막대그래프를 빈틈없이 촘촘히 그리고 싶을 땐 width를 x 데이터 간격만큼 주면 됩니다.

추가로 색과 테두리 색을 설정해줄게요, 저는 테두리 색을 막대색과 동일하게 설정해줬습니다.

 

y축에 대하여 그릴땐 barh를 사용하는 것 말고는 동일합니다.

아 여기서는 width 대신 height를 사용하는 것도 다른점이겠네요.

 

추가로 zorder가 무엇인지 궁금할 수도 있는데, ppt에서 뒤로넘기기, 맨뒤로 넘기기같은 기능으로만 알면 되겠습니다. 저는 되게 자주써요.

bar 상세정보 : https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.bar.html


5. 그래프 내부 채우기 

마지막으로 그래프 내부를 채워볼게요~

fill_between을 사용할건데, 이름에서부터 예상 가능하듯이 두 그래프 사이의 영역을 채우는 기능입니다.

color = 'royalblue'
color2 = 'gold'
ax[1,1].fill_between(x,y,color=color,alpha=0.5)
ax[1,1].fill_between(x,y2,color=color2,alpha=0.5)
ax[1,1].set_title('fill_between')
ax[1,1].set_ylim([vmin,vmax*1.05])

원래라면 입력 인자로 x,y1,y2가 들어가서 y1과 y2 사이의 영역을 채우는데,

이번에는 y2를 생략하여 y1과 x축 사이의 영역을 채워볼게요.

 

두 그래프 모두 투명도를 줬기 때문에 겹쳐지는 가운데에서 겹쳐지는 부분이 보일거에요.

투명도를 활용하면 매우 표현 가능한 부분이 많아집니다.

fill_between 상세정보 : https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.fill_between.html


자 오늘은 이렇게 다양한 그래프를 여러개 그리는 방법에 대하여 배워봤습니다.

어렵지 않죠?

도움이 되었으면 좋겠습니다.

이만 뿅!