拟合参数下方的单独曲线

Separate curve below fitting parameter

我正在努力使我的曲线符合 python。

举个简单的例子我能适应。

但是,我想在拟合参数值以下分离出不同颜色或形状的曲线。

#This is my x  and y array

from numpy import sqrt
import pandas as pd
from scipy.optimize import curve_fit
from matplotlib import pyplot
import numpy as np
import csv


x = [2, 1.95, 1.9, 1.85, 1.8, 1.75, 1.7, 1.65, 1.6, 1.55, 1.5, 1.45, 1.4, 1.35
 1.3, 1.25, 1.2, 1.15, 1.1, 1.05, 1.01]
y = [1, 1, 1, 1, 0.99, 0.938, 0.9, 0.857, 0.762, 0.686, 0.59, 0.529, 0.509, 0.47, 0.462, 0.452, 0.452, 0.452, 0.457, 0.43,0.424]


print(len(x))
print(len(y))

def func(x, m, n):
    return  1 - 1/2 * np.exp(-(x - m)/(n))


params, covs = curve_fit(func, x, y)
 
print("params: ", params)
print("covariance: ", covs) 

for idx, value in enumerate(x):
    params, _ = curve_fit(func, x, y)
    m, n = params[0], params[1]
    if value >= m:
        yfit1 =  1 - 1/2 * np.exp(-(x - m)/(n))
    else:
        #params, _ = curve_fit(func, x, y)
        #r_t, n = params[0], params[1]
        yfit2 =  1 - 1/2 * np.exp(-(x - m)/(n))
    print(value)
    
plt.plot(x, y, 'bo', linestyle ='solid', marker=">", label="original")
plt.plot(x, yfit1,label="m >= %.3f"%m)
plt.plot(x, yfit2,'ko', marker='>', label="x < m")
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='best', fancybox=True, shadow=True)
plt.grid(False)
plt.show() 

输出

params:  [1.19707919 0.52674861]

# So this gives 1.197 for m.

当我看到我的 x 数组时,我有几个值小于 m 的值(来自参数的 m=1.197)。

所以我想用不同的方式绘制它们(颜色或大小),这样我就可以在同一个图中有两条不同的曲线,所有 x 都大于 m,其余 x 小于 m。

我试图通过创建两个方程来给出循环,但我没有得到任何区别。似乎在拟合线上绘制了相同的图形。

我能得到一些帮助吗? 任何帮助将不胜感激。

谢谢。

您的 if-else 现在并没有真正起作用,因为无论 if 条件是真还是假,您都在做同样的事情。

如果您有兴趣在不同的 x 间隔上使用不同的样式进行绘图,这是一种方法(您只需替换代码的最后绘图部分):

# Arrays offer an easier indexing compared to lists
x = np.array(x)
y = np.array(y) 

plt.plot(x, y, 'bo', linestyle ='solid', marker=">", label="original")
# Notice the different subsets of the arrays that are being plotted (x<=m and x>m) and tweak these as you like
plt.plot(x[x<=m], yfit1[x<=m],label="m >= %.3f"%m)
plt.plot(x[x>m], yfit1[x>m], 'r:', label="m >= %.3f"%m) 
plt.plot(x, yfit2,'ko', marker='>', label="x < m")
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='best', fancybox=True, shadow=True)
plt.grid(False)
plt.show()