Reputation: 1694
When I draw a line segment in matplotlib the linewidth seems to be added to the length of the line. Below my code (not the most pythonic code, but it should do the trick). Am I doing something wrong or is this just a feature of matplotlib?
import matplotlib.pyplot as plt
import numpy as np
L1 = 100
L2 = 75
L3 = 100
Y = 3
N = 5
l_prev = 0
for l, c in zip(np.linspace(0, L1, N), range(N)):
plt.plot([l_prev, l], [0, 0], 'r', linewidth=20)
l_prev = l
l_prev = L1
for l, c in zip(np.linspace(L1, L1 + L2, N), range(N)):
plt.plot([l_prev, l], [Y, Y], 'g', linewidth=1)
l_prev = l
l_prev = L1
for l, c in zip(np.linspace(L1, L1 + L3, N), range(N)):
p = plt.plot([l_prev, l], [-Y, -Y], 'b', linewidth=10)
l_prev = l
plt.axvspan(xmin=L1, xmax=L1)
plt.axis([-5, 205, -5, 5])
plt.show()
What I expected to see is three line segments: [0,L1], [L1,L2] and [L1,L3]
. But the first line [0,L1]
extends to L1
+ 'the diameter'....
Upvotes: 30
Views: 40228
Reputation: 353039
It looks like the default solid_capstyle
is projecting
, which isn't the one you want:
plt.figure()
plt.plot([0, 100], [5, 5], linewidth=50, linestyle="-", c="blue",
solid_capstyle="butt")
plt.plot([0, 100], [15, 15], linewidth=50, linestyle="-", c="red",
solid_capstyle="round")
plt.plot([0, 100], [25, 25], linewidth=50, linestyle="-", c="purple",
solid_capstyle="projecting")
plt.axvline(x=100, c="black")
plt.xlim(0, 125)
plt.ylim(0, 30)
plt.savefig("cap.png")
Upvotes: 66