Hi,

Since ScatterPlotItem (and every plot item type) is an indirect sub-class 
of QtWidgets.QGraphicsObject, you can tap into any of its functionality. It 
has a visibleChanged signal which will get triggered when the trace is 
displayed or hidden by the legend click. 
https://doc.qt.io/qtforpython/PySide6/QtWidgets/QGraphicsObject.html#PySide6.QtWidgets.PySide6.QtWidgets.QGraphicsObject.visibleChanged

A simple example which synchronises the error bar visibility with a scatter 
plot item:

import numpy as np
import pyqtgraph as pg

app = pg.mkQApp("Symbols Examples")
win = pg.GraphicsLayoutWidget(show=True)
win.resize(1000,600)

pg.setConfigOptions(antialias=True)

plot = win.addPlot()
plot.addLegend()

# Scatter plot
n = 300
scatterplot = pg.ScatterPlotItem(size=10, pen=pg.mkPen(None), brush
=pg.mkBrush(255, 255, 255, 120), name="things")
pos = np.random.normal(size=(2,n), scale=1e1)
spots = [{'pos': pos[:,i], 'data': 1} for i in range(n)] + [{'pos': [0,0], 
'data': 1}]
scatterplot.addPoints(spots)
plot.addItem(scatterplot)

# Error bars
errorbars = pg.ErrorBarItem(x=pos[0], y=pos[1], top=1.0, bottom=1.0, beam=
0.5)
plot.addItem(errorbars)

def update_visibility():
errorbars.setVisible(scatterplot.isVisible())

# Connect to visibility signal provided by QtWidgets.QGraphicsObject, an 
ancestor
# class of ScatterPlotItem, update corresponding error bar visibility
scatterplot.visibleChanged.connect(update_visibility)


if __name__ == '__main__':
pg.exec()

Hopefully that will get you on the right track.
Patrick



On Monday, 15 August 2022 at 6:20:22 am UTC+9:30 [email protected] 
wrote:

> Hello! I'm a chemist trying to write some software for my lab. I'm still 
> new to coding. The software I'm writing plots unit cell parameters for a 
> large amount of data as a scatter plot with each individual data containing 
> error bars using pyqtgraph 0.12.4, Pyside6 6.2.3, and pandas 1.4.1. The 
> problem I'm having is when I click on the legend to hide a particular 
> scatter plot, the error bars are left on the plot. I'm not sure if this is 
> a bug, but it sure is annoying! I managed to create a fix; however, that 
> fix seems to produce another error that corrects itself but is super 
> annoying! Here is my fix by subclassing a few pyqtgraph items:
>
> *import *pyqtgraph *as *pg
>
> *class Custom**LegendItem**(*pg.LegendItem*)**:*
>
>     *def **__init__**(*self, ***args, ****kwargs*)*
> *:         *super*()*.__init__*(****args, ****kwargs
> *)         *self.sampleType *= *DIXBIPItemSample
>
> *class Custom**ScatterPlotItem**(*pg.ScatterPlotItem*)*
> *:     **def **__init__**(*self, ***args, ****kwargs*)*
> *:         *super*()*.__init__*(****args, ****kwargs
> *)         *self.error_item *= *kwargs.pop*(**"error_item"*, *None*
>
> *) **class Custom**ErrorBarItem**(*pg.ErrorBarItem*)*
> *:     **def **__init__**(*self, ****opts*)*
> *:         *super*()*.__init__*(*****opts
> *)         *self.path *= *
>
> *None     def **setData**(*self, ****opts*)*
> *:         *self.opts.update*(*opts
> *)         **if *self.isVisible*()*
> *:             *self.setVisible*(*all*(*self.opts*[*ax*] **is not None 
> for *ax *in **[**'x'*, *'y'**]*
> *))         **else*
> *:             *self.setVisible*(**not *all*(*self.opts*[*ax*] **is not 
> None for *ax *in **[**'x'*, *'y'**]*
> *))         *self.path *= *
> *None         *self.update
> *()         *self.prepareGeometryChange
> *()         *self.informViewBoundsChanged
>
> *() **class Custom**ItemSample**(*pg.ItemSample*)*
> *:     **def **__init__**(*self, ***args, ****kwargs*)*
> *:         *ItemSample.__init__*(*self, ***args, ****kwargs
>
> *)     **def **mouseClickEvent**(*self, event*)*
> *:         **if *event.button*() **== *Qt.MouseButton.LeftButton
> *:             *visible *= *self.item.isVisible
> *()             *self.item.setVisible*(**not *visible
> *)             **if *isinstance*(*self.item.error_item, CustomErrorBarItem
> *)*
> *:                 *self.item.error_item.setVisible*(**not *visible
> *)         *event.accept
> *()         *self.update*()*
>
> I can now use a custom class for the legend, scatter plot, and error bar 
> when adding to a plot widget. This is accomplished by passing a custom 
> error bar item (*error_item*) to a custom scatter plot item as an 
> argument.
>
> Here is the error I receive using my fix:
>
> Traceback (most recent call last):
>
>   File 
> "C:\Python310\lib\site-packages\pyqtgraph\graphicsItems\ErrorBarItem.py", 
> line 155, in boundingRect
>
>     self.drawPath()
>
>   File 
> "C:\Python310\lib\site-packages\pyqtgraph\graphicsItems\ErrorBarItem.py", 
> line 87, in drawPath
>
>     verticalLines = fn.arrayToQPath(xs, y1_y2, connect="pairs")
>
>   File "C:\Python310\lib\site-packages\pyqtgraph\functions.py", line 2147, 
> in arrayToQPath
>
>     isfinite = np.isfinite(x) & np.isfinite(y)
>
> ValueError: operands could not be broadcast together with shapes (92,) 
> (94,)
> A lot of times, a single error like the one above occurs multiple times in 
> succession which causes the error bars to flicker in the plot (same error 
> with shapes (92,) (94,) for example). It eventually stops but occurs later 
> at a random data point. Even though this error occurs, I can still toggle 
> the data points and error bars using the legend.
>
> Is there a better way to add error bars to a scatter plot and be able to 
> toggle their visibility through the legend? If not, is there anyway to 
> update my fix to avoid that error?
>
> Thanks for any and all help!
>
>
>
>
>
>
>

-- 
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/fa7f5225-b9c2-4996-89dc-1f755fdbec2cn%40googlegroups.com.

Reply via email to