code: def plot_univariate_ecdf(self, estimate_kws, legend, **plot_kws):
      estimator = ECDF(**estimate_kws)
  
      # Set the draw style to step the right way for the data variable
      drawstyles = dict(x="steps-post", y="steps-pre")
      plot_kws["drawstyle"] = drawstyles[self.data_variable]
  
      # Loop through the subsets, transform and plot the data
      for sub_vars, sub_data in self.iter_data(
          "hue",
          reverse=True,
          from_comp_data=True,
      ):
          # Compute the ECDF
          if sub_data.empty:
              continue
  
          observations = sub_data[self.data_variable]
          weights = sub_data.get("weights", None)
          stat, vals = estimator(observations, weights=weights)
  
          # Assign attributes based on semantic mapping
          artist_kws = plot_kws.copy()
          if "hue" in self.variables:
              artist_kws["color"] = self._hue_map(sub_vars["hue"])
  
          # Return the data variable to the linear domain
          ax = self._get_axes(sub_vars)
          _, inv = _get_transform_functions(ax, self.data_variable)
          vals = inv(vals)
  
          # Manually set the minimum value on a "log" scale
          if isinstance(inv.__self__, mpl.scale.LogTransform):
              vals[0] = -np.inf
  
          # Work out the orientation of the plot
          if self.data_variable == "x":
              plot_args = vals, stat
              stat_variable = "y"
          else:
              plot_args = stat, vals
              stat_variable = "x"
  
          if estimator.stat == "count":
              top_edge = len(observations)
          else:
              top_edge = 1
  
          # Draw the line for this subset
          (artist,) = ax.plot(*plot_args, **artist_kws)
          sticky_edges = getattr(artist.sticky_edges, stat_variable)
          sticky_edges[:] = 0, top_edge
  
      # --- Finalize the plot ----
      ax = self.ax if self.ax is not None else self.facets.axes.flat[0]
      stat = estimator.stat.capitalize()
      default_x = default_y = ""
      if self.data_variable == "x":
          default_y = stat
      if self.data_variable == "y":
          default_x = stat
      self._add_axis_labels(ax, default_x, default_y)
  
      if "hue" in self.variables and legend:
          artist = partial(mpl.lines.Line2D, [], [])
          alpha = plot_kws.get("alpha", 1)
          ax_obj = self.ax if self.ax is not None else self.facets
          self._add_legend(
              ax_obj,
              artist,
              False,
              False,
              None,
              alpha,
              plot_kws,
              {},
          )
  
imports: from numbers import Number
  from functools import partial
  import math
  import textwrap
  import warnings
  import numpy
  import pandas
  import matplotlib
  import matplotlib.pyplot
  import matplotlib.transforms
  from matplotlib.cbook import normalize_kwargs
  from matplotlib.colors import to_rgba
  from matplotlib.collections import LineCollection
  from ._base import VectorPlotter
  from ._statistics import ECDF, Histogram, KDE
  from ._stats.counting import Hist
  from .axisgrid import FacetGrid, _facet_docs
  from .utils import remove_na, _get_transform_functions, _kde_support, _check_argument, _assign_default_kwargs, _default_color
  from .palettes import color_palette
  from .external import husl
  from .external.kde import gaussian_kde
  from ._docstrings import DocstringComponents, _core_docs
label_desc: Use image node_id 16 for calling the _DistributionPlotter obj's underlying member method code with example usage: obj.plot_univariate_ecdf(estimate_kws, legend) without return types