복붙노트

[PYTHON] python matplotlib 함수에서 산점도 업데이트

PYTHON

python matplotlib 함수에서 산점도 업데이트

분산 형 플롯을 자동으로 업데이트하려고합니다. 내 X 및 Y 값의 소스는 외부이며 데이터는 예상치 않은 시간 간격 (순환)으로 자동으로 내 코드로 푸시됩니다.

모든 프로세스가 끝났을 때 모든 데이터를 플롯 할 수 있었지만 데이터를 캔버스에 지속적으로 추가하고 플롯하려고했습니다.

나가 얻는 무엇을 (전체 뛰기의 끝에) 이것이다 :

반면, 내가 겪은 일은 이것이다.

내 코드의 단순화 된 버전 :

import matplotlib.pyplot as plt

def read_data():
    #This function gets the values of xAxis and yAxis
    xAxis = [some values]  #these valuers change in each run
    yAxis = [other values] #these valuers change in each run

    plt.scatter(xAxis,yAxis, label  = 'myPlot', color = 'k', s=50)     
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()

해결법

  1. ==============================

    1.matplotlib 플롯에 애니메이션을 적용하는 방법에는 여러 가지가 있습니다. 다음은 산점도를 사용하는 두 가지 최소 예제를 살펴 보겠습니다.

    matplotlib 플롯에 애니메이션을 적용하는 방법에는 여러 가지가 있습니다. 다음은 산점도를 사용하는 두 가지 최소 예제를 살펴 보겠습니다.

    애니메이션이 발생하려면 이벤트 루프가 필요합니다. 이벤트 루프를 얻는 한 가지 방법은 plt.ion () ( "interactive on")을 사용하는 것입니다. 그런 다음 그림을 먼저 그려야하고 루프에서 플롯을 업데이트 할 수 있습니다. 루프 내부에서 캔버스를 그리고 마우스 인터랙션 등의 다른 이벤트를 처리하기 위해 잠시 멈춰야합니다. 이 일시 중지가 없으면 창이 멈 춥니 다. 마지막으로 우리는 plt.waitforbuttonpress ()를 호출하여 애니메이션이 끝난 후에도 윈도우가 열린 상태를 유지하도록합니다.

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.ion()
    fig, ax = plt.subplots()
    x, y = [],[]
    sc = ax.scatter(x,y)
    plt.xlim(0,10)
    plt.ylim(0,10)
    
    plt.draw()
    for i in range(1000):
        x.append(np.random.rand(1)*10)
        y.append(np.random.rand(1)*10)
        sc.set_offsets(np.c_[x,y])
        fig.canvas.draw_idle()
        plt.pause(0.1)
    
    plt.waitforbuttonpress()
    

    위의 대부분은 matplotlib.animation.FuncAnimation을 사용하여 자동화 할 수 있습니다. FuncAnimation은 루프와 다시 그리기를 처리하고 지정된 시간 간격 후에 함수 (이 경우 animate ())를 계속 호출합니다. 애니메이션은 plt.show ()가 호출되면 시작되어 플롯 창의 이벤트 루프에서 자동으로 실행됩니다.

    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    fig, ax = plt.subplots()
    x, y = [],[]
    sc = ax.scatter(x,y)
    plt.xlim(0,10)
    plt.ylim(0,10)
    
    def animate(i):
        x.append(np.random.rand(1)*10)
        y.append(np.random.rand(1)*10)
        sc.set_offsets(np.c_[x,y])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, 
                    frames=2, interval=100, repeat=True) 
    plt.show()
    
  2. ==============================

    2.내가 이해하는 바에 따르면, 대화 형으로 플롯을 업데이트하려고합니다. 그렇다면, 산점도 대신에 plot을 사용하고 이와 같이 여러분의 플롯의 데이터를 업데이트 할 수 있습니다.

    내가 이해하는 바에 따르면, 대화 형으로 플롯을 업데이트하려고합니다. 그렇다면, 산점도 대신에 plot을 사용하고 이와 같이 여러분의 플롯의 데이터를 업데이트 할 수 있습니다.

    import numpy
    import matplotlib.pyplot as plt 
    fig = plt.figure()
    axe = fig.add_subplot(111)
    X,Y = [],[]
    sp, = axe.plot([],[],label='toto',ms=10,color='k',marker='o',ls='')
    fig.show()
    for iter in range(5):
        X.append(numpy.random.rand())
        Y.append(numpy.random.rand())
        sp.set_data(X,Y)
        axe.set_xlim(min(X),max(X))
        axe.set_ylim(min(Y),max(Y))
        raw_input('...')
        fig.canvas.draw()
    

    이것이 당신이 찾고자하는 행동이라면, sp의 데이터를 추가하는 함수를 만들고, 그 함수에 플롯 할 새로운 점을 넣을 필요가 있습니다 (I / O 관리 또는 통신 프로세스가 무엇이든간에). 사용). 나는 그것이 도움이되기를 바랍니다.

  3. from https://stackoverflow.com/questions/42722691/python-matplotlib-update-scatter-plot-from-a-function by cc-by-sa and MIT license