본문 바로가기
프로그래밍 언어/Python 3

[Python 3] Real time plotting하기

by UltraLowTemp-Physics 2024. 11. 2.
728x90

센서에서 특정 물리량을 실시간으로 측정하는 경우나 인터넷 등의 실시간 데이터를 plotting하는 경우 모두, Real time plotting이 필요합니다. 이번 포스트에서는 파이썬에서 어떻게  Real time plotting을 하는지에 대해서 간략하게 정리를 하였습니다.

크게 Real time plotting을 하는 방법은 두 가지로 나뉩니다. 
  ▪ `while True:`를 이용하여 계속 Plot을 업데이트 하는 방법 
  ▪ `aimate.FuncAnimation()` 힘수를 이용하는 것 

1. while True 사용

아래는 `while True:` 를 사용하여 Plot을 업데이트 하는 코드입니다. 

import matplotlib.pyplot as plt
import numpy as np

plt.ion()
fig = plt.figure() # this commend make the upper figure 
ax = fig.add_subplot()
# Define the windows in the figures 
plt.ylim([0, 1023]) # Set the window of the y-axix
plt.xlim([0,100])   # Set the window of the x-axis


# Generating the random data for showing the real-time plotting
data = np.random.randint(0, 1023, size=(50,))

# plotting the data
line, = ax.plot(data)
ax.set_xlabel('Time (ms)')
ax.set_ylabel('Data')
ax.set_title('Realtime data plot')
ax.legend(['Data'], loc='upperright')

# For the real time plotting, we use while True: 
while True:
	new_data = np.randomw.randint(0,1023) # If the device reads the signal, then the signal should be assigned in new_data
    data = np.append(data, new_data)      # the new data have to be added into the existing dataset 
    
    # Assumption: In this example, let's suppose that we only show the recent 100 data from the dataset. 
    if (len(data)) > 100:
    	data = data[-100:]
    line.set_ydata(data)                   # put y-coordinates in the data 
    line.set_xdata(np.arrange(len(data))   # put x-coordinates corresponding to y-point from the data 
    
    plt.draw()        # plotting the updated data on fig 
    plt.pause(0.1)    # Pause the figure by 0.1 seconds.

 

2. Animation Code 사용하기

아래는 `matplotlib`의 `animation` 모듈을 사용하는 코드입니다. 아래의 예제에서는 센서에서 감지되는 데이터 대신에 Random number를 사용하여 실시간 plotting을 보여주고 있습니다. 

import random     # As an illustration, random number will be used in the code
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation 
from itertools import count 

# Create figure for plotting 
fig = plt.figure()
ax  = fig.add_subplot()

x_vals = []
y_vals = []

index = count() # using the count() function in itertools, the x-index is updated whenenver index is called. 

def animate(i): 
    # To demonstrate the real time plot, the random number is used.
    # The randomly generated numbers are added into the original datasets (x_vals, y_vals)
    x_vals.append(next(index))          # x-vals that automatically increases by 1 by calling next(index)
    y_vals.append(random.randint(0,5))  
    
    ax.clear()  # clear the plot. If it doesn't exist, then the new generated plots keep superimposing the old plots.
    ax.plot(x_vals, y_vals)
    
    # Format for plot 
    plt.subplots_adjust(bottom=0.3)
    plt.title('Real time plotting example')
    plt.ylabel('Abs')
    plt.xlabel('Time (sec)')
    

ani = FuncAnimation(plt.gcf(), animate, interval = 1000)
# 1) plt.gcf(): get the current figure 
# 2) 
# 3) 

plt.tight_layout() # In order to add the automatic padding in the layout 
plt.show()         # shown the figure

위 코드는 크게 2가지로 나뉩니다. 
  ▪ `def animate()`: 위 함수의 역활은
         1) 센서로부터 데이터를 받은 후,
         2) 그 데이터를 원래의 데이터셋에 저장,
         3) 그 후 업데이트 된 데이터셋을 plotting하는 함수입니다. 
  ▪ `FuncAnimation()`: 위의 `animate()` 함수에서 생성된 plot을 지정된 `interval` 후에 실시간으로 업데이트가 되도록 하는 함수입니다. 
      - `interval`: 기본적으로 밀리초 단위. (즉, `interval=1000`은 1초에 해당) 
  

 

 

 

728x90

댓글