class_docstr: Class for exploring the graph of submodels of a Bokeh model.
  
  If M is such a model and X=_BokehStructureGraph(M), then:
  
  - X.model is the interactive model itself of
  the submodel graph; pass it to show or file_html.  Self contained so
  works in a jupyter notebook, no server needed.
  
  - X.graph is the networkx DiGraph of submodels.
  
  - X.property_df is a pandas dataframe including all of the properties of
  all of the submodels, with their docstrings.  Used for the datatable
  displayed when clicking on X.model
class_docstr_tok: ["Class","for","exploring","the","graph","of","submodels","of","a","Bokeh","model",".","If","M","is","such","a","model","and","X=_BokehStructureGraph","(","M",")",",","then",":","-","X.model","is","the","interactive","model","itself","of","the","submodel","graph",";","pass","it","to","show","or","file_html",".","Self","contained","so","works","in","a","jupyter","notebook",",","no","server","needed",".","-","X.graph","is","the","networkx","DiGraph","of","submodels",".","-","X.property_df","is","a","pandas","dataframe","including","all","of","the","properties","of","all","of","the","submodels",",","with","their","docstrings",".","Used","for","the","datatable","displayed","when","clicking","on","X.model"]
docstr: Returns a pandas dataframe of the properties of a bokeh model
  
  Each row contains  an attribute, its type (a bokeh property), and its docstring.
docstr_tok: ["Returns","a","pandas","dataframe","of","the","properties","of","a","bokeh","model","Each","row","contains","an","attribute",",","its","type","(","a","bokeh","property",")",",","and","its","docstring","."]
code: def _obj_props_to_df2(self, obj: Model):
      """Returns a pandas dataframe of the properties of a bokeh model
  
      Each row contains  an attribute, its type (a bokeh property), and its docstring.
  
      """
      obj_dict = obj.properties_with_values()
      types = [obj.lookup(x) for x in obj_dict.keys()]
      docs = [getattr(type(obj), x).__doc__ for x in obj_dict.keys()]
      df = {
          "props": list(obj_dict.keys()),
          "values": list(obj_dict.values()),
          "types": types,
          "doc": docs,
      }
      return df
  
file_path: bokeh/src/bokeh/models/util/structure.py
imports: from __future__ import annotations
  import logging
  from itertools import permutations
  from typing import TYPE_CHECKING
  from bokeh.core.properties import UnsetValueError
  from bokeh.layouts import column
  from bokeh.models import BoxZoomTool, CDSView, ColumnDataSource, CustomJS, DataTable, GlyphRenderer, GroupFilter, HoverTool, Label, LabelSet, MultiLine, PanTool, Plot, Range1d, ResetTool, Scatter, TableColumn, TapTool
label_desc: Use image node_id 6 for calling the _BokehStructureGraph obj's underlying member method code with example usage: obj._obj_props_to_df2(obj) and returns: df