Nice example, Chad!
There's another possibility--you can draw the ticks as a single
PlotCurveItem using connect='pairs'. I would guess that this is the fastest
option, but the ticks would not be scale-invariant like they are with
ScatterPlotItem (at least, not without a little extra code).

import pyqtgraph as pg
import numpy as np

x = np.cumsum(abs(np.random.normal(size=10000)))
x[1::2] = x[::2]
y = np.zeros(len(x))
y[1::2] = 1

plt = pg.plot()
c = pg.PlotCurveItem()
c.setData(x, y, connect='pairs', pen=(255, 255, 255, 100))
plt.addItem(c)


On Tue, May 23, 2017 at 6:18 AM, Chadwick Boulay <[email protected]>
wrote:

> Hi, I know this post is old but I came across it recently because I was
> trying to make a neural raster plot.
>
> For static plots, VTickGroup worked okay except it had a bug (I made a PR
> here <https://github.com/pyqtgraph/pyqtgraph/pull/485>). However, even
> with the bug fixed, this approach often caused the GUI to crash when I was
> trying to do online updating. I couldn't figure out why.
>
> Instead, I opted to use a ScatterPlotItem with a custom symbol, where the
> symbol was just a QPainterPath with 2 vertically-separated points. This
> works really well for me and I can update it very quickly. Example code is
> below.
>
> -Chad
>
> import sys
> import PyQt5
> from PyQt5.QtGui import *
> from PyQt5.QtWidgets import *
> from PyQt5.QtCore import *
> import numpy as np
> import pyqtgraph as pg
>
>
> class MyGUI(QMainWindow):
>     def __init__(self):
>         super(MyGUI, self).__init__()
>         self.setup_ui()
>         self.show()
>
>     def __del__(self):
>         pass
>
>     def setup_ui(self):
>         self.resize(800, 600)
>         self.setWindowTitle('Test Raster')
>         self.setCentralWidget(QWidget(self))  # This squeezes out docks.
>         self.centralWidget().setLayout(QVBoxLayout())
>
>         glw = pg.GraphicsLayoutWidget()
>         glw.useOpenGL(True)
>         self.centralWidget().layout().addWidget(glw)
>
>         vtick = QPainterPath()
>         vtick.moveTo(0, -0.5)
>         vtick.lineTo(0, 0.5)
>
>         p1 = glw.addPlot(row=0, col=0)
>         p1.setXRange(-0.05, 1.05)
>         p1.hideAxis('bottom')
>
>         s1 = pg.ScatterPlotItem(pxMode=False)
>         s1.setSymbol(vtick)
>         s1.setSize(1)
>         s1.setPen(QColor(*np.random.randint(0, 255 + 1, 3).tolist()))
>         p1.addItem(s1)
>
>         s2 = pg.ScatterPlotItem(pxMode=False, symbol=vtick, size=1,
>                                 pen=QColor(*np.random.randint(0, 255 + 1, 
> 3).tolist()))
>         p1.addItem(s2)
>
>         self.spis = [s1, s2]
>
>     def update(self):
>         super(MyGUI, self).update()
>         for spi_ix in range(len(self.spis)):
>             self.spis[spi_ix].setData(np.random.rand(10), spi_ix + 0.5 + 
> np.zeros((10,)))
>
>
> if __name__ == '__main__':
>     qapp = QApplication(sys.argv)
>     aw = MyGUI()
>     timer = QTimer()
>     timer.timeout.connect(aw.update)
>     timer.start(1)
>
>     if (sys.flags.interactive != 1) or not hasattr(PyQt5.QtCore, 
> 'PYQT_VERSION'):
>         QApplication.instance().exec_()
>
>
>
>
>
> On Friday, February 7, 2014 at 2:25:15 PM UTC-5, Peter Malonis wrote:
>>
>> Thanks. The GraphItem works much better.
>>
>>
>> On Thu, Feb 6, 2014 at 6:01 PM, Luke Campagnola <[email protected]>
>> wrote:
>>
>>> On Thu, Feb 6, 2014 at 4:47 PM, Peter Malonis <[email protected]> wrote:
>>>
>>>> Hello,
>>>>
>>>> I'm attempting to use pyqtgraph to create a raster plot, which is a
>>>> plot of event times each represented by a vertical line. Here's an example:
>>>> [image: an example of a matplotlib raster plot]
>>>> The first thing I tried was to make a separate PlotDataItem for each
>>>> line.  However, once the number of lines reaches around 1000, the plotting
>>>> is extremely slow or doesn't work at all.  Then I tried making an ImageItem
>>>> for the whole plot.  The problem with this is that the width of each line
>>>> depends on the zoom, including whether lines appear at all.  I suppose I
>>>> could create a class which adjusts the width of the lines in the image
>>>> depending on the range of the view box, but I'm wondering if there's not a
>>>> simpler way to do this, or if you have any advice in general.
>>>>
>>>>
>>> Hi Peter,
>>>
>>> I have two pointers for you:
>>> 1) Use a single GraphItem to draw many disconnected line segments;
>>> you'll get much better performance.
>>> 2) Have a look at the VTickGroup item; it does almost what you need, but
>>> always maintains the vertical tick position relative to the view
>>>  boundaries (it is used for marking event times along a plot curve).
>>>
>>> --
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "pyqtgraph" group.
>>> To unsubscribe from this topic, visit https://groups.google.com/d/to
>>> pic/pyqtgraph/O9kTFQ3IRjc/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to
>>> [email protected].
>>> To view this discussion on the web visit https://groups.google.com/d/ms
>>> gid/pyqtgraph/CACZXET-XEuAuj4XO%2Bt1EgTe9WFBJn%2BPtA3nq583ZF
>>> iA4cbA-jA%40mail.gmail.com.
>>>
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>
>> --
> 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/380a87fd-7c41-47b4-9edc-d1ac1efa1eda%40googlegroups.com
> <https://groups.google.com/d/msgid/pyqtgraph/380a87fd-7c41-47b4-9edc-d1ac1efa1eda%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_uwR8qpvM3FVqPJww5Dq2vPdd43euRG5B-h9wFyrAPYA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to