2

周波数とパワー スペクトルの値のセットがあり、対数スケールでパワー スペクトルと周波数をプロットする必要があります。完了したら、最適な直線を通過させる必要があります.線形スケールで線を取得します..しかし、それを周波数パワースペクトルプロットに重ね合わせようとすると、結果のプロットには線が表示されません.代わりに、最初のプロットのデータ ポイントは単に空間的にシフトされます。また、loglog 関数を使用して対数スケールでプロットした場合、同じ線は表示されません。

対数スケールで線を引くために何をすべきか教えてもらえますか?

SO 私は 3 つの列を持つファイルを持っています。周波数、電力仕様。電力信号..これは、データと線をプロットするために私が書いたものの一部です..

#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)
4

2 に答える 2

2

あなたの例ではプロットラインコマンドが正しくないという事実にもかかわらず、実際に行っていることと似ていると思います。

2 番目のプロット コマンドは、別の x 範囲でプロットします。

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

また、line の値を確認しましたが、yval、zval と同じ範囲にあるということは理にかなっていますか?

numpy.loadtxtさらに、データファイルをロードするために使用したい場合があります。

于 2011-03-03T08:57:36.290 に答える
2

あなたの問題を理解しているので、同じ図に 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_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 配列の非常に優れた機能の多くを説明しているためです。

于 2011-03-03T09:13:23.213 に答える