拟合参数下方的单独曲线
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()
我正在努力使我的曲线符合 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()