python - 对绘图中的拟合设置限制

标签 python numpy matplotlib curve-fitting

我有一个数据图,并对它应用了线性拟合,但是,我不确定为什么,但拟合线远离数据本身。我将如何对这条线施加限制,使其恰好适合我的数据(最好也使数据成为图表的焦点!)

图形输出和代码如下:

Linear Fitted Data

plt.plot(np.log(ts), amps, "1", ms=5, label="Schmitt Analysis (Amplitude against Log(Time))")

##Plot Linear Fit
y1, r, *_ = np.polyfit(amps, np.log(ts), 1, full=True)
f1 = np.poly1d(y1)
plt.plot(amps, f1(amps), label=f"linear ($\chi^2$ = {r[0]:0.2f})")

plt.xlabel("Log(Time)")
plt.ylabel("Amplitude")
plt.title("Schmitt Analysis (Amplitude against Log(Time))")
plt.xlim(0,10)
plt.ylim(-40,80)
plt.legend()

plt.savefig('A_Schmitt.jpg')

实际使用的数据:

log(ts) = [ -inf 2.89037176 3.58351894 3.98898405 4.49980967 4.68213123 4.83628191 4.9698133 5.08759634 5.19295685 5.28826703 5.37527841 5.45532112 5.52942909 5.59842196 5.7235851 5.78074352 5.83481074 5.9348942 6.02586597 6.06842559 6.10924758 6.1484683 6.22257627 6.25766759 6.32435896 6.38687932 6.41673228 6.44571982 6.50128967 6.52795792 6.5539334 6.71901315 6.78219206]

amps = [77.78630383833547, 62.92926582239441, 63.84025706577048, 55.489066870438165, 38.60797989548756, 40.771390484048545, 14.679073842876978, 33.95959972488966, 29.41960790300141, 32.93241034391399, 30.927428194781815, 31.086396885182356, 21.52771899125612, 4.27684299160886, 6.432975528727562, 7.500376934048583, 18.730555740591637, 4.355896959987761, 11.677509915219987, 12.865482314301719, 0.6120306267606219, 12.614420497451556, 2.2025029753442404, 9.447046999592711, 4.0688197216393425, 0.546672901996845, 1.12780050608251, 2.2030852358874635, 2.202804718915858, 0.5726686031033587, 0.5465322281618783, 0.5185100682386156, 0.575055917739342, 0.5681697592593679]

注意到我犯了一个错误,我设法让图表更新了一点,但现在拟合完全失败了。
Graph 2

我也将上面的代码更新到了新版本。

最佳答案

这里有两个问题 - 拼写错误和 -inf 的存在。
首先是拼写错误 - 您在拟合中分别将 logtsamps 归因于 yx,而它应该是相反的。
其次,拟合例程无法很好地处理对数转换时间数组中 -inf 的存在。我们可以使用 logts[1:] 手动排除第一个点。

import numpy as np
from matplotlib import pyplot as plt

#recreating your input - seemingly log(ts) is a numpy array
logts = np.asarray([-np.inf, 2.89037176, 3.58351894, 3.98898405, 4.49980967, 4.68213123, 4.83628191, 4.9698133, 5.08759634, 5.19295685, 5.28826703, 5.37527841, 5.45532112, 5.52942909, 5.59842196, 5.7235851, 5.78074352, 5.83481074, 5.9348942, 6.02586597, 6.06842559, 6.10924758, 6.1484683, 6.22257627, 6.25766759, 6.32435896, 6.38687932, 6.41673228, 6.44571982, 6.50128967, 6.52795792, 6.5539334, 6.71901315, 6.78219206])
amps = [77.78630383833547, 62.92926582239441, 63.84025706577048, 55.489066870438165, 38.60797989548756, 40.771390484048545, 14.679073842876978, 33.95959972488966, 29.41960790300141, 32.93241034391399, 30.927428194781815, 31.086396885182356, 21.52771899125612, 4.27684299160886, 6.432975528727562, 7.500376934048583, 18.730555740591637, 4.355896959987761, 11.677509915219987, 12.865482314301719, 0.6120306267606219, 12.614420497451556, 2.2025029753442404, 9.447046999592711, 4.0688197216393425, 0.546672901996845, 1.12780050608251, 2.2030852358874635, 2.202804718915858, 0.5726686031033587, 0.5465322281618783, 0.5185100682386156, 0.575055917739342, 0.5681697592593679]

#plot raw data
plt.plot(logts, amps, "1", ms=5, label="Schmitt Analysis (Amplitude against Log(Time))")

#linear fit excluding the first point that is an outlier
y1, r, *_ = np.polyfit(logts[1:], amps[1:], 1, full=True)
f1 = np.poly1d(y1)

#get min and max of logts excluding nan and inf values
logtsmin = np.floor(np.nanmin(logts[logts != -np.inf]))
logtsmax = np.ceil(np.nanmax(logts[logts != np.inf]))
#evenly spaced x-values for the fit line plot 
xlogts = np.linspace(logtsmin, logtsmax, 1000)
plt.plot(xlogts, f1(xlogts), label=f"linear ($\chi^2$ = {r[0]:0.2f})")

plt.xlabel("Log(Time)")
plt.ylabel("Amplitude")
plt.title("Schmitt Analysis (Amplitude against Log(Time))")
plt.xlim(logtsmin, logtsmax)
plt.legend()

plt.show()

示例输出:

enter image description here

关于python - 对绘图中的拟合设置限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64649989/

相关文章:

python - 在 pygame 中使用 matplotlib

python - 如何使用键盘快捷键向上/向下移动 Jupyter 笔记本单元格?

python - 如何在没有for循环的情况下在二维numpy数组中设置多列?

python - 如何在 matplotlib 图例中添加一个字符串作为艺术家?

python - 在 numpy 的 3 维矩阵中插入非对齐元素

python - 通过索引访问 coo_matrix 时出现类型错误

python - matplotlib 返回的最大 PSD 频率箱是否错误?

python - 计算每个数据帧行中的出现次数,然后创建最频繁出现的列

python - TensorFlow - tf.layers 与 tf.contrib.layers

python - 如何设置 Python 包