#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')
Выход: