.. 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_lines_bars_and_markers_fill_between_demo.py: ============================== Filling the area between lines ============================== This example shows how to use ``fill_between`` to color between lines based on user-defined logic. .. code-block:: python import matplotlib.pyplot as plt import numpy as np x = np.arange(0.0, 2, 0.01) y1 = np.sin(2 * np.pi * x) y2 = 1.2 * np.sin(4 * np.pi * x) .. code-block:: python fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True) ax1.fill_between(x, 0, y1) ax1.set_ylabel('between y1 and 0') ax2.fill_between(x, y1, 1) ax2.set_ylabel('between y1 and 1') ax3.fill_between(x, y1, y2) ax3.set_ylabel('between y1 and y2') ax3.set_xlabel('x') .. image:: /gallery/lines_bars_and_markers/images/sphx_glr_fill_between_demo_001.png :class: sphx-glr-single-img Now fill between y1 and y2 where a logical condition is met. Note this is different than calling ``fill_between(x[where], y1[where], y2[where] ...)`` because of edge effects over multiple contiguous regions. .. code-block:: python fig, (ax, ax1) = plt.subplots(2, 1, sharex=True) ax.plot(x, y1, x, y2, color='black') ax.fill_between(x, y1, y2, where=y2 >= y1, facecolor='green', interpolate=True) ax.fill_between(x, y1, y2, where=y2 <= y1, facecolor='red', interpolate=True) ax.set_title('fill between where') # Test support for masked arrays. y2 = np.ma.masked_greater(y2, 1.0) ax1.plot(x, y1, x, y2, color='black') ax1.fill_between(x, y1, y2, where=y2 >= y1, facecolor='green', interpolate=True) ax1.fill_between(x, y1, y2, where=y2 <= y1, facecolor='red', interpolate=True) ax1.set_title('Now regions with y2>1 are masked') .. image:: /gallery/lines_bars_and_markers/images/sphx_glr_fill_between_demo_002.png :class: sphx-glr-single-img This example illustrates a problem; because of the data gridding, there are undesired unfilled triangles at the crossover points. A brute-force solution would be to interpolate all arrays to a very fine grid before plotting. Use transforms to create axes spans where a certain condition is satisfied: .. code-block:: python fig, ax = plt.subplots() y = np.sin(4 * np.pi * x) ax.plot(x, y, color='black') # use data coordinates for the x-axis and the axes coordinates for the y-axis import matplotlib.transforms as mtransforms trans = mtransforms.blended_transform_factory(ax.transData, ax.transAxes) theta = 0.9 ax.axhline(theta, color='green', lw=2, alpha=0.5) ax.axhline(-theta, color='red', lw=2, alpha=0.5) ax.fill_between(x, 0, 1, where=y > theta, facecolor='green', alpha=0.5, transform=trans) ax.fill_between(x, 0, 1, where=y < -theta, facecolor='red', alpha=0.5, transform=trans) plt.show() .. image:: /gallery/lines_bars_and_markers/images/sphx_glr_fill_between_demo_003.png :class: sphx-glr-single-img .. _sphx_glr_download_gallery_lines_bars_and_markers_fill_between_demo.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download :download:`Download Python source code: fill_between_demo.py ` .. container:: sphx-glr-download :download:`Download Jupyter notebook: fill_between_demo.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature Keywords: matplotlib code example, codex, python plot, pyplot `Gallery generated by Sphinx-Gallery `_