I managed to find a solution using QPainter. I just re-purposed the
candlestick example. I cant believe I didn't think of that before.
import pyqtgraph as pg
from pyqtgraph import QtCore, QtGui
import numpy as np
class LinePlot(pg.GraphicsObject):
def __init__(self, data):
pg.GraphicsObject.__init__(self)
pg.setConfigOptions(antialias=True)
self.data = data
self.width = 2
self.pos = (55,108,91,255)
self.neg = (131,54,70,255)
self.generatePicture()
def generatePicture(self):
self.picture = QtGui.QPicture()
p = QtGui.QPainter(self.picture)
for i in range(len(self.data)-1):
if data[i] > data[i+1] :
p.setPen(pg.mkPen(self.neg, width = self.width))
else:
p.setPen(pg.mkPen(self.pos,width = self.width))
p.drawLine(QtCore.QPointF(i, self.data[i]), QtCore.QPointF(i+1,
self.data[i+1]))
def paint(self, p, *args):
p.drawPicture(0, 0, self.picture)
def boundingRect(self):
return QtCore.QRectF(self.picture.boundingRect())
if __name__ == '__main__':
import sys
data = np.random.normal(size=1000)
item = LinePlot(data)
p1 = pg.plot()
p1.addItem(item)
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
On Monday, 5 February 2018 03:31:27 UTC-8, Jannis Mainczyk wrote:
>
> Hi Mike,
>
> I would be interested in your solution. I have a similar problem, where I
> want to hide certain values without creating new PlotItems each time.
> Painting them black would also do the job :-)
>
> I will also have a go at it the next time I touch my plotting module.
>
> Cheers,
> Jannis
>
> On Friday, 2 February 2018 08:10:37 UTC+1, Mike Oliver wrote:
>>
>> Thanks Carlos, Ill look into that.
>>
>> On Wednesday, 31 January 2018 01:40:25 UTC-8, Carlos Pascual wrote:
>>>
>>> Hi Mike,
>>>
>>> With this approach you are creating as many curve objects as segments,
>>> and on
>>> top of that you are doing a for loop on each point of your data so it is
>>> reasonable to expect it to be very inefficient.
>>>
>>> Have you considered deriving from pyqtgraph.PlotDataItem and reimplement
>>> its
>>> paint() method to pass a different QPainter depending on the segment
>>> being
>>> painted?
>>>
>>> Not sure if that would be the best (or simpler) approach, but it is what
>>> I
>>> would first try...
>>>
>>> Cheers,
>>> Carlos
>>>
>>>
>>>
>>>
>>> On Wednesday, January 31, 2018 12:37:40 AM CET Mike Oliver wrote:
>>> > So I managed to get this working but its incredibly slow on large data
>>> > sets. Is there a better way to do this?
>>> >
>>> > from pyqtgraph.Qt import QtGui, QtCore
>>> > import pyqtgraph as pg
>>> > import numpy as np
>>> >
>>> > win = pg.GraphicsWindow()
>>> > p1 = win.addPlot()
>>> > values = [10,50,8,64,45,9,6,12,6,43,3,7,33,67,82,42,12,7,40,8]
>>> >
>>> > for i in range(len(values)-1):
>>> > if values[i]>values[i+1]:
>>> > p1.plot([i,i+1],values[i:i+2], pen=(255,0,0))
>>> > else:
>>> > p1.plot([i,i+1],values[i:i+2], pen=(0,255,0))
>>> >
>>> > if __name__ == '__main__':
>>> > import sys
>>> > if (sys.flags.interactive != 1) or not hasattr(QtCore,
>>> 'PYQT_VERSION'):
>>> > QtGui.QApplication.instance().exec_()
>>>
>>>
>>> --
>>> +----------------------------------------------------+
>>> Carlos Pascual Izarra
>>> Scientific Software Coordinator
>>> Computing Division
>>> ALBA Synchrotron [http://www.albasynchrotron.es]
>>> Carrer de la Llum 2-26
>>> E-08290 Cerdanyola del Valles (Barcelona), Spain
>>> E-mail: [email protected]
>>> Phone: +34 93 592 4428
>>> +----------------------------------------------------+
>>>
>>
--
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/6f13333b-921c-4fdf-9d01-a3ab210f6012%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.