티스토리 뷰

반응형

앞선 포스팅에서 기본적인 pyplot 를 활용한 그래프 틀을 만들었다.

 

[Python] matplotlib.pyplot 활용한 그래프 동적 업데이트 (1/2)

데이터가 주어졌을 때, 해당 데이터의 그래프를 그리는 정적 그래프를 그리는 것은 쉽게 구현이 가능했지만, 이전 포스팅([PYTHON] Serial Port 통신)의 목적처럼 실시간으로 외부 데이터나 업데이트

cocoabba.tistory.com

 

이번 포스팅에서는 핵심이 되는 동적으로 데이터를 업데이트하며 그래프를 다시 그리는 내용을 다루겠다.

 

먼저 앞선 Serial 통신 포스팅에서 데이터를 불러오는 예제를 들었지만, 장비가 없어서 본 예제에서는 file로 동일한

환경으로 구현하였다. 

 

file에서 한 byte 씩 불러와서 구분자까지 로드하여 일정 문자열을 추출한다. 

buffer = ""
while True:
  oneByte = f.read(1)
  if oneByte == b"\r":  # method should returns bytes
    break
    
  else:
    buffer += oneByte.decode()

res = buffer
res = res.replace("$","").replace("A", "")
value = res.split(',')

이번 예제에서는 캐리지 리턴('\r') 을 구분자로 하였다. 

이어 불필요 키워드를 제거한다.

 

이렇게 생성된 value에서 chart_update 함수 호출 이전에 xdata, y0data, y1data 를 생성한다. 

if len(xdata) == data_size -2 :# data_size 이하 처리
  xdata.pop(0)
  y0data.pop(0)
  y1data.pop(0)
  
xdata.append(x)
y0data.append(value[0])
y1data.append(value[1])
sValue = 0 if value[2]=="" else value[2]

chart_update(sValue, xdata, y0data, y1data)
time.sleep(0.5)
x += 1

이 코드는 그래프에서 최대로 보여줄 데이터 개수(data_size) 에 맞게 X 축 데이터를 연속적으로 보여줄 수 있도록

큐의 데이터형태를 유지하도로 하는 코드이다. 

 

예를 들어 data_size가 10이라고 가정했을 때

   10번째 - xdata = [1,2,3,4,5,6,7,8,9,10]

   11번째 - xdata = [2,3,4,5,6,7,8,9,10,11] 

 

처럼 되도록 첫번째 Top 위치(0)에 있는 데이터를 pop 하고, 마지막 (9)에 +1 한 데이터를 append 한다.

 

y0data, y1data, sValue는 각각 앞에서 추출한 value로부터 값을 할당한다.

 

마지막 chart_update() 함수를 보자

    def chart_update(sValue, xdata, y0data, y1data):
        SwitchText = "Switch On" if sValue == 1 else "Switch Off"
        plt.suptitle('DashBoard : ' + SwitchText, fontweight='bold', color="blue" if sValue == 1 else "red")

        lines0.set_xdata(xdata)
        lines0.set_ydata(y0data)
        lines1.set_xdata(xdata)
        lines1.set_ydata(y1data)

        ax[0].relim()
        ax[0].autoscale_view()
        ax[1].relim()
        ax[1].autoscale_view()

        figure.canvas.draw()
        figure.canvas.flush_events()

1. 전체 그래프의 제목영역에 텍스트를 sValue 값에 따라 Switch On/Off 출력 / 각 상태에 따라 글자색 blue/red로 변경

2. lines0, lines1에 해당하는 각각의 데이터를 y0 데이터, y1 데이터를 적용 업데이트 한다. 

3. relim() # limit를 초기화

4. autoscale() # 스케일 재설정

5. GUI events 업데이트 : fig.canvas.draw() / fig.canvas.flush_events()

 

적용하면 아래와 같이 실시간으로 원하는 데이터를 업데이트 가능하다.

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함