Try putting self.update() at the d of your setDataethod?

On Fri, Aug 17, 2018, 01:51 Lior Weintraub <[email protected]> wrote:

> Hi Luke,
>
> I love pyqtgraph and use it whenever I need to plot data.
> I tried to make a live cadlestick plot but none of the options worked.
> The plot doesn't update unless I zoom in/out (interact with the window).
> The code I use:
>
> import pyqtgraph as pg
> from pyqtgraph import QtCore, QtGui
> import collections
> import numpy as np
>
> class CandlestickItem(pg.GraphicsObject):
>     data = []
>     def __init__(self):
>         pg.GraphicsObject.__init__(self)
>         self.picture = QtGui.QPicture()
>
>     def setData(self, toclh):
>         # toclh is a tuple of (time, open, close, min, max)
>         self.data.append(toclh)
>         p = QtGui.QPainter(self.picture)
>         p.setPen(pg.mkPen('w'))
>         w = 1./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):
>         ## 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)
>         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),
> ]
>
>
> class DynamicPlotter():
>     def __init__(self, sampleinterval, timewindow, size=(600,350)):
>         # Data stuff
>         self.tick_idx = 0
>         self._bufsize = int(timewindow/sampleinterval)
>         self.databuffer = collections.deque([0.0]*self._bufsize, self.
> _bufsize)
>         self.x = np.linspace(0.0, timewindow, self._bufsize)
>         self.y = np.zeros(self._bufsize, dtype=np.float)
>         # Candlestick data
>         self.candlestick_item = CandlestickItem()
>         # PyQtGraph stuff
>         self.app = QtGui.QApplication([])
>         self.plt = pg.plot(title='Plot Viewer')
>         self.plt.resize(*size)
>         self.plt.showGrid(x=True, y=True)
>         self.plt.setLabel('left', 'amplitude', 'V')
>         self.plt.setLabel('bottom', 'time', 's')
>         self.plt.setXRange(0.,timewindow)
>         self.plt.setYRange(0.,30)
>         self.curve = self.plt.plot(self.x, self.y, pen=(255,0,0))
>         self.plt.addItem(self.candlestick_item)
>
>
>         # QTimer
>         self.timer = QtCore.QTimer()
>         self.timer.timeout.connect(self.updateplot)
>         self.timer.start(1000)
>
>
>     def updateplot(self):
>         if(self.tick_idx < len(data)):
>             self.candlestick_item.setData(data[self.tick_idx])
>             self.databuffer.appendleft( 1.0 )
>             self.y[:] = self.databuffer
>             self.curve.setData(self.x, self.y)
>             self.tick_idx += 1
>         self.app.processEvents()
>
>
>     def run(self):
>         self.app.exec_()
>
>
> if __name__ == '__main__':
>     m = DynamicPlotter(sampleinterval=1., timewindow=7.)
>     m.run()
>
>
>
>
>
> Thanks,
> Lior.
>
> On Tuesday, March 12, 2013 at 11:09:20 PM UTC+2, Luke Campagnola wrote:
>>
>>
>>
>> On Tue, Mar 12, 2013 at 4:33 PM, Julio Trevisan <[email protected]>
>> wrote:
>>
>>> Hi Luke
>>>
>>> Yes, it solved my original problem! Thank you so much for this!!!
>>>
>>> May I ask you a related question? I saw your comment inside
>>> CustomGraphicsItem saying that generating a QPicture makes rendering
>>> faster. I believe that this is not the case if I want to update my plot in
>>> realtime. In such case, it would be better to draw the primitives when
>>> paint is requested. What do you think?
>>>
>>
>> That's correct; if you expect each data set to be drawn only once, then
>> using QPicture will probably slow you down. Note that if you get rid of
>> QPicture, then you'll also have to do your own bounding rectangle
>> calculations. The boundingRect() methods are called quite frequently, so
>> make sure to optimize that as much as you can. If you have trouble with
>> performance, I'd be happy to discuss the tricks I've used.
>>
>> Luke
>>
> --
> You received this message because you are subscribed to the Google Groups
> "pyqtgraph" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pyqtgraph/4ef297a8-158f-47b9-9813-135ce7a7a23c%40googlegroups.com
> <https://groups.google.com/d/msgid/pyqtgraph/4ef297a8-158f-47b9-9813-135ce7a7a23c%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyqtgraph/CACZXET_tw5GBd3tG6b_tMDrwkR5TVPq1ZhhNcYhah%2B%3DgQz1TXg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to