| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | import reimport pydocfrom .external.docscrape import NumpyDocStringclass DocstringComponents:    regexp = re.compile(r"\n((\n|.)+)\n\s*", re.MULTILINE)    def __init__(self, comp_dict, strip_whitespace=True):        """Read entries from a dict, optionally stripping outer whitespace."""        if strip_whitespace:            entries = {}            for key, val in comp_dict.items():                m = re.match(self.regexp, val)                if m is None:                    entries[key] = val                else:                    entries[key] = m.group(1)        else:            entries = comp_dict.copy()        self.entries = entries    def __getattr__(self, attr):        """Provide dot access to entries for clean raw docstrings."""        if attr in self.entries:            return self.entries[attr]        else:            try:                return self.__getattribute__(attr)            except AttributeError as err:                # If Python is run with -OO, it will strip docstrings and our lookup                # from self.entries will fail. We check for __debug__, which is actually                # set to False by -O (it is True for normal execution).                # But we only want to see an error when building the docs;                # not something users should see, so this slight inconsistency is fine.                if __debug__:                    raise err                else:                    pass    @classmethod    def from_nested_components(cls, **kwargs):        """Add multiple sub-sets of components."""        return cls(kwargs, strip_whitespace=False)    @classmethod    def from_function_params(cls, func):        """Use the numpydoc parser to extract components from existing func."""        params = NumpyDocString(pydoc.getdoc(func))["Parameters"]        comp_dict = {}        for p in params:            name = p.name            type = p.type            desc = "\n    ".join(p.desc)            comp_dict[name] = f"{name} : {type}\n    {desc}"        return cls(comp_dict)# TODO is "vector" the best term here? We mean to imply 1D data with a variety# of types?# TODO now that we can parse numpydoc style strings, do we need to define dicts# of docstring components, or just write out a docstring?_core_params = dict(    data="""data : :class:`pandas.DataFrame`, :class:`numpy.ndarray`, mapping, or sequence    Input data structure. Either a long-form collection of vectors that can be    assigned to named variables or a wide-form dataset that will be internally    reshaped.    """,  # TODO add link to user guide narrative when exists    xy="""x, y : vectors or keys in ``data``    Variables that specify positions on the x and y axes.    """,    hue="""hue : vector or key in ``data``    Semantic variable that is mapped to determine the color of plot elements.    """,    palette="""palette : string, list, dict, or :class:`matplotlib.colors.Colormap`    Method for choosing the colors to use when mapping the ``hue`` semantic.    String values are passed to :func:`color_palette`. List or dict values    imply categorical mapping, while a colormap object implies numeric mapping.    """,  # noqa: E501    hue_order="""hue_order : vector of strings    Specify the order of processing and plotting for categorical levels of the    ``hue`` semantic.    """,    hue_norm="""hue_norm : tuple or :class:`matplotlib.colors.Normalize`    Either a pair of values that set the normalization range in data units    or an object that will map from data units into a [0, 1] interval. Usage    implies numeric mapping.    """,    color="""color : :mod:`matplotlib color <matplotlib.colors>`    Single color specification for when hue mapping is not used. Otherwise, the    plot will try to hook into the matplotlib property cycle.    """,    ax="""ax : :class:`matplotlib.axes.Axes`    Pre-existing axes for the plot. Otherwise, call :func:`matplotlib.pyplot.gca`    internally.    """,  # noqa: E501)_core_returns = dict(    ax=""":class:`matplotlib.axes.Axes`    The matplotlib axes containing the plot.    """,    facetgrid=""":class:`FacetGrid`    An object managing one or more subplots that correspond to conditional data    subsets with convenient methods for batch-setting of axes attributes.    """,    jointgrid=""":class:`JointGrid`    An object managing multiple subplots that correspond to joint and marginal axes    for plotting a bivariate relationship or distribution.    """,    pairgrid=""":class:`PairGrid`    An object managing multiple subplots that correspond to joint and marginal axes    for pairwise combinations of multiple variables in a dataset.    """,)_seealso_blurbs = dict(    # Relational plots    scatterplot="""scatterplot : Plot data using points.    """,    lineplot="""lineplot : Plot data using lines.    """,    # Distribution plots    displot="""displot : Figure-level interface to distribution plot functions.    """,    histplot="""histplot : Plot a histogram of binned counts with optional normalization or smoothing.    """,    kdeplot="""kdeplot : Plot univariate or bivariate distributions using kernel density estimation.    """,    ecdfplot="""ecdfplot : Plot empirical cumulative distribution functions.    """,    rugplot="""rugplot : Plot a tick at each observation value along the x and/or y axes.    """,    # Categorical plots    stripplot="""stripplot : Plot a categorical scatter with jitter.    """,    swarmplot="""swarmplot : Plot a categorical scatter with non-overlapping points.    """,    violinplot="""violinplot : Draw an enhanced boxplot using kernel density estimation.    """,    pointplot="""pointplot : Plot point estimates and CIs using markers and lines.    """,    # Multiples    jointplot="""jointplot : Draw a bivariate plot with univariate marginal distributions.    """,    pairplot="""jointplot : Draw multiple bivariate plots with univariate marginal distributions.    """,    jointgrid="""JointGrid : Set up a figure with joint and marginal views on bivariate data.    """,    pairgrid="""PairGrid : Set up a figure with joint and marginal views on multiple variables.    """,)_core_docs = dict(    params=DocstringComponents(_core_params),    returns=DocstringComponents(_core_returns),    seealso=DocstringComponents(_seealso_blurbs),)
 |