.. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_gallery_animation_animated_histogram.py: ================== Animated histogram ================== Use a path patch to draw a bunch of rectangles for an animated histogram. .. code-block:: default import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches import matplotlib.path as path import matplotlib.animation as animation # Fixing random state for reproducibility np.random.seed(19680801) # histogram our data with numpy data = np.random.randn(1000) n, bins = np.histogram(data, 100) # get the corners of the rectangles for the histogram left = np.array(bins[:-1]) right = np.array(bins[1:]) bottom = np.zeros(len(left)) top = bottom + n nrects = len(left) Here comes the tricky part -- we have to set up the vertex and path codes arrays using `.Path.MOVETO`, `.Path.LINETO` and `.Path.CLOSEPOLY` for each rect. * We need 1 ``MOVETO`` per rectangle, which sets the initial point. * We need 3 ``LINETO``'s, which tell Matplotlib to draw lines from vertex 1 to vertex 2, v2 to v3, and v3 to v4. * We then need one ``CLOSEPOLY`` which tells Matplotlib to draw a line from the v4 to our initial vertex (the ``MOVETO`` vertex), in order to close the polygon. .. note:: The vertex for ``CLOSEPOLY`` is ignored, but we still need a placeholder in the ``verts`` array to keep the codes aligned with the vertices. .. code-block:: default 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 To animate the histogram, we need an ``animate`` function, which generates a random set of numbers and updates the locations of the vertices for the histogram (in this case, only the heights of each rectangle). ``patch`` will eventually be a `.Patch` object. .. code-block:: default patch = None def animate(i): # simulate new data coming in data = np.random.randn(1000) n, bins = np.histogram(data, 100) top = bottom + n verts[1::5, 1] = top verts[2::5, 1] = top return [patch, ] And now we build the `.Path` and `.Patch` instances for the histogram using our vertices and codes. We add the patch to the `~.axes.Axes` instance, and setup the `.FuncAnimation` with our ``animate`` function. .. code-block:: default fig, ax = plt.subplots() barpath = path.Path(verts, codes) patch = patches.PathPatch( barpath, facecolor='green', edgecolor='yellow', alpha=0.5) ax.add_patch(patch) ax.set_xlim(left[0], right[-1]) ax.set_ylim(bottom.min(), top.max()) ani = animation.FuncAnimation(fig, animate, 100, repeat=False, blit=True) plt.show() .. image:: /gallery/animation/images/sphx_glr_animated_histogram_001.png :class: sphx-glr-single-img .. _sphx_glr_download_gallery_animation_animated_histogram.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: animated_histogram.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: animated_histogram.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature Keywords: matplotlib code example, codex, python plot, pyplot `Gallery generated by Sphinx-Gallery `_