Matplotlib обрезает или обрезает линии и полигон

#numpy #matplotlib #crop #mask

Вопрос:

Как я могу эффективно «обрезать» или «обрезать» или удалить часть красной линии за пределами фиолетового поля? Есть ли трюк с масками numpy?

Использование Python 3.8.3 и Matplotlib

 x = [10,15.5,12.5,7.5,5,10]
y = [15,10,5,5,10,15]

fig, ax = plt.subplots()
ax.fill_between(x,y, facecolor="blue", alpha=0.25)
ax.axis("equal")

myinterval = 1.5
xvals = np.arange(min(x), max(x) 1, myinterval)
for i in xvals:
    ax.plot([i,i], [0,20], color='red')
 

введите описание изображения здесь

Ответ №1:

Это делается без использования масок numpy. Если я правильно понимаю, это код:

 fig, ax = plt.subplots()
x = [10,15.5,12.5,7.5,5,10]
y = [15,10,5,5,10,15]

ax.fill_between(x,y, facecolor="blue", alpha=0.25)
ax.axis("equal")

myinterval = 1.5
xvals = np.arange(min(x), max(x) 1, myinterval)


def generate_equation(x, y):
    # y = mx   b
    # b = y - mx
    
    left = []
    right = []
    M = []
    B = []

    for i in range(len(x)-1):
        m = ((y[i 1] - y[i]) / (x[i 1] - x[i]))
        b = y[i 1] - m*x[i 1]
        M.append(m)
        B.append(b)
        left.append(min(x[i], x[i 1]))
        right.append(max(x[i], x[i 1]))

    return M, B, left, right
        
M, B, left, right = generate_equation(np.array(x), np.array(y))

for i in range(len(xvals)):
    ylim = []
    for j in range(len(M)):
        if xvals[i] >= left[j] and xvals[i] <= right[j]:
            Y = M[j] * xvals[i]   B[j]
            ylim.append(Y)
    ax.vlines(xvals[i], min(ylim), max(ylim), 'r')
 

Выход:

введите описание изображения здесь