0

I do same thing that answered here

def get_angle_plot(line1, line2, offset = 1, color = None, origin = [0,0], len_x_axis = 1, len_y_axis = 1):
    l1xy = line1.get_xydata()
    slope1 = (l1xy[1][1] - l1xy[0][1]) / float(l1xy[1][0] - l1xy[0][0])
    angle1 = abs(math.degrees(math.atan(slope1))) # Taking only the positive angle
    l2xy = line2.get_xydata()
    slope2 = (l2xy[1][1] - l2xy[0][1]) / float(l2xy[1][0] - l2xy[0][0])
    angle2 = abs(math.degrees(math.atan(slope2)))
    theta1 = min(angle1, angle2)
    theta2 = max(angle1, angle2)
    angle = theta2 - theta1
    if color is None:
    color = line1.get_color() # Uses the color of line 1 if color parameter is not passed.
    return Arc(origin, len_x_axis*offset, len_y_axis*offset, 0, theta1, theta2, color=color, label = str(angle)+u"\u00b0")

And when Line2D-s same as in example. All work just fine.

 fig = plt.figure()
 line_1 = Line2D([0,1], [0,4], linewidth=1, linestyle = "-", color="green")
 line_2 = Line2D([0,4.5], [0,3], linewidth=1, linestyle = "-", color="red")
 ax = fig.add_subplot(1,1,1)
 ax.add_line(line_1)
 ax.add_line(line_2)
 angle_plot = get_angle_plot(line_1, line_2, 1)
 ax.add_patch(angle_plot) # To display the angle arc
 plt.show()

But when i change slightly to this

 line_1 = Line2D([10,30], [1,2], linewidth=1, linestyle = "-", color="green")
 line_2 = Line2D([10,30], [1,1], linewidth=1, linestyle = "-", color="red")

I get white empty plot 1*1 size. Not 2*30 if be more refined

Andrei Eremchuk
  • 155
  • 1
  • 1
  • 8

1 Answers1

0

You need to set the origin to the point where the two lines intersect. In this case origin = [10,1]. Then you may want to relimit the axes, because the lines you want to show are outside the range [0,1]. You may use ax.relim(); ax.autoscale_view() for that purpose.

line_1 = Line2D([10,30], [1,2], linewidth=1, linestyle = "-", color="green")
line_2 = Line2D([10,30], [1,1], linewidth=1, linestyle = "-", color="red")

ax = fig.add_subplot(1,1,1)
ax.add_line(line_1)
ax.add_line(line_2)
angle_plot = get_angle_plot(line_1, line_2, 1, origin = [10,1])
ax.add_patch(angle_plot) # To display the angle arc
ax.relim()
ax.autoscale_view()
plt.show()

Note that the easier option is surely to not define the lines as Line2D but simply as usual plot. That makes it unnecessary to relimit the axes.

ax = fig.add_subplot(1,1,1)
line_1, = ax.plot([10,30], [1,2], linewidth=1, linestyle = "-", color="green")
line_2, = ax.plot([10,30], [1,1], linewidth=1, linestyle = "-", color="red")
angle_plot = get_angle_plot(line_1, line_2, 5, origin = [10,1])
ax.add_patch(angle_plot) # To display the angle arc

plt.show()

Because the x and y scales are so differently the result will look more like a straight line.

enter image description here

ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712