How to plot an angle in Python using matplotlib

This article is based on some interesting graph plotting problems and their solutions. Let us consider one of those problems which you might probably encounter while practicing graph plotting. Learn how to plot an angle in Python using matplotlib.

As the name of the article suggests, we need to plot an angle between two straight lines using the matplotlib plotting library of python. For an intuition that we are going to plot, see the image below.

plot an angle in Python using matplotlib

Steps for plotting the angle in matplotlib – Python

  • Draw two random straight lines intersecting each other.
  • Find the intersection point between the two straight lines.
  • Plot a circle with the intersection point as the center of the circle.
  • Find the intersection points between the straight lines and the circle.
  • Calculate the angle of each intersection point.
  • Plot the angle.

First step: Draw two random straight lines in matplotlib

First of all, draw two straight lines intersecting each other. The code is given below.

import matplotlib.pyplot as plt
import numpy as np

m1, b1 = (1/3), 2.0 # slope and intercept for line 1
m2, b2 = (3/2), 0.0 # slope and intercept for line 2

x = np.linspace(-5,5,100)

plt.figure(figsize=(8,8))

plt.xlim(0,5)
plt.ylim(0,5)

plt.title('Two random straight lines')

plt.plot(x,x*m1+b1)  # plotting line 1
plt.plot(x,x*m2+b2)  # plotting line 2

Output:

Draw two random straight lines in matplotlib

Second step: Finding the intersection point between the two straight lines in Matplotlib

Let the point of intersection be denoted be (x0,y0). Let the two equations of the straight lines be:

y1 = m1*x + b1
y2 = m2*x + b2

On solving the above equations simultaneously we get:
x0 = (b2 – b1) / (m1 – m2)
y0 = m1*x0 + b1

Let us plot this intersection point in the above plot by adding the following code:

x0 = (b2-b1)/(m1-m2)
y0 = m1*x0 + b1
plt.scatter(x0,y0, color='black')

Output:

Finding the intersection point between the two straight lines in Matplotlib

Third step: Plot a circle with the intersection point as the center of the circle in Matplotlib

To plot a circle we need x and y points for each angle that the radius makes with the x-axis.

x = r cos θ
y = r sin θ ,  where r is the radius of the circle and
0 <= θ <= 2π

Reference link->  https://www.mathopenref.com/coordparamcircle.html

Code for plotting the circle:

theta = np.linspace(0,2*np.pi,100)  # 0 <= θ <= 2π

r =  1.0 #circle radius

x1 = r * np.cos(theta) + x0
x2 = r * np.sin(theta) + y0

plt.plot(x1, x2, color='green')

Output:

Code for plotting the circle in Matplotlib

Fourth step: Find the intersection points between the straight lines and the circle in Matplotlib

Now, let us find the intersection points between the lines and the circle and plot them.

Below is the code. Read the comments to understand the code.

x_points = []
y_points = []

def intersection_points(slope,intercept,x0,y0,radius):
    
    a = 1 + slope**2  # 1+m^2
    b = -2.0*x0 + 2*slope*( intercept - y0 )  # 2m(c1-y0) - 2x0
    c = x0**2 + (intercept-y0)**2 - radius**2 # x0^2+(c1-y0)^2-r^2

    # solving the quadratic equation:
    
    delta = b**2 - 4.0*a*c  # b^2 - 4ac
    x1 = ( -b + np.sqrt(delta) ) / ( 2.0 * a )   
    x2 = ( -b - np.sqrt(delta) ) / ( 2.0 * a )

    x_points.append(x1)
    x_points.append(x2)

    y1 = slope*x1 + intercept
    y2 = slope*x2 + intercept

    y_points.append(y1)
    y_points.append(y2)

    return None

# Finding the intersection points for line1 with circle
intersection_points(m1,b1,x0,y0,r)  

# Finding the intersection points for line1 with circle
intersection_points(m2,b2,x0,y0,r)  

# Plotting the different intersection points.
plt.scatter( x_points[0], y_points[0], color='red' )
plt.scatter( x_points[1], y_points[1], color='red' ) 
plt.scatter( x_points[2], y_points[2], color='red' ) 
plt.scatter( x_points[3], y_points[3], color='red' )
# Naming the points.
plt.text( x_points[0], y_points[0], 'p1', color='black' )
plt.text( x_points[1], y_points[1], 'p2', color='black' )
plt.text( x_points[2], y_points[2], 'p3', color='black' )
plt.text( x_points[3], y_points[3], 'p4', color='black' )

Output:

Find the intersection points between the straight lines and the circle in Matplotlib

Fifth step: Calculate the angle of each intersection point in Matplotlib – Python

Now we need to calculate the angle for each intersection point.

Find the code below:

def get_angle(x,y,x0,y0,radius):

    base = x - x0
    hypotenuse = radius

    # calculating the angle for a intersection point 
    # which is equal to the cosine inverse of (base / hypotenuse)
    
    theta = np.arccos(base / hypotenuse)  

    if y-y0 < 0:
        theta = 2*np.pi - theta 
        
    print('theta=',theta,',theta in degree=',np.rad2deg(theta),'\n')

    return theta

theta_list = []

for i in range(len(x_points)):

    x = x_points[i]
    y = y_points[i]

    print('intersection point p{}'.format(i))
    theta_list.append( get_angle(x,y,x0,y0,r) )

Output:

Calculate the angle of each intersection point in Matplotlib - Python

Last step: Plot the angle in Matplotlib

Lastly, we would plot the angle between two intersection points.

Refer to the code below and follow the comments to understand the code.

# angle for intersection point1 ( here point p1 is taken)    
p1 = theta_list[0]  

# angle for intersection point2 ( here point p4 is taken)
p2 = theta_list[3]  

# all the angles between the two intesection points
theta = np.linspace(p1, p2, 100) 

# calculate the x and y points for 
# each angle between the two intersection points
x1 = r * np.cos(theta) + x0
x2 = r * np.sin(theta) + y0

# plot the angle
plt.plot(x1, x2, color='green')

# Code to print the angle at the midpoint of the arc.
mid_angle = ( p1 + p2) / 2.0

x_mid_angle = (r-0.5) * np.cos(mid_angle) + x0
y_mid_angle = (r-0.5) * np.sin(mid_angle) + y0

angle_in_degree = round( np.rad2deg(abs(p1-p2)),1)

plt.text(x_mid_angle, y_mid_angle, angle_in_degree, fontsize=12)

# plotting the intersection points
plt.scatter( x_points[0], y_points[0], color='red' )
plt.scatter( x_points[3], y_points[3], color='red' )
plt.text( x_points[0], y_points[0], 'p1', color='black' )
plt.text( x_points[3], y_points[3], 'p4', color='black' )

Output:

Plot the angle in Matplotlib

I hope you liked the article. Comment if you have any doubts or suggestions regarding this article.

You can also read other articles related to this. Click the links given below.

Leave a Reply

Your email address will not be published. Required fields are marked *