x-min&的多边形y截距X-MAX

时间:2017-09-16 13:19:51

标签: python matplotlib

我正在尝试找到一个问题的解决方案,我已经搜索过,我能找到的最接近的是这些论坛的插值帖子,我已经取得了有限的成功。

我将多个多边形定义为由多个x-y点给出的单独散点图。我试图做的是在y轴上画一条水平线,找到水平线与多边形相交的x-min和x-max值。我想为所有y值做这个。所以从理论上讲,我可以逐步循环并记录y = 1,y = 2等的值。我使用的工程软件需要这种格式的输入参数,因此我试图找到解决方案。

对此问题的最佳解决方案的任何建议或指示都会非常感激,我会试一试。

Sample plot image

import matplotlib.pyplot as plt
import numpy as np
x =[1,2.6,2.56,2.57,10,11.66,13.07,11.78,11.27,6.49,5.98,5.76,3.02,1.87,1]
y =[15.59,15.09,15.14,15.15,16,17,25.47,26,27,27,28,28,26.67,16.37,15.59]
plt.plot(x,y)
plt.grid()
plt.show()

1 个答案:

答案 0 :(得分:0)

您可以在这两个点之间进行线性插值,其中多边形与ys==?定义的直线相交。要查找这些点,您可以从多边形的ys值中减去y值,找到符号发生变化的点,并获得这些点的最小值和最大值。

import numpy as np
import matplotlib.pyplot as plt

x =[1,2.6,2.56,2.57,10,11.66,13.07,11.78,11.27,6.49,5.98,5.76,3.02,1.87,1]
y =[15.59,15.09,15.14,15.15,16,17,25.47,26,27,27,28,28,26.67,16.37,15.59]

def findminmax(t, x, zero=0):
    t = np.array(t); x = np.array(x)
    ta = []
    p = (x-zero) > 0
    ti = np.where(np.bitwise_xor(p[1:], p[:-1]))[0]
    for i in ti:
        y_ = np.sort(x[i:i+2])
        z_ = t[i:i+2][np.argsort(x[i:i+2])]
        t_ = np.interp(zero, y_, z_)
        ta.append( t_ )
    if ta:
        return min(ta), max(ta)
    else:
        return None, None

plt.plot(x,y)

ys = np.arange(13, 29, 0.2)
result = []
for s in ys:
    mi, ma = findminmax(x,y,zero=s)
    if mi and ma:
        result.append([mi,ma,s])
        print("y = {}, minimum {}, maximum {}".format(s,mi,ma))
result=np.array(result)

plt.scatter(result[:,0],result[:,2], label="min", color="limegreen")
plt.scatter(result[:,1],result[:,2], label="max", color="crimson")

plt.legend()
plt.grid()
plt.show()

enter image description here