30

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'....

Seanny123
  • 8,776
  • 13
  • 68
  • 124
user989762
  • 1,686
  • 3
  • 16
  • 20

1 Answers1

64

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

bmu
  • 35,119
  • 13
  • 91
  • 108
DSM
  • 342,061
  • 65
  • 592
  • 494