Home > database >  matplotlib fill_between leaving gaps between regions
matplotlib fill_between leaving gaps between regions

Time:11-09

I'm trying to use fill_between to fill different regions of a plot, but I get gaps between the regions I'm trying to fill.

I've tried using interpolate=True, but this results in non rectangular shapes...

`

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
x = np.arange(0, 4 * np.pi, 0.01)
y = np.sin(x)
ax.plot(x, y, color='black')

threshold = 0.75
ax.axhline(threshold, color='green', lw=2, alpha=0.7)
ax.fill_between(x, 0, 1, where=y > threshold,
                facecolor=(0.5,0,0,0.5), ec=None,transform=ax.get_xaxis_transform())

ax.fill_between(x, 0, 1, where=y <= threshold,
                facecolor=(0,0.5,0,0.5), ec=None, transform=ax.get_xaxis_transform())

` I've attched a zoomed in screenshot of the plot. plot

CodePudding user response:

You could do one or both of the following:

  1. use finer-grainded x values, e.g.x = np.arange(0, 4 * np.pi, 0.0001). This will remove the white stripes at full view, but if you zoom in they will re-appear at a certain zoom level.

  2. first draw the green background without a where condition over the full x range and then plot the red sections at the required sections. In case of non-opaque colors as in the example you'll need to manually re-calculate the semitransparent color on the default white background to a fully opaque color:

    x = np.arange(0, 4 * np.pi, 0.001)

    # ...

    ax.fill_between(x, 0, 1, facecolor=(0, 0.5, 0, 0.5), ec=None,
                    transform=ax.get_xaxis_transform())
    ax.fill_between(x, 0, 1, where=y>threshold, facecolor=(0.75, 0.5, 0.5),
                    ec=None, transform=ax.get_xaxis_transform())

enter image description here

CodePudding user response:

I found an alternative way of solving this problem, by using pcolormesh where the color array is 1xn:

C = np.reshape(np.array(trnsys_out["LCG_state"][:-1].values), (-1, 1)).T
x = trnsys_out.index
y = [Pmin, Pmax]
ctrl = ax2.pcolormesh(x, y, C, shading="flat", cmap="binary", alpha=0.5, vmin=0, vmax=5)
  • Related