在绘图中的配件上设置限制

问题描述

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

下面的图形输出代码

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]

安培= [77.78630383833547,62.92926582239441,63.84025706577048,55.4890668704381​​65,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.220280471815858、0.5726686031033587、0.5465322281618783、0.5185100682386156、0.575055917739342、0.5681697592593679]]

标注错误,我设法使图形进行了一些更新,但是现在拟合完全失败了。

Graph 2

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

解决方法

使用xlimylim

    plt.plot(np.log(ts),amps,"1",ms=5,label="Schmitt Analysis (Log(Amplitude) 
    against Time)")
    
    
    y1,r,*_ = np.polyfit(amps,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(0,10)
    plt.legend()
    
    plt.savefig('A_Schmitt.jpg'

)
,

这里有两个问题-错字和-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,label="Schmitt Analysis (Amplitude against Log(Time))")

#linear fit excluding the first point that is an outlier
y1,*_ = np.polyfit(logts[1:],amps[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