
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "gallery/lines_bars_and_markers/filled_step.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        Click :ref:`here <sphx_glr_download_gallery_lines_bars_and_markers_filled_step.py>`
        to download the full example code

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_gallery_lines_bars_and_markers_filled_step.py:


=========================
Hatch-filled histograms
=========================

Hatching capabilities for plotting histograms.

.. GENERATED FROM PYTHON SOURCE LINES 8-193

.. code-block:: default


    import itertools
    from collections import OrderedDict
    from functools import partial

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.ticker as mticker
    from cycler import cycler


    def filled_hist(ax, edges, values, bottoms=None, orientation='v',
                    **kwargs):
        """
        Draw a histogram as a stepped patch.

        Extra kwargs are passed through to `fill_between`

        Parameters
        ----------
        ax : Axes
            The axes to plot to

        edges : array
            A length n+1 array giving the left edges of each bin and the
            right edge of the last bin.

        values : array
            A length n array of bin counts or values

        bottoms : float or array, optional
            A length n array of the bottom of the bars.  If None, zero is used.

        orientation : {'v', 'h'}
           Orientation of the histogram.  'v' (default) has
           the bars increasing in the positive y-direction.

        Returns
        -------
        ret : PolyCollection
            Artist added to the Axes
        """
        print(orientation)
        if orientation not in 'hv':
            raise ValueError("orientation must be in {{'h', 'v'}} "
                             "not {o}".format(o=orientation))

        kwargs.setdefault('step', 'post')
        edges = np.asarray(edges)
        values = np.asarray(values)
        if len(edges) - 1 != len(values):
            raise ValueError('Must provide one more bin edge than value not: '
                             'len(edges): {lb} len(values): {lv}'.format(
                                 lb=len(edges), lv=len(values)))

        if bottoms is None:
            bottoms = 0
        bottoms = np.broadcast_to(bottoms, values.shape)

        values = np.append(values, values[-1])
        bottoms = np.append(bottoms, bottoms[-1])
        if orientation == 'h':
            return ax.fill_betweenx(edges, values, bottoms,
                                    **kwargs)
        elif orientation == 'v':
            return ax.fill_between(edges, values, bottoms,
                                   **kwargs)
        else:
            raise AssertionError("you should never be here")


    def stack_hist(ax, stacked_data, sty_cycle, bottoms=None,
                   hist_func=None, labels=None,
                   plot_func=None, plot_kwargs=None):
        """
        Parameters
        ----------
        ax : axes.Axes
            The axes to add artists too

        stacked_data : array or Mapping
            A (N, M) shaped array.  The first dimension will be iterated over to
            compute histograms row-wise

        sty_cycle : Cycler or operable of dict
            Style to apply to each set

        bottoms : array, default: 0
            The initial positions of the bottoms.

        hist_func : callable, optional
            Must have signature `bin_vals, bin_edges = f(data)`.
            `bin_edges` expected to be one longer than `bin_vals`

        labels : list of str, optional
            The label for each set.

            If not given and stacked data is an array defaults to 'default set {n}'

            If stacked_data is a mapping, and labels is None, default to the keys
            (which may come out in a random order).

            If stacked_data is a mapping and labels is given then only
            the columns listed by be plotted.

        plot_func : callable, optional
            Function to call to draw the histogram must have signature:

              ret = plot_func(ax, edges, top, bottoms=bottoms,
                              label=label, **kwargs)

        plot_kwargs : dict, optional
            Any extra kwargs to pass through to the plotting function.  This
            will be the same for all calls to the plotting function and will
            over-ride the values in cycle.

        Returns
        -------
        arts : dict
            Dictionary of artists keyed on their labels
        """
        # deal with default binning function
        if hist_func is None:
            hist_func = np.histogram

        # deal with default plotting function
        if plot_func is None:
            plot_func = filled_hist

        # deal with default
        if plot_kwargs is None:
            plot_kwargs = {}
        print(plot_kwargs)
        try:
            l_keys = stacked_data.keys()
            label_data = True
            if labels is None:
                labels = l_keys

        except AttributeError:
            label_data = False
            if labels is None:
                labels = itertools.repeat(None)

        if label_data:
            loop_iter = enumerate((stacked_data[lab], lab, s)
                                  for lab, s in zip(labels, sty_cycle))
        else:
            loop_iter = enumerate(zip(stacked_data, labels, sty_cycle))

        arts = {}
        for j, (data, label, sty) in loop_iter:
            if label is None:
                label = 'dflt set {n}'.format(n=j)
            label = sty.pop('label', label)
            vals, edges = hist_func(data)
            if bottoms is None:
                bottoms = np.zeros_like(vals)
            top = bottoms + vals
            print(sty)
            sty.update(plot_kwargs)
            print(sty)
            ret = plot_func(ax, edges, top, bottoms=bottoms,
                            label=label, **sty)
            bottoms = top
            arts[label] = ret
        ax.legend(fontsize=10)
        return arts


    # set up histogram function to fixed bins
    edges = np.linspace(-3, 3, 20, endpoint=True)
    hist_func = partial(np.histogram, bins=edges)

    # set up style cycles
    color_cycle = cycler(facecolor=plt.rcParams['axes.prop_cycle'][:4])
    label_cycle = cycler(label=['set {n}'.format(n=n) for n in range(4)])
    hatch_cycle = cycler(hatch=['/', '*', '+', '|'])

    # Fixing random state for reproducibility
    np.random.seed(19680801)

    stack_data = np.random.randn(4, 12250)
    dict_data = OrderedDict(zip((c['label'] for c in label_cycle), stack_data))








.. GENERATED FROM PYTHON SOURCE LINES 194-195

Work with plain arrays

.. GENERATED FROM PYTHON SOURCE LINES 195-208

.. code-block:: default


    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9, 4.5), tight_layout=True)
    arts = stack_hist(ax1, stack_data, color_cycle + label_cycle + hatch_cycle,
                      hist_func=hist_func)

    arts = stack_hist(ax2, stack_data, color_cycle,
                      hist_func=hist_func,
                      plot_kwargs=dict(edgecolor='w', orientation='h'))
    ax1.set_ylabel('counts')
    ax1.set_xlabel('x')
    ax2.set_xlabel('counts')
    ax2.set_ylabel('x')




.. image:: /gallery/lines_bars_and_markers/images/sphx_glr_filled_step_001.png
    :alt: filled step
    :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none

    {}
    {'facecolor': '#1f77b4', 'hatch': '/'}
    {'facecolor': '#1f77b4', 'hatch': '/'}
    v
    {'facecolor': '#ff7f0e', 'hatch': '*'}
    {'facecolor': '#ff7f0e', 'hatch': '*'}
    v
    {'facecolor': '#2ca02c', 'hatch': '+'}
    {'facecolor': '#2ca02c', 'hatch': '+'}
    v
    {'facecolor': '#d62728', 'hatch': '|'}
    {'facecolor': '#d62728', 'hatch': '|'}
    v
    {'edgecolor': 'w', 'orientation': 'h'}
    {'facecolor': '#1f77b4'}
    {'facecolor': '#1f77b4', 'edgecolor': 'w', 'orientation': 'h'}
    h
    {'facecolor': '#ff7f0e'}
    {'facecolor': '#ff7f0e', 'edgecolor': 'w', 'orientation': 'h'}
    h
    {'facecolor': '#2ca02c'}
    {'facecolor': '#2ca02c', 'edgecolor': 'w', 'orientation': 'h'}
    h
    {'facecolor': '#d62728'}
    {'facecolor': '#d62728', 'edgecolor': 'w', 'orientation': 'h'}
    h

    Text(478.99999999999994, 0.5, 'x')



.. GENERATED FROM PYTHON SOURCE LINES 209-210

Work with labeled data

.. GENERATED FROM PYTHON SOURCE LINES 210-226

.. code-block:: default


    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9, 4.5),
                                   tight_layout=True, sharey=True)

    arts = stack_hist(ax1, dict_data, color_cycle + hatch_cycle,
                      hist_func=hist_func)

    arts = stack_hist(ax2, dict_data, color_cycle + hatch_cycle,
                      hist_func=hist_func, labels=['set 0', 'set 3'])
    ax1.xaxis.set_major_locator(mticker.MaxNLocator(5))
    ax1.set_xlabel('counts')
    ax1.set_ylabel('x')
    ax2.set_ylabel('x')

    plt.show()




.. image:: /gallery/lines_bars_and_markers/images/sphx_glr_filled_step_002.png
    :alt: filled step
    :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none

    {}
    {'facecolor': '#1f77b4', 'hatch': '/'}
    {'facecolor': '#1f77b4', 'hatch': '/'}
    v
    {'facecolor': '#ff7f0e', 'hatch': '*'}
    {'facecolor': '#ff7f0e', 'hatch': '*'}
    v
    {'facecolor': '#2ca02c', 'hatch': '+'}
    {'facecolor': '#2ca02c', 'hatch': '+'}
    v
    {'facecolor': '#d62728', 'hatch': '|'}
    {'facecolor': '#d62728', 'hatch': '|'}
    v
    {}
    {'facecolor': '#1f77b4', 'hatch': '/'}
    {'facecolor': '#1f77b4', 'hatch': '/'}
    v
    {'facecolor': '#ff7f0e', 'hatch': '*'}
    {'facecolor': '#ff7f0e', 'hatch': '*'}
    v




.. GENERATED FROM PYTHON SOURCE LINES 227-234

------------

References
""""""""""

The use of the following functions, methods, classes and modules is shown
in this example:

.. GENERATED FROM PYTHON SOURCE LINES 235-240

.. code-block:: default


    import matplotlib
    matplotlib.axes.Axes.fill_betweenx
    matplotlib.axes.Axes.fill_between
    matplotlib.axis.Axis.set_major_locator




.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none


    <function Axis.set_major_locator at 0x7f73be94d160>




.. rst-class:: sphx-glr-timing

   **Total running time of the script:** ( 0 minutes  2.032 seconds)


.. _sphx_glr_download_gallery_lines_bars_and_markers_filled_step.py:


.. only :: html

 .. container:: sphx-glr-footer
    :class: sphx-glr-footer-example



  .. container:: sphx-glr-download sphx-glr-download-python

     :download:`Download Python source code: filled_step.py <filled_step.py>`



  .. container:: sphx-glr-download sphx-glr-download-jupyter

     :download:`Download Jupyter notebook: filled_step.ipynb <filled_step.ipynb>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    Keywords: matplotlib code example, codex, python plot, pyplot
    `Gallery generated by Sphinx-Gallery
    <https://sphinx-gallery.readthedocs.io>`_
