code: def __init__(self, pgdf: PandasGuiDataFrameStore):
      super().__init__()
  
      self.pgdf = PandasGuiDataFrameStore.cast(pgdf)
  
      self.setWindowTitle("Graph Builder")
  
      # Dropdown to select plot type
      self.type_picker = TypePicker()
  
      self.error_console = QtWidgets.QTextEdit()
      self.error_console.setReadOnly(True)
      self.error_console_wrapper = CollapsiblePanel("Grapher Console")
      self.error_console_wrapper.setContent(self.error_console)
      self.error_console_wrapper.setChecked(False)
  
      for schema in schemas:
          icon = QtGui.QIcon(schema.icon_path)
          text = schema.label
          item = QtWidgets.QListWidgetItem(icon, text)
          self.type_picker.addItem(item)
  
      # UI setup
      self.figure_viewer = FigureViewer(store=self.pgdf.store)
      self.func_ui = FuncUi(pgdf, schema=Schema())
  
      # Layouts
      self.plot_splitter = QtWidgets.QSplitter(Qt.Horizontal)
  
      self.plot_splitter.addWidget(self.func_ui)
      self.plot_splitter.addWidget(self.figure_viewer)
      self.layout = QtWidgets.QVBoxLayout()
      self.layout.addWidget(self.type_picker)
      self.layout.addWidget(self.plot_splitter)
      self.layout.addWidget(self.error_console_wrapper)
      self.setLayout(self.layout)
  
      # Size policies
      self.figure_viewer.setSizePolicy(
          QtWidgets.QSizePolicy.Expanding,
          QtWidgets.QSizePolicy.Expanding,
      )
      self.plot_splitter.setSizePolicy(
          QtWidgets.QSizePolicy.Expanding,
          QtWidgets.QSizePolicy.Expanding,
      )
      self.func_ui.setSizePolicy(
          QtWidgets.QSizePolicy.Preferred,
          QtWidgets.QSizePolicy.Preferred,
      )
      self.error_console.setSizePolicy(
          QtWidgets.QSizePolicy.Preferred,
          QtWidgets.QSizePolicy.Preferred,
      )
      self.figure_viewer.setMinimumWidth(500)
      self.figure_viewer.setMinimumHeight(500)
  
      # This has to be called at the end https://stackoverflow.com/a/68027597/3620725
      self.plot_splitter.setStretchFactor(0, 0)
      self.plot_splitter.setStretchFactor(1, 1)
  
      # Initial selection
      self.type_picker.setCurrentRow(0)
      self.on_type_changed()
  
      # Show a blank axis initially
      self.fig = plotly.graph_objs.Figure()
      self.figure_viewer.set_figure(self.fig)
  
      # Signals
      self.type_picker.itemSelectionChanged.connect(
          self.on_type_changed
      )
      self.func_ui.finished.connect(self.on_dragger_finished)
      try:
          if pgdf.store.settings.auto_finish.value:
              self.func_ui.valuesChanged.connect(
                  self.on_dragger_finished
              )
      except AttributeError:
          pass  # running Grapher solo
      self.func_ui.saving.connect(self.on_dragger_saving)
  
imports: import sys
  from PyQt5.QtWidgets import QStyleOptionViewItem
  import pandasgui
  import os
  import plotly
  from PyQt5 import QtCore, QtGui, QtWidgets
  from PyQt5.QtCore import Qt
  from pandasgui.jotly import generate_title
  from pandasgui.store import PandasGuiDataFrameStore
  from pandasgui.widgets.collapsible_panel import CollapsiblePanel
  from pandasgui.widgets.figure_viewer import FigureViewer
  from pandasgui.widgets.func_ui import FuncUi, Schema
  import logging
  from pandasgui import jotly
label_desc: Use image node_id 1 to create a new Grapher object from inherited base classes: QtWidgets with example: obj = Grapher(pgdf)