[Matplotlib] 애니메이션 만들기 초간단 방법

반응형
    반응형

    Matplotlib으로 초간단 애니메이션 만들기

    가장 접근하기 쉬운 matplotlib로 애니메이션 그림을 만드는 방법입니다. 애니메이션은 사실 여러가지 방법이 있을 걸로 아는데 초간단으로 만드는 방법 알려드리겠습니다.

    plt.pause를 이용하기

    matplotlib에는 pause라는 정지 메쏘드가 있습니다. 내가 지정한 시간만큼 정지하고 다음 작업을 진행합니다. pause를 이용해 애니메이션처럼 만들 수 있는데요. for문과 함께 활용하면 쉽게 만들 수 있습니다.

    예제로 랜덤으로 정수를 1000천 선택하고 그 선택한 정수를 하나씩 찍는 애니메이션을 만들어보겠습니다.

    import matplotlib.pyplot as plt
    import numpy as np
    import random
    
    x_values = []
    y_values = []
    
    for i in range(1000):
        x_values.append(random.randint(0,100))
        y_values.append(random.randint(0,100))
    
        if i %5 == 0:
        plt.xlim(0,100)
        plt.ylim(0,100)
        plt.scatter(x_values,y_values,color = 'black')
        plt.pause(0.0001)
    
    plt.show()

     

     

    i 를 넣은 이유는 속도를 좀 더 빠르게 하고자 했습니다. 현재 갯수는 중요하지 않으니까요.

    pause를 이용해 애니메이션을 만들 때 주의할 것은 반드시 py 파일로 해야 위 그림처럼 팝업창이 뜹니다. 쥬피터로 하면 팝업창이 뜨지 않아서 아래 출력창에 그림 천장 나오게 됩니다.

     

    회귀분석 예측선 그리기

    회귀분석의 예측선을 그리는 과정을 pause를 이용해 만들어보겠습니다.
    아래 코드는 LinearRegression을 이용해 회귀선을 그리고 예측선을 찾아가는 과정입니다.

    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.linear_model import LinearRegression
    import random
    
    x_values = []
    y_values = []
    
    reg = LinearRegression()
    
    for i in range(1000):
    
        plt.clf() ## 선 한개로 통일
        x_values.append(random.randint(0,100))
        y_values.append(random.randint(0,100))
    
        x = np.array(x_values).reshape(-1,1)
        y = np.array(y_values).reshape(-1,1)
    
        if i %5 == 0:
            reg.fit(x,y)
            plt.xlim(0,100)
            plt.ylim(0,100)
            plt.scatter(x_values,y_values,color = 'black')
    
                 plt.plot(list(range(100)),reg.predict(np.array([x for x in range(100)]).reshape(-1,1)))
    
            plt.pause(0.0001)
    plt.show()

    파란색 선이 결정되는 과정을 실시간으로 보게 됩니다.

     

     

    수학식 움직이기

    import random
    import numpy as np
    import matplotlib.pyplot as plt
    import math
    
    x_values = []
    y_values = []
    
    for i in range(500):
        x = random.randint(-100,100)
        x_values.append(x)
        formula = math.sin(x)
        y_values.append(formula)
    
        if i%5==0:
            plt.xlim(-100,100)
            plt.ylim(-2,2)
            plt.scatter(x_values,y_values,color = 'black')
            plt.pause(0.0001)
    
    plt.show()

     

    한계점

    pause로 간편하게 애니메이션을 그릴 수 있다는 건 너무 좋지만 한계가 있습니다. 첫번째로, 표현하는 게 한정됩니다. for문으로 하기 때문에 점을 그리거나 완성된 선이 움직이는 정도만 가능합니다. 수학함수를 손으로 그리는것처럼 선을 그리는 건 불가능해보입니다.

    두번째로는, 대부분의 머신러닝의 과정을 보려면 for문으로 나타내야하는데 이미 모델링된 완성된 코드를 불러오기 때문에 모델을 다 분해해서 일일히 만들지 않으면 애니메이션으로 구현하기 가 어렵습니다.

    마치며

    pause를 이용해서 애니메이션을 해보았는데요. 간단한 애니메이션은 바로 적용할 수 있을 용도로 쓰면 아주 좋을 것 같습니다.

     

     

     

    댓글

    Designed by JB FACTORY

    ....