Search code examples
pythonmatplotlibplotline

Fill area of regions of two intersecting lines


I have two lines:

y=3x-4 
y=-x+5

They intersect and form 4 regions in space (see image below).

enter image description here

Mathematically, the regions can be determined with the following inequations:

Region1: y<3x-4 & y>-x+5
Region2: y>3x-4 & y>-x+5
Region3: y>3x-4 & y<-x+5
Region4: y<3x-4 & y<-x+5

I want to fill all of those regions independently. However when I try to use plt.fill_between I can only get regions 1 and/or 3. How can I fill regions 2 and 4 using matplotlib and fill_between?

The code that I tried for region 3 is the following (source):

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,6,0.1)
y = np.arange(0,6,0.1)

# The lines to plot
y1 = 3*x - 4
y2 = -x+5

# The upper edge of polygon (min of lines y1 & y2)
y3 = np.minimum(y1, y2)

# Set y-limit, making neg y-values not show in plot
plt.ylim(0, 6)
plt.xlim(0, 6)

# Plotting of lines
plt.plot(x, y1,
         x, y2)

# Filling between (region 3)
plt.fill_between(x, y2, y3, color='grey', alpha=0.5)
plt.show()

enter image description here


Solution

  • It's because you have set the limits incorrectly. Setting them as 2 horizontal lines, 6 and 0, does the trick. Note that I have changed the step of arange because, to have a neat picture, the intersection point (2.25 in your case) needs to belong to x range

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(0,6,0.05)
    
    # The lines to plot
    y1 = 3*x - 4
    y2 = -x+5
    
    # Set y-limit, making neg y-values not show in plot
    plt.ylim(0, 6)
    plt.xlim(0, 6)
    
    # Filling between (region 3)
    plt.fill_between(x, np.maximum(y1, y2), [6] * len(x), color='grey', alpha=0.5)
    plt.fill_between(x, np.minimum(y1, y2), [0] * len(x), color='cyan', alpha=0.5)
    plt.show()
    

    enter image description here