matplotlib python中的曲线拟合

iibxawm4  于 2022-12-19  发布在  Python
关注(0)|答案(2)|浏览(180)

嘿,我有一组频率和功率谱的值,我必须在对数标度上绘制功率谱与频率的关系。完成后,我需要将最佳拟合直线穿过它..我得到了线性标度上的直线..但当我尝试将其叠加到频率-功率谱图上时,结果图不显示任何直线,相反,第一张图的数据点只是在空间上移动。而且,如果使用双对数函数以对数比例绘制,同一条线不会显示出来。
有人能告诉我我应该怎么做才能把线画在对数刻度上吗?
我有一个三列的文件频率,功率规格。功率信号。。这里是我写的一块来绘制数据和线。。

#initialize all variables to 0

#open the data file

while 1:
  ln = datafile.readline()
  if ln:
    data = ln.split()
    x = float(n)
    y = float(data[0])
    z = float(data[1])
    xval.append(float(n))
    yval.append(y)
    zval.append(z)
    n += 1
    sum_z += z
    sum_y += y
    sum_y_squared += y*y
    sum_yz += y*z
  else:
    break
datafile.close()

# calculate slope and intercept using formulae
for num in xval:
    res = intercept + slope*num
    line.append(res)

#Plot data
pylab.figure(0)
matplotlib.pylab.loglog(yval,zval)

#Plot line
pylab.figure(0)
pylab.plotloglog(line)
6ojccjat

6ojccjat1#

尽管在你的例子中,绘图线命令并不正确,但我认为它与你实际所做的类似。
第二个plot命令在不同的x范围上打印:

loglog(yval,zval) # plot  yval vs zval
loglog(line) #  plots range(0,len(line)) vs line

你也看过line的值,它们有意义吗,它们和yval,zval在同一范围内吗?
此外,您可能希望使用numpy.loadtxt来加载数据文件。

sf6xfgos

sf6xfgos2#

据我所知,你的问题是想在同一张图上画两条线,一般是这样做的:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(line1_x, line1_y)
ax.plot(line2_x, line2_y)
ax.set_yscale("log")

所以,首先你把它们放在同一个Axes中,这样它们就出现在同一个图中。要修改缩放比例,你可以分别使用set_xscaleset_yscale
除此之外,我不得不注意到您阅读该文件的代码非常糟糕,正如@Bernhard在他的回答中建议的那样,尝试使用numpy.loadtxt,如下所示:

data = numpy.loadtxt("data.txt")
n = len(data)
x = numpy.arange(n)
sum_z = sum(data.T[1])
sum_y = sum(data.T[0])
sum_y_squared = sum(data.T[0]**2)
sum_yz = sum(data.T[0]*data.T[1])

这应该会给予你和你的循环一样的结果,只是它要简洁得多。我强烈推荐你阅读Tentative NumPy Tutorial,因为它解释了numpy数组的很多非常酷的特性。

相关问题