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

.. only:: html

    .. meta::
        :keywords: codex

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

        :ref:`Go to the end <sphx_glr_download_gallery_misc_histogram_path.py>`
        to download the full example code.

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

.. _sphx_glr_gallery_misc_histogram_path.py:


========================================================
Building histograms using Rectangles and PolyCollections
========================================================

Using a path patch to draw rectangles.

The technique of using lots of `.Rectangle` instances, or the faster method of
using `.PolyCollection`, were implemented before we had proper paths with
moveto, lineto, closepoly, etc. in Matplotlib.  Now that we have them, we can
draw collections of regularly shaped objects with homogeneous properties more
efficiently with a PathCollection. This example makes a histogram -- it's more
work to set up the vertex arrays at the outset, but it should be much faster
for large numbers of objects.

.. GENERATED FROM PYTHON SOURCE LINES 16-51

.. code-block:: Python


    import matplotlib.pyplot as plt
    import numpy as np

    import matplotlib.patches as patches
    import matplotlib.path as path

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

    # histogram our data with numpy
    data = np.random.randn(1000)
    n, bins = np.histogram(data, 50)

    # get the corners of the rectangles for the histogram
    left = bins[:-1]
    right = bins[1:]
    bottom = np.zeros(len(left))
    top = bottom + n

    # we need a (numrects x numsides x 2) numpy array for the path helper
    # function to build a compound path
    XY = np.array([[left, left, right, right], [bottom, top, top, bottom]]).T

    # get the Path object
    barpath = path.Path.make_compound_path_from_polys(XY)

    # make a patch out of it, don't add a margin at y=0
    patch = patches.PathPatch(barpath)
    patch.sticky_edges.y[:] = [0]

    fig, ax = plt.subplots()
    ax.add_patch(patch)
    ax.autoscale_view()
    plt.show()




.. image-sg:: /gallery/misc/images/sphx_glr_histogram_path_001.png
   :alt: histogram path
   :srcset: /gallery/misc/images/sphx_glr_histogram_path_001.png, /gallery/misc/images/sphx_glr_histogram_path_001_2_00x.png 2.00x
   :class: sphx-glr-single-img





.. GENERATED FROM PYTHON SOURCE LINES 52-55

Instead of creating a three-dimensional array and using
`~.path.Path.make_compound_path_from_polys`, we could as well create the
compound path directly using vertices and codes as shown below

.. GENERATED FROM PYTHON SOURCE LINES 55-82

.. code-block:: Python


    nrects = len(left)
    nverts = nrects*(1+3+1)
    verts = np.zeros((nverts, 2))
    codes = np.ones(nverts, int) * path.Path.LINETO
    codes[0::5] = path.Path.MOVETO
    codes[4::5] = path.Path.CLOSEPOLY
    verts[0::5, 0] = left
    verts[0::5, 1] = bottom
    verts[1::5, 0] = left
    verts[1::5, 1] = top
    verts[2::5, 0] = right
    verts[2::5, 1] = top
    verts[3::5, 0] = right
    verts[3::5, 1] = bottom

    barpath = path.Path(verts, codes)

    # make a patch out of it, don't add a margin at y=0
    patch = patches.PathPatch(barpath)
    patch.sticky_edges.y[:] = [0]

    fig, ax = plt.subplots()
    ax.add_patch(patch)
    ax.autoscale_view()
    plt.show()




.. image-sg:: /gallery/misc/images/sphx_glr_histogram_path_002.png
   :alt: histogram path
   :srcset: /gallery/misc/images/sphx_glr_histogram_path_002.png, /gallery/misc/images/sphx_glr_histogram_path_002_2_00x.png 2.00x
   :class: sphx-glr-single-img





.. GENERATED FROM PYTHON SOURCE LINES 83-100

.. admonition:: References

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

   - `matplotlib.patches`
   - `matplotlib.patches.PathPatch`
   - `matplotlib.path`
   - `matplotlib.path.Path`
   - `matplotlib.path.Path.make_compound_path_from_polys`
   - `matplotlib.axes.Axes.add_patch`
   - `matplotlib.collections.PathCollection`

   This example shows an alternative to

   - `matplotlib.collections.PolyCollection`
   - `matplotlib.axes.Axes.hist`


.. _sphx_glr_download_gallery_misc_histogram_path.py:

.. only:: html

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

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

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

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

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

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: histogram_path.zip <histogram_path.zip>`


.. only:: html

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

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
