2013-02-25 04:09:03 +00:00
|
|
|
"""
|
|
|
|
Demonstrate creation of a custom graphic (a candlestick plot)
|
|
|
|
|
|
|
|
"""
|
|
|
|
import initExample ## Add path to library (just for examples; you do not need this)
|
|
|
|
|
2012-08-17 20:17:09 +00:00
|
|
|
import pyqtgraph as pg
|
|
|
|
from pyqtgraph import QtCore, QtGui
|
|
|
|
|
2013-02-25 04:09:03 +00:00
|
|
|
## Create a subclass of GraphicsObject.
|
|
|
|
## The only required methods are paint() and boundingRect()
|
|
|
|
## (see QGraphicsItem documentation)
|
2012-08-17 20:17:09 +00:00
|
|
|
class CandlestickItem(pg.GraphicsObject):
|
|
|
|
def __init__(self, data):
|
|
|
|
pg.GraphicsObject.__init__(self)
|
|
|
|
self.data = data ## data must have fields: time, open, close, min, max
|
|
|
|
self.generatePicture()
|
|
|
|
|
|
|
|
def generatePicture(self):
|
2013-02-25 04:09:03 +00:00
|
|
|
## pre-computing a QPicture object allows paint() to run much more quickly,
|
|
|
|
## rather than re-drawing the shapes every time.
|
2012-08-17 20:17:09 +00:00
|
|
|
self.picture = QtGui.QPicture()
|
|
|
|
p = QtGui.QPainter(self.picture)
|
|
|
|
p.setPen(pg.mkPen('w'))
|
|
|
|
w = (self.data[1][0] - self.data[0][0]) / 3.
|
|
|
|
for (t, open, close, min, max) in self.data:
|
|
|
|
p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
|
|
|
|
if open > close:
|
|
|
|
p.setBrush(pg.mkBrush('r'))
|
|
|
|
else:
|
|
|
|
p.setBrush(pg.mkBrush('g'))
|
|
|
|
p.drawRect(QtCore.QRectF(t-w, open, w*2, close-open))
|
|
|
|
p.end()
|
|
|
|
|
|
|
|
def paint(self, p, *args):
|
|
|
|
p.drawPicture(0, 0, self.picture)
|
|
|
|
|
|
|
|
def boundingRect(self):
|
2013-02-25 04:09:03 +00:00
|
|
|
## boundingRect _must_ indicate the entire area that will be drawn on
|
|
|
|
## or else we will get artifacts and possibly crashing.
|
|
|
|
## (in this case, QPicture does all the work of computing the bouning rect for us)
|
2012-08-17 20:17:09 +00:00
|
|
|
return QtCore.QRectF(self.picture.boundingRect())
|
|
|
|
|
|
|
|
data = [ ## fields are (time, open, close, min, max).
|
|
|
|
(1., 10, 13, 5, 15),
|
|
|
|
(2., 13, 17, 9, 20),
|
|
|
|
(3., 17, 14, 11, 23),
|
|
|
|
(4., 14, 15, 5, 19),
|
|
|
|
(5., 15, 9, 8, 22),
|
|
|
|
(6., 9, 15, 8, 16),
|
|
|
|
]
|
|
|
|
item = CandlestickItem(data)
|
|
|
|
plt = pg.plot()
|
|
|
|
plt.addItem(item)
|
2013-02-25 04:09:03 +00:00
|
|
|
plt.setWindowTitle('pyqtgraph example: customGraphicsItem')
|
2012-08-17 20:17:09 +00:00
|
|
|
|
2013-02-25 04:09:03 +00:00
|
|
|
## Start Qt event loop unless running in interactive mode or using pyside.
|
|
|
|
if __name__ == '__main__':
|
|
|
|
import sys
|
|
|
|
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
|
|
|
QtGui.QApplication.instance().exec_()
|