首页 > 解决方案 > Matplotlib 剪辑或修剪线和多边形

问题描述

如何有效地“修剪”或“剪辑”或删除紫色框外的红线部分?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')

在此处输入图像描述

标签: numpymatplotlibcropmask

解决方案


这不是使用 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')

输出:

在此处输入图像描述


推荐阅读