2017-09-16 91 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