嘿 我有一组频率和功率谱的值,我必须在对数刻度上绘制功率谱与频率。一旦完成,我需要通过它最好的拟合直线..我得到线性标度线...但是当我尝试将其叠加到频率功率谱图上时,结果图不显示任何线,相反,第一个图的数据点仅在空间中移动。 此外,如果使用loglog函数在对数刻度上绘制,则相同的行不会显示。
有人可以告诉我我应该做些什么来获得Log log?
所以我有一个有三列的文件;频率,功率规格。电源信号..这是我写的用于绘制数据和线的一部分..
#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)
答案 0 :(得分:2)
尽管您的示例中的绘图线命令不正确,但我认为它与您实际执行的操作类似。
第二个绘图命令绘制在不同的x范围内:
loglog(yval,zval) # plot yval vs zval
loglog(line) # plots range(0,len(line)) vs line
你还看一下line的值,它们是否有意义它们是否与yval,zval在同一范围内?
此外,您可能希望使用numpy.loadtxt
来加载数据文件。
答案 1 :(得分:2)
据我了解您的问题,您希望将两条线绘制到同一个图表中。以下是一般的工作方式:
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_xscale
和set_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数组的许多非常酷的功能。