본문 바로가기
파이썬

파이썬 Matplotlib를 사용하여 비 차단 방식으로 플로팅

by º기록 2020. 12. 1.
반응형

나는 지난 며칠 동안 Numpy와 matplotlib를 가지고 놀았습니다. 실행을 차단하지 않고 matplotlib 플롯을 함수로 만드는 데 문제가 있습니다. 나는 이미 여기에 비슷한 질문을하는 많은 스레드가 있다는 것을 알고 있으며, 꽤 많이 검색했지만이 작업을 수행하지 못했습니다.

나는 어떤 사람들이 제안한 것처럼 show (block = False)를 사용해 보았지만 내가 얻는 것은 고정 된 창뿐입니다. 단순히 show ()를 호출하면 결과가 제대로 표시되지만 창이 닫힐 때까지 실행이 차단됩니다. 내가 읽은 다른 스레드에서 show (block = False) 작동 여부는 백엔드에 따라 다릅니다. 이 올바른지? 내 백엔드는 Qt4Agg입니다. 내 코드를보고 잘못된 것이 있으면 알려주시겠습니까? 다음은 내 코드입니다. 도움을 주셔서 감사합니다.

from math import *
from matplotlib import pyplot as plt
print plt.get_backend()



def main():
    x = range(-50, 51, 1)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4

        y = [Xi**pow for Xi in x]
        print y

        plt.plot(x, y)
        plt.draw()
        #plt.show()             #this plots correctly, but blocks execution.
        plt.show(block=False)   #this creates an empty frozen window.
        _ = raw_input("Press [enter] to continue.")


if __name__ == '__main__':
    main()

추신. 새 창을 만드는 대신 플롯 할 때마다 기존 창을 업데이트하고 싶다는 말을 잊었습니다.

 

해결 방법

 



다음은 Python 3.5에서 저에게 적합한 구현입니다.

import numpy as np
from matplotlib import pyplot as plt

def main():
    plt.axis([-50,50,0,10000])
    plt.ion()
    plt.show()

    x = np.arange(-50, 51)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4
        y = [Xi**pow for Xi in x]
        plt.plot(x, y)
        plt.draw()
        plt.pause(0.001)
        input("Press [enter] to continue.")

if __name__ == '__main__':
    main()

 

참조 페이지 https://stackoverflow.com/questions/28269157

 

 

반응형

댓글