class_docstr: Internal base class.
  
  Concrete subclasses must implement plotting methods (e.g. `line`, `scatter`, `image`).
  A plotting method must call `self` which will effectively create a HoloViewsConverter
  and call it to return a HoloViews object.
  
  Concrete subclasses are meant to be mounted onto a datastructure property, e.g.:
  
  ```
  _patch_plot = lambda self: hvPlotTabular(self)
  _patch_plot.__doc__ = hvPlotTabular.__call__.__doc__
  plot_prop = property(_patch_plot)
  setattr(pd.DataFrame, 'hvplot', plot_prop)
  ```
class_docstr_tok: ["Internal","base","class",".","Concrete","subclasses","must","implement","plotting","methods","(","e.g",".","`","line","`",",","`","scatter","`",",","`","image","`",")",".","A","plotting","method","must","call","`","self","`","which","will","effectively","create","a","HoloViewsConverter","and","call","it","to","return","a","HoloViews","object",".","Concrete","subclasses","are","meant","to","be","mounted","onto","a","datastructure","property",",","e.g",".",":","``","`","_patch_plot","=","lambda","self",":","hvPlotTabular","(","self",")","_patch_plot.__doc__","=","hvPlotTabular.__call__.__doc__","plot_prop","=","property","(","_patch_plot",")","setattr","(","pd.DataFrame",",","'hvplot","'",",","plot_prop",")","``","`"]
code: def __call__(self, x=None, y=None, kind=None, **kwds):
      # Convert an array-like to a list
      x = list(x) if is_list_like(x) else x
      y = list(y) if is_list_like(y) else y
  
      if isinstance(kind, str) and kind not in self.__all__:
          raise NotImplementedError(
              f"kind='{kind}' for data of type {type(self._data)}"
          )
  
      if isinstance(kind, str) and kind == "explorer":
          return self.explorer(x=x, y=y, **kwds)
  
      if panel_available:
          panel_args = [
              "widgets",
              "widget_location",
              "widget_layout",
              "widget_type",
          ]
          panel_dict = {}
          for k in panel_args:
              if k in kwds:
                  panel_dict[k] = kwds.pop(k)
          dynamic, arg_deps, arg_names = process_dynamic_args(
              x, y, kind, **kwds
          )
          if dynamic or arg_deps:
  
              @pn.depends(*arg_deps, **dynamic)
              def callback(*args, **dyn_kwds):
                  xd = dyn_kwds.pop("x", x)
                  yd = dyn_kwds.pop("y", y)
                  kindd = dyn_kwds.pop("kind", kind)
  
                  combined_kwds = dict(kwds, **dyn_kwds)
                  fn_args = defaultdict(list)
                  for name, arg in zip(arg_names, args):
                      fn_args[(name, kwds[name])].append(arg)
                  for (name, fn), args in fn_args.items():
                      combined_kwds[name] = fn(*args)
                  plot = self._get_converter(
                      xd, yd, kindd, **combined_kwds
                  )(kindd, xd, yd)
                  return pn.panel(plot, **panel_dict)
  
              return pn.panel(callback)
          if panel_dict:
              plot = self._get_converter(x, y, kind, **kwds)(kind, x, y)
              return pn.panel(plot, **panel_dict)
  
      return self._get_converter(x, y, kind, **kwds)(kind, x, y)
  
imports: import itertools
  from collections import defaultdict
  import param
  from ..converter import HoloViewsConverter
  from ..util import is_list_like, process_dynamic_args
label_desc: Use image node_id 2 for calling the hvPlotBase obj's underlying member method code with example usage: obj.__call__(x, y, kind) and returns: self, self, pn, pn, pn