Gnat Heatmap chart using pyqtgraph

329 views
Skip to first unread message

Gully G

unread,
Mar 3, 2017, 3:01:04 AM3/3/17
to pyqtgraph
Hi,

How to code for a realtime gnat-heatmap chart with pyqtgraph?  How do I create each of the rectangle and update them every second?




Gully G

unread,
Mar 3, 2017, 3:40:10 AM3/3/17
to pyqtgraph
What I have tried is this


import sys
import numpy as np
import datetime

from PyQt4.QtCore import QTime, QTimer
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg

from collections import deque

import pytz
UNIX_EPOCH_naive = datetime.datetime(1970, 1, 1, 0, 0) #offset-naive datetime
UNIX_EPOCH_offset_aware = datetime.datetime(1970, 1, 1, 0, 0, tzinfo = pytz.utc) #offset-aware datetime
UNIX_EPOCH = UNIX_EPOCH_naive

TS_MULT_us = 1e6

class RectangleItem(pg.GraphicsObject):
def __init__(self, topLeft, size):
pg.GraphicsObject.__init__(self)
self.topLeft = topLeft
self.size = size
self.generatePicture()

def generatePicture(self):
self.picture = QtGui.QPicture()
p = QtGui.QPainter(self.picture)
p.setPen(pg.mkPen('w'))
tl = QtCore.QPointF(self.topLeft[0], self.topLeft[1])
size = QtCore.QSizeF(self.size[0], self.size[1])
p.drawRect(QtCore.QRectF(tl, size))
p.end()

def paint(self, p, *args):
p.drawPicture(0, 0, self.picture)

def boundingRect(self):
return QtCore.QRectF(self.picture.boundingRect())


def now_timestamp(ts_mult=TS_MULT_us, epoch=UNIX_EPOCH):
return(int((datetime.datetime.utcnow() - epoch).total_seconds()*ts_mult))

def int2dt(ts, ts_mult=TS_MULT_us):
return(datetime.datetime.utcfromtimestamp(float(ts)/ts_mult))

def dt2int(dt, ts_mult=TS_MULT_us, epoch=UNIX_EPOCH):
delta = dt - epoch
return(int(delta.total_seconds()*ts_mult))

def td2int(td, ts_mult=TS_MULT_us):
return(int(td.total_seconds()*ts_mult))

def int2td(ts, ts_mult=TS_MULT_us):
return(datetime.timedelta(seconds=float(ts)/ts_mult))

class TimeAxisItem(pg.AxisItem):
def __init__(self, *args, **kwargs):
# super().__init__(*args, **kwargs)
super(TimeAxisItem, self).__init__(*args, **kwargs)

def tickStrings(self, values, scale, spacing):
# PySide's QTime() initialiser fails miserably and dismisses args/kwargs
#return [QTime().addMSecs(now_timestamp()).toString('mm:ss') for value in values]
return [int2dt(value).strftime("%H:%M:%S.%f") for value in values]



class MyApplication(QtGui.QApplication):
def __init__(self, *args, **kwargs):
super(MyApplication, self).__init__(*args, **kwargs)
self.t = QTime()
self.t.start()
self.data=[]

#maxlen = 20
self.data_x = deque()
self.data_y = deque()

self.win = pg.GraphicsWindow(title="Basic plotting examples")
self.win.resize(1000,600)

tai = TimeAxisItem(orientation='bottom')
self.plot = self.win.addPlot(title='Timed data', axisItems={'bottom': TimeAxisItem(orientation='bottom')})
#self.plot.setYRange(0, 150)
self.curve = self.plot.plot()

self.tmr = QTimer()
self.tmr.timeout.connect(self.update)
self.tmr.start(100)

self.y = 100

def update(self):
self.data.append({'x': self.t.elapsed(), 'y': np.random.randint(0, 100)})
x = now_timestamp()
self.y = self.y + np.random.uniform(-1, 1)

self.data_x.append(x)
self.data_y.append(self.y)
self.curve.setData(x=list(self.data_x), y=list(self.data_y))
self.plotui = pg.PlotWidget()

item2 = RectangleItem([x,x+2], [self.y, self.y+2])
self.plotui.addItem(item2)

def main():
app = MyApplication(sys.argv)
sys.exit(app.exec_())

if __name__ == '__main__':
main()

But it is not showing 
Reply all
Reply to author
Forward
0 new messages