Linewidth is added to the length of a line

Question:

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’….

Asked By: user989762

||

Answers:

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")

enter image description here

Answered By: DSM
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.