我在兩個軸上都有一條從 0 到 1 的曲線(拋物線),如下所示:

我通過沿 x 軸移動原始曲線來生成另一條曲線,并將兩者結合起來得到下圖:

如何洗掉相交部分以僅具有這樣的雙底圖案:

我用于圖表的代碼:
import numpy as np
import matplotlib.pyplot as plt
def get_parabol(start=-1, end=1, steps=100, normalized=True):
x = np.linspace(start, end, steps)
y = x**2
if normalized:
x = np.array(x)
x = (x - x.min())/(x.max() - x.min())
y = np.array(y)
y = (y - y.min())/(y.max() - y.min())
return x, y
def curve_after(x, y, x_ratio=1/3, y_ratio=1/2, normalized=False):
x = x*x_ratio x.max() - x[0]*x_ratio
y = y*y_ratio y.max() - y.max()*y_ratio
if normalized:
x = np.array(x)
x = (x - x.min())/(x.max() - x.min())
y = np.array(y)
y = (y - y.min())/(y.max() - y.min())
return x, y
def concat_arrays(*arr, axis=0, normalized=True):
arr = np.concatenate([*arr], axis=axis).tolist()
if normalized:
arr = np.array(arr)
arr = (arr - arr.min())/(arr.max() - arr.min())
return arr
x, y = get_parabol()
new_x, new_y = curve_after(x, y, x_ratio=1, y_ratio=1, normalized=False)
new_x = np.add(x, 0.5)
# new_y = np.add(y, 0.2)
xx = concat_arrays(x, new_x, normalized=True)
yy = concat_arrays(y, new_y, normalized=True)
# plt.plot(x, y, '-')
plt.plot(xx, yy, '--')
我正在研究模式分析,需要我用數學函式生成模式。
你能告訴我實作這一目標的方法嗎?謝謝!
uj5u.com熱心網友回復:
首先,我將有兩個不同的拋物線函式,例如:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y1 = np.add(x, 0.3)**2 # Parabola centered at -0.3
y2 = np.add(x, -0.3)**2 # Parabola centered at 0.3
您可以根據需要為 y1 和 y2 選擇自己的偏移量。
然后只需取兩個陣列的最小值
y_final = np.minimum(y1, y2)
plt.plot(x, y_final, '--')
uj5u.com熱心網友回復:
這涉及曲線擬合。您需要在洗掉值之前找到交集部分。由于 x 和 y 的值已被歸一化,因此我們必須準確確定兩個資料集的交匯點。我們可以看到它們在 x[i] >x[i 1] 時相遇。使用您的結合xx和yy提供的資料,我們因此可以執行以下操作:
data_intersect = int(np.where(np.r_[0,np.diff(xx)] < 0)[0])
x1 = xx[:data_intersect]
x2 = xx[data_intersect:]
y1 = yy[:data_intersect]
y2 = yy[data_intersect:]
difference = np.polyfit(x1, y1, 2) - np.polyfit(x2,y2,2)
meet = np.roots(difference) # all points where the two curves meet
meet = meet[(meet < max(x1)) & (meet >min(x1))] # only point curve meet
xxx = np.r_[x1[x1<meet], x2[x2>meet]]
yyy = np.r_[y1[x1<meet], y2[x2>meet]]
plt.plot(xxx, yyy, '--')

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488947.html
標籤:Python 麻木的 matplotlib
