본문 바로가기
공부/파이썬 Python

ipywidgets 인터랙션 함수 작성 (Python ipywidgets)

by 혼밥맨 2022. 5. 21.
반응형

ipywidgets 인터랙션 함수 작성 (Python ipywidgets)

 

ipywidgets은 jupyter-widget 또는 간단히 위젯이라고도 하는 ipywidget은 Jupyter 노트북 및 IPython 커널용 인터랙티브 HTML 위젯입니다. 인터랙티브 위젯을 사용하면 노트북이 활성화됩니다. 사용자는 자신의 데이터를 제어하고 데이터의 변경 사항을 시각화할 수 있습니다.

 

ipywidgets 설치

1
pip install ipywidgets
cs

1. 간단한 산점도 (Scatter) 그리기

필요 라이브러리

1
2
3
import ipywidgets
import numpy as np
import matplotlib.pyplot as plt
cs

 

산점도를 그리는 함수 작성하기

1
2
3
4
5
6
7
# weight = 1
# noise = np.random.normal(size=100)
 
def plot_function(w=1):
  X = np.random.uniform(05, size=100)
  y = 2 * X + w * np.random.normal(size=100)
  plt.scatter(X, y)
cs

가중치 (weight)는 1을 고정으로 설정하고, 정규 노이즈를 사이즈 100으로 랜덤하게 갖는 산점도를 그린다. 

이렇게 산점도를 그리면 아래와 같이 일반적인 플랏이 된다.

그런데 만약 가중치 (weight)를 0에서 부터 10까지 한 번에 확인해보고 싶다면 어떻게 할 수 있을까?

for loop 0에서 10까지 플로팅을 하는 방법이 있을 것이고,

일일이 weight를 한 번 씩 수정해가면서 실행하는 방법이 있을테다.

그런데 ipywidgets은 한 줄의 코드로, 그것도 interactive하게 가중치 변화에 따른 산점도를 확인할 수 있게 도와준다.

1
2
# Interactive ipywidgets function
ipywidgets.interact(plot_function, w=(0100.5))
cs

weight가 10일 때

weight가 5일 때

weight가 1일 때

weight는 0에서부터 10까지 0.5 간격으로 interactive하게 확인할 수 있게 됐다. 그런데 슬라이드 바(slide bar)로 weight를 조정할 때 마다 noise random 변수가 변하는 문제가 발생했다..

1
2
3
4
5
6
7
8
9
# weight = 1
# noise = np.random.normal(size=100)
 
= np.random.uniform(05, size=100)
noise =  np.random.normal(size=100)
 
def plot_function(w=1):
  y = 2 * X + w
  plt.scatter(X, y)
cs

노이즈 변수를 함수 안에 선언해서 문제가 발생한 것이다. 순수히 weight의 변화에 따른 동일한 랜덤 변수의 산점도를 확인하고 싶다면, 위 코드 처럼 랜덤 변수는 함수 밖에서 선언하면 된다.

weight가 0.5 일 때

weight가 2.5 일 때

 

2. 사인 함수 그리기

고등학생 때 sin, cos, tan, hypertangent, secant 등등 외우느라 고생했었는데 ..

1
2
3
4
5
6
7
8
def plot_sin(start=0, end=30, factor=1, grid=False, plot_cos=False):
  X = np.linspace(start, end, (end-start) * 10)
  y = np.sin(X) * factor
  plt.grid(grid)
  plt.plot(X, y)
  if plot_cos:
    y = np.cos(X)
    plt.plot(X, y)
cs

이제는 ipywidgets으로 모든 plotting을 interactive하게 만들 수 있다는 것을 알기 때문에 응용이 가능하다.

sine함수를 그리는 함수를 가져오고

ipywidgets으로 부르면 라인을 작성하면 된다.

1
ipywidgets.interact(plot_sin, start=(0101), end=(20501), factor=(0,5,0.1), grid=False)
cs

그러면 시작, 끝, 높이를 선택할 수 있는 sine함수가 나타난다!

 

 

3. 인터랙티브 히스토그램 그리기

1
2
3
4
def plot_hist(mu=0, sigma=1, n=100, bins=10, color="blue"):
  plt.xlim(-2020)
  X = np.random.normal(mu, sigma, n)
  plt.hist(X, bins=bins, color=color)
cs

히스토그램을 그리는 함수를 만들어 볼 수 있다. 

1
ipywidgets.interact(plot_hist, mu=(-10,10,0.5), sigma=(0,10,0.1), n=(1010001), bins=(1,100,1), color=["red","green","blue"])
cs

반응형

댓글