code: def boxplot(
      self,
      ax,
      bxpstats,
      notch=None,
      sym=None,
      vert=None,
      whis=None,
      positions=None,
      widths=None,
      patch_artist=None,
      bootstrap=None,
      usermedians=None,
      conf_intervals=None,
      meanline=None,
      showmeans=None,
      showcaps=None,
      showbox=None,
      showfliers=None,
      boxprops=None,
      labels=None,
      flierprops=None,
      medianprops=None,
      meanprops=None,
      capprops=None,
      whiskerprops=None,
      manage_ticks=None,
      # manage_xticks is for compatibility of matplotlib < 3.1.0.
      # Remove this when minimum version is 3.0.0
      manage_xticks=None,
      autorange=False,
      zorder=None,
      precision=None,
  ):
      def update_dict(dictionary, rc_name, properties):
          """Loads properties in the dictionary from rc file if not already
          in the dictionary"""
          rc_str = "boxplot.{0}.{1}"
          if dictionary is None:
              dictionary = dict()
          for prop_dict in properties:
              dictionary.setdefault(
                  prop_dict,
                  mat.rcParams[rc_str.format(rc_name, prop_dict)],
              )
          return dictionary
  
      # Common property dictionaries loading from rc
      flier_props = [
          "color",
          "marker",
          "markerfacecolor",
          "markeredgecolor",
          "markersize",
          "linestyle",
          "linewidth",
      ]
      default_props = ["color", "linewidth", "linestyle"]
  
      boxprops = update_dict(boxprops, "boxprops", default_props)
      whiskerprops = update_dict(
          whiskerprops, "whiskerprops", default_props
      )
      capprops = update_dict(capprops, "capprops", default_props)
      medianprops = update_dict(
          medianprops, "medianprops", default_props
      )
      meanprops = update_dict(meanprops, "meanprops", default_props)
      flierprops = update_dict(flierprops, "flierprops", flier_props)
  
      if patch_artist:
          boxprops["linestyle"] = "solid"
          boxprops["edgecolor"] = boxprops.pop("color")
  
      # if non-default sym value, put it into the flier dictionary
      # the logic for providing the default symbol ('b+') now lives
      # in bxp in the initial value of final_flierprops
      # handle all of the `sym` related logic here so we only have to pass
      # on the flierprops dict.
      if sym is not None:
          # no-flier case, which should really be done with
          # 'showfliers=False' but none-the-less deal with it to keep back
          # compatibility
          if sym == "":
              # blow away existing dict and make one for invisible markers
              flierprops = dict(
                  linestyle="none", marker="", color="none"
              )
              # turn the fliers off just to be safe
              showfliers = False
          # now process the symbol string
          else:
              # process the symbol string
              # discarded linestyle
              _, marker, color = _process_plot_format(sym)
              # if we have a marker, use it
              if marker is not None:
                  flierprops["marker"] = marker
              # if we have a color, use it
              if color is not None:
                  # assume that if color is passed in the user want
                  # filled symbol, if the users want more control use
                  # flierprops
                  flierprops["color"] = color
                  flierprops["markerfacecolor"] = color
                  flierprops["markeredgecolor"] = color
  
      # replace medians if necessary:
      if usermedians is not None:
          if len(np.ravel(usermedians)) != len(bxpstats) or np.shape(
              usermedians
          )[0] != len(bxpstats):
              raise ValueError(
                  "usermedians length not compatible with x"
              )
          else:
              # reassign medians as necessary
              for stats, med in zip(bxpstats, usermedians):
                  if med is not None:
                      stats["med"] = med
  
      if conf_intervals is not None:
          if np.shape(conf_intervals)[0] != len(bxpstats):
              err_mess = "conf_intervals length not compatible with x"
              raise ValueError(err_mess)
          else:
              for stats, ci in zip(bxpstats, conf_intervals):
                  if ci is not None:
                      if len(ci) != 2:
                          raise ValueError(
                              "each confidence interval must "
                              "have two values"
                          )
                      else:
                          if ci[0] is not None:
                              stats["cilo"] = ci[0]
                          if ci[1] is not None:
                              stats["cihi"] = ci[1]
  
      should_manage_ticks = True
      if manage_xticks is not None:
          should_manage_ticks = manage_xticks
      if manage_ticks is not None:
          should_manage_ticks = manage_ticks
  
      if LooseVersion(mat.__version__) < LooseVersion("3.1.0"):
          extra_args = {"manage_xticks": should_manage_ticks}
      else:
          extra_args = {"manage_ticks": should_manage_ticks}
  
      artists = ax.bxp(
          bxpstats,
          positions=positions,
          widths=widths,
          vert=vert,
          patch_artist=patch_artist,
          shownotches=notch,
          showmeans=showmeans,
          showcaps=showcaps,
          showbox=showbox,
          boxprops=boxprops,
          flierprops=flierprops,
          medianprops=medianprops,
          meanprops=meanprops,
          meanline=meanline,
          showfliers=showfliers,
          capprops=capprops,
          whiskerprops=whiskerprops,
          zorder=zorder,
          **extra_args,
      )
      return artists
  
imports: from pyspark.loose_version import LooseVersion
  import matplotlib
  import numpy
  from matplotlib.axes._base import _process_plot_format
  from pandas.core.dtypes.inference import is_list_like
  from pandas.io.formats.printing import pprint_thing
  from pandas.plotting._matplotlib import BarPlot, BoxPlot, HistPlot, PiePlot, AreaPlot, LinePlot, BarhPlot, ScatterPlot, KdePlot
  from pandas.plotting._core import PlotAccessor
  from pandas.plotting._matplotlib.core import MPLPlot
  from pyspark.pandas.plot import TopNPlotBase, SampledPlotBase, HistogramPlotBase, BoxPlotBase, unsupported_function, KdePlotBase
label_desc: Use image node_id 1 for calling the PandasOnSparkBoxPlot obj's underlying member method code with example usage: obj.boxplot(ax, bxpstats, notch, sym, vert, whis, positions, widths, patch_artist, bootstrap, usermedians, conf_intervals, meanline, showmeans, showcaps, showbox, showfliers, boxprops, labels, flierprops, medianprops, meanprops, capprops, whiskerprops, manage_ticks, manage_xticks, autorange, zorder, precision) and returns: artists, dictionary