2017-09-16 92 views
-1

我正在尝试找到问题的解决方案,我已经搜索并且距离我能够实现的最近的一个插补角度有限的成功。x-min&x-max的多边形y轴截距

我有多个多边形的定义为由多个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() 
+2

你的问题不明确。散点图如何定义多边形 - 多边形是点的凸包,是给定顺序中的多边形的顶点还是其他? “记录y = 1,y = 2等的值”是什么意思?因为可能没有y坐标为1或2的点?为什么你不能只使用'min'和'max'函数来找到你想要的?等等。 –

+0

感谢您的回复,我现在添加了一些代码。我想在y轴上画一条水平线并找出线与图相交的x-min和x-max值。我希望以0.2为增量对全部的y值进行此操作。 – Inrush

回答

0

可以这两个点,其中,所述多边形相交通过ys==?限定的线之间线性内插。要找到这些点,您可以减去多边形的y值中的ys值,找到符号变化之间的点,并获得这些点的最小值和最大值。

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

+0

哇!我无法感谢你花时间为我做这件事,这是一个巨大的帮助,因为我花了几天的时间尝试自己制作解决方案。最好的祝愿。 – Inrush