class_docstr: **Bases:** :class:`GraphicsObject <pyqtgraph.GraphicsObject>`
  
  :class:`PlotDataItem` provides a unified interface for displaying plot curves, scatter plots, or both.
  It also contains methods to transform or decimate the original data before it is displayed. 
  
  As pyqtgraph's standard plotting object, ``plot()`` methods such as :func:`pyqtgraph.plot` and
  :func:`PlotItem.plot() <pyqtgraph.PlotItem.plot>` create instances of :class:`PlotDataItem`.
  
  While it is possible to use :class:`PlotCurveItem <pyqtgraph.PlotCurveItem>` or
  :class:`ScatterPlotItem <pyqtgraph.ScatterPlotItem>` individually, this is recommended only
  where performance is critical and the limited functionality of these classes is sufficient.
  
  ==================================  ==============================================
  **Signals:**
  sigPlotChanged(self)                Emitted when the data in this item is updated.
  sigClicked(self, ev)                Emitted when the item is clicked.
  sigPointsClicked(self, points, ev)  Emitted when a plot point is clicked
                                      Sends the list of points under the mouse.
  sigPointsHovered(self, points, ev)  Emitted when a plot point is hovered over.
                                      Sends the list of points under the mouse.
  ==================================  ==============================================
class_docstr_tok: ["*","*","Bases",":","*","*",":","class",":","`","GraphicsObject","<","pyqtgraph.GraphicsObject",">","`",":","class",":","`","PlotDataItem","`","provides","a","unified","interface","for","displaying","plot","curves",",","scatter","plots",",","or","both",".","It","also","contains","methods","to","transform","or","decimate","the","original","data","before","it","is","displayed",".","As","pyqtgraph","'s","standard","plotting","object",",","``","plot","(",")","``","methods","such","as",":","func",":","`","pyqtgraph.plot","`","and",":","func",":","`","PlotItem.plot","(",")","<","pyqtgraph.PlotItem.plot",">","`","create","instances","of",":","class",":","`","PlotDataItem","`",".","While","it","is","possible","to","use",":","class",":","`","PlotCurveItem","<","pyqtgraph.PlotCurveItem",">","`","or",":","class",":","`","ScatterPlotItem","<","pyqtgraph.ScatterPlotItem",">","`","individually",",","this","is","recommended","only","where","performance","is","critical","and","the","limited","functionality","of","these","classes","is","sufficient",".","==================================","==============================================","*","*","Signals",":","*","*","sigPlotChanged","(","self",")","Emitted","when","the","data","in","this","item","is","updated",".","sigClicked","(","self",",","ev",")","Emitted","when","the","item","is","clicked",".","sigPointsClicked","(","self",",","points",",","ev",")","Emitted","when","a","plot","point","is","clicked","Sends","the","list","of","points","under","the","mouse",".","sigPointsHovered","(","self",",","points",",","ev",")","Emitted","when","a","plot","point","is","hovered","over",".","Sends","the","list","of","points","under","the","mouse",".","==================================","=============================================="]
code: def updateItems(self, styleUpdate=True):
      # override styleUpdate request and always enforce update until we have a better solution for
      # - ScatterPlotItem losing per-point style information
      # - PlotDataItem performing multiple unnecessary setData calls on initialization
      styleUpdate = True
  
      curveArgs = {}
      scatterArgs = {}
  
      if styleUpdate:  # repeat style arguments only when changed
          for k, v in [
              ("pen", "pen"),
              ("shadowPen", "shadowPen"),
              ("fillLevel", "fillLevel"),
              ("fillOutline", "fillOutline"),
              ("fillBrush", "brush"),
              ("antialias", "antialias"),
              ("connect", "connect"),
              ("stepMode", "stepMode"),
              ("skipFiniteCheck", "skipFiniteCheck"),
          ]:
              if k in self.opts:
                  curveArgs[v] = self.opts[k]
  
          for k, v in [
              ("symbolPen", "pen"),
              ("symbolBrush", "brush"),
              ("symbol", "symbol"),
              ("symbolSize", "size"),
              ("data", "data"),
              ("pxMode", "pxMode"),
              ("antialias", "antialias"),
              ("useCache", "useCache"),
          ]:
              if k in self.opts:
                  scatterArgs[v] = self.opts[k]
  
      dataset = self._getDisplayDataset()
      if dataset is None:  # then we have nothing to show
          self.curve.hide()
          self.scatter.hide()
          return
  
      x = dataset.x
      y = dataset.y
      # scatterArgs['mask'] = self.dataMask
      if self.opts["pen"] is not None or (
          self.opts["fillBrush"] is not None
          and self.opts["fillLevel"] is not None
      ):  # draw if visible...
          # auto-switch to indicate non-finite values as interruptions in the curve:
          if (
              isinstance(curveArgs["connect"], str)
              and curveArgs["connect"] == "auto"
          ):  # connect can also take a boolean array
              if dataset.containsNonfinite is False:
                  # all points can be connected, and no further check is needed.
                  curveArgs["connect"] = "all"
                  curveArgs["skipFiniteCheck"] = True
              else:  # True or None
                  # True: (we checked and found non-finites)
                  #   don't connect non-finites
                  # None: (we haven't performed a check for non-finites yet)
                  #   use connect='finite' in case there are non-finites.
                  curveArgs["connect"] = "finite"
                  curveArgs["skipFiniteCheck"] = False
          self.curve.setData(x=x, y=y, **curveArgs)
          self.curve.show()
      else:  # ...hide if not.
          self.curve.hide()
  
      if self.opts["symbol"] is not None:  # draw if visible...
          ## check against `True` too for backwards compatibility
          if self.opts.get("stepMode", False) in ("center", True):
              x = 0.5 * (x[:-1] + x[1:])
          self.scatter.setData(x=x, y=y, **scatterArgs)
          self.scatter.show()
      else:  # ...hide if not.
          self.scatter.hide()
  
imports: import math
  import warnings
  import bisect
  import numpy
  from ..None import debug
  from ..None import functions
  from ..None import getConfigOption
  from ..Qt import QtCore
  from .GraphicsObject import GraphicsObject
  from .PlotCurveItem import PlotCurveItem
  from .ScatterPlotItem import ScatterPlotItem
label_desc: Use image node_id 29 for calling the PlotDataItem obj's underlying member method code with example usage: obj.updateItems(styleUpdate) without return types