スクロールと表現しましたが、見た目はスクロールしています。しかし、実際はデータをずらして再描画しています。
再描画では画面のチラつきがあるのですが、見た目それはありません。
ソースです。
# -*- coding: utf-8 -*-
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
win = pg.GraphicsLayoutWidget(size=(500, 450), show=True)
win.setWindowTitle('ランダムデータのスクロール')
plt = win.addPlot()
plt.setRange(yRange=[-4, 4])
curve = plt.plot(pen='c')
data = np.empty(100)
ptr = 0
# update plots
def update():
global data, ptr
if ptr >= data.shape[0]:
temp = data[1:]
data = np.append(temp, np.random.normal())
else:
ptr += 1
if ptr < data.shape[0]:
data[ptr] = np.random.normal()
curve.setData(data)
timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)
if __name__ == '__main__':
pg.mkQApp().exec_()
超簡単なソースにしました。タイマーを使って50msごとに描画をします。データは100個用意しました。
ポインタptrが99まではdataにそのまま配置します。 100を超えると1から99までの99個のdataをtempにコピーします。
dataに100個目の乱数データをセットします。これで1データ分ずれたデータができました。
キモとなるところは、タイマーにイベントハンドラーupdateをセット。 opdateでデータを更新して再描画。 です。
これを応用すればリアルタイムに音声波形はその解析データなどを表示できます。
|