# How to plot an angle in python using matplotlib ?

Daidalos June 18, 2019

An example step by step of how to plot an angle in python using matplotlib and basic mathematics:

### Define two lines

import matplotlib.pyplot as plt
import numpy as np

m1, b1 = 0.1, 2.0 # slope & intercept (line 1)
m2, b2 = 2.0, -3.0 # slope & intercept (line 2)

x = np.linspace(-10,10,500)

plt.plot(x,x*m1+b1)
plt.plot(x,x*m2+b2)

plt.xlim(-2,8)
plt.ylim(-2,8)

plt.title('How to plot an angle with matplotlib ?', fontsize=8)

#plt.savefig("plot_an_angle_matplotlib_01.png", bbox_inches='tight')


### Find the intersection point between the two lines:

x0 = (b2-b1) / (m1-m2)
y0 = m1 * x0 + b1

#plt.scatter(x0,y0, color='black' )

#plt.savefig("plot_an_angle_matplotlib_02.png", bbox_inches='tight')


### Plot a circle with the line intersection point as origin:

theta = np.linspace(0, 2*np.pi, 100)

r = np.sqrt(4.0) # circle radius

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

#plt.plot(x1, x2, color='gray')

#plt.savefig("plot_an_angle_matplotlib_03.png", bbox_inches='tight')


### Find the intersections between the circle and the lines

x_list = []
y_list = []

def line_and_circle_intersection_points(m,b,x0,y0,r):

    c1 = 1 + m ** 2
    c2 = - 2.0 * x0 + 2 * m * ( b - y0 )
    c3 = x0 ** 2 + ( b - y0 ) ** 2 - r ** 2

    # solve the quadratic equation:

    delta = c2 ** 2 - 4.0 * c1 * c3

    x1 = ( - c2 + np.sqrt(delta) ) / ( 2.0 * c1 )
    x2 = ( - c2 - np.sqrt(delta) ) / ( 2.0 * c1 )

    x_list.append(x1)
    x_list.append(x2)

    y1 = m * x1 + b
    y2 = m * x2 + b

    y_list.append(y1)
    y_list.append(y2)

    return None

line_and_circle_intersection_points(m1,b1,x0,y0,r)

#plt.scatter( x_list[0], y_list[0], color='black' )
#plt.scatter( x_list[1], y_list[1], color='black' )

#plt.text( x_list[0], y_list[0], 'P1', color='black' )
#plt.text( x_list[1], y_list[1], 'P2', color='black' )

line_and_circle_intersection_points(m2,b2,x0,y0,r)

#plt.scatter( x_list[2], y_list[2], color='black' )
#plt.scatter( x_list[3], y_list[3], color='black' )

#plt.text( x_list[2], y_list[2], 'P3', color='black' )
#plt.text( x_list[3], y_list[3], 'P4', color='black' )

#plt.savefig("plot_an_angle_matplotlib_04.png", bbox_inches='tight')


### Calculate the angles for each intersection

def get_point_angle(x,y,x0,y0):

    num = x - x0
    den = np.sqrt( ( x - x0 )**2 + ( y - y0 )**2 )

    theta = np.arccos( num / den )

    if not y - y0 >= 0: theta = 2 * np.pi - theta

    #print(theta, np.rad2deg(theta), y - y0 )

    return theta

theta_list = []

for i in range(len(x_list)):

    x = x_list[i]
    y = y_list[i]

    theta_list.append( get_point_angle(x,y,x0,y0) )


### Plot an angle

theta_1 = theta_list[0]
theta_2 = theta_list[3]

theta = np.linspace(theta_1, theta_2, 100)

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

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

mid_angle = ( theta_1 + theta_2 ) / 2.0

mid_angle_x = (r+0.45) * np.cos(mid_angle) + x0
mid_angle_y = (r+0.45) * np.sin(mid_angle) + y0

angle_value = round( np.rad2deg(abs(theta_1-theta_2)), 2)

plt.text(mid_angle_x, mid_angle_y, angle_value, fontsize=8)

plt.savefig("plot_an_angle_matplotlib_08.png", bbox_inches='tight')


### Source Code

import matplotlib.pyplot as plt
import numpy as np

m1, b1 = 0.1, 2.0 # slope & intercept (line 1)
m2, b2 = 2.0, -3.0 # slope & intercept (line 2)

#----------------------------------------------------------------------------------------#
# Step 1: plot the lines

x = np.linspace(-10,10,500)

plt.plot(x,x*m1+b1)
plt.plot(x,x*m2+b2)

plt.xlim(-2,8)
plt.ylim(-2,8)

plt.title('How to plot an angle with matplotlib ?', fontsize=8)

#plt.savefig("plot_an_angle_matplotlib_01.png", bbox_inches='tight')

#----------------------------------------------------------------------------------------#
# Step 2: calculate the point of intersection between the two lines

x0 = (b2-b1) / (m1-m2)
y0 = m1 * x0 + b1

#plt.scatter(x0,y0, color='black' )

#plt.savefig("plot_an_angle_matplotlib_02.png", bbox_inches='tight')

#----------------------------------------------------------------------------------------#
# Step 3: plot the circle

theta = np.linspace(0, 2*np.pi, 100)

r = np.sqrt(4.0) # circle radius

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

#plt.plot(x1, x2, color='gray')

#plt.savefig("plot_an_angle_matplotlib_03.png", bbox_inches='tight')

#----------------------------------------------------------------------------------------#
# Step 4: calculate the points of intersection between a line and the circle

x_list = []
y_list = []

def line_and_circle_intersection_points(m,b,x0,y0,r):

    c1 = 1 + m ** 2
    c2 = - 2.0 * x0 + 2 * m * ( b - y0 )
    c3 = x0 ** 2 + ( b - y0 ) ** 2 - r ** 2

    # solve the quadratic equation:

    delta = c2 ** 2 - 4.0 * c1 * c3

    x1 = ( - c2 + np.sqrt(delta) ) / ( 2.0 * c1 )
    x2 = ( - c2 - np.sqrt(delta) ) / ( 2.0 * c1 )

    x_list.append(x1)
    x_list.append(x2)

    y1 = m * x1 + b
    y2 = m * x2 + b

    y_list.append(y1)
    y_list.append(y2)

    return None

line_and_circle_intersection_points(m1,b1,x0,y0,r)

#plt.scatter( x_list[0], y_list[0], color='black' )
#plt.scatter( x_list[1], y_list[1], color='black' )

#plt.text( x_list[0], y_list[0], 'P1', color='black' )
#plt.text( x_list[1], y_list[1], 'P2', color='black' )

line_and_circle_intersection_points(m2,b2,x0,y0,r)

#plt.scatter( x_list[2], y_list[2], color='black' )
#plt.scatter( x_list[3], y_list[3], color='black' )

#plt.text( x_list[2], y_list[2], 'P3', color='black' )
#plt.text( x_list[3], y_list[3], 'P4', color='black' )

#plt.savefig("plot_an_angle_matplotlib_04.png", bbox_inches='tight')

#----------------------------------------------------------------------------------------#
# Step 5: calculate the angle for each intersection points

def get_point_angle(x,y,x0,y0):

    num = x - x0
    den = np.sqrt( ( x - x0 )**2 + ( y - y0 )**2 )

    theta = np.arccos( num / den )

    if not y - y0 >= 0: theta = 2 * np.pi - theta

    #print(theta, np.rad2deg(theta), y - y0 )

    return theta

theta_list = []

for i in range(len(x_list)):

    x = x_list[i]
    y = y_list[i]

    theta_list.append( get_point_angle(x,y,x0,y0) )

#----------------------------------------------------------------------------------------#
# Step 6: plot the angle

theta_1 = theta_list[0]
theta_2 = theta_list[3]

theta = np.linspace(theta_1, theta_2, 100)

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

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

#----------------------------------------------------------------------------------------#
# Step 7: add label

mid_angle = ( theta_1 + theta_2 ) / 2.0

mid_angle_x = (r+0.45) * np.cos(mid_angle) + x0
mid_angle_y = (r+0.45) * np.sin(mid_angle) + y0

angle_value = round( np.rad2deg(abs(theta_1-theta_2)), 2)

plt.text(mid_angle_x, mid_angle_y, angle_value, fontsize=8)

plt.savefig("plot_an_angle_matplotlib_08.png", bbox_inches='tight')


### References

Best way to plot an angle between two lines in Matplotlib stackoverflow
Intersection d'une droite et d'un cercle ilemaths.net
Equation du second degré mathematiquesfaciles.com
SECOND DEGRE maths-et-tiques.fr
Finding the Angle Between Two Vectors wikihow
numpy.arccos docs.scipy.org

Licence

Activity