2 Stimmen

Kurvenanpassung in Python

Hallo, Ich habe eine Reihe von Werten für Frequenz und Leistungsspektrum und muss das Leistungsspektrum in Abhängigkeit von der Frequenz auf einer logarithmischen Skala darstellen. Wenn ich das getan habe, muss ich die beste Anpassungsgerade durch sie ziehen. Ich erhalte die Linie auf einer linearen Skala, aber wenn ich versuche, sie dem Frequenz-Leistungsspektrum-Diagramm zu überlagern, zeigt das resultierende Diagramm keine Linie, sondern die Datenpunkte des ersten Diagramms sind lediglich im Raum verschoben. Die gleiche Linie wird auch nicht angezeigt, wenn sie mit der Funktion loglog auf der logarithmischen Skala aufgetragen wird.

Kann mir jemand sagen, was ich tun muss, um die Linie auf eine Log-Skala zu bekommen?

SO habe ich eine Datei mit drei Spalten; Frequenz, Leistung spez. Leistungssignal. Hier ist ein Teil von dem, was ich geschrieben habe, um die Daten und Linien zu zeichnen.

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

2voto

Bernhard Punkte 8045

Obwohl die Befehle in Ihrem Beispiel nicht korrekt sind, gehe ich davon aus, dass es dem entspricht, was Sie tatsächlich tun.

Der zweite Plot-Befehl zeichnet auf einem anderen x-Bereich:

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

Schauen Sie sich auch die Werte von line an, machen sie Sinn, liegen sie im gleichen Bereich wie yval, zval?

Zusätzlich können Sie Folgendes verwenden numpy.loadtxt um Ihre Datendatei zu laden.

2voto

Björn Pollex Punkte 72424

So wie ich Ihr Problem verstehe, möchten Sie zwei Linien in dasselbe Diagramm einzeichnen. So wird es im Allgemeinen gemacht:

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")

Also, zuerst legen Sie beide in dieselbe Axes so dass sie in demselben Diagramm erscheinen. Um die Skalierung zu ändern, können Sie Folgendes verwenden set_xscale et set_yscale beziehungsweise.

Abgesehen davon kann ich nicht umhin festzustellen, dass Ihr Code für das Lesen der Datei grauenhaft ist. Wie @Bernhard in seiner Antwort vorschlägt, versuchen Sie es mit numpy.loadtxt . Dies könnte folgendermaßen aussehen:

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])

Damit sollten Sie die gleichen Ergebnisse erzielen wie mit Ihrer Schleife, nur dass sie viel prägnanter ist. Ich empfehle Ihnen dringend die Lektüre der Vorläufiges NumPy-Tutorial , da es viele der wirklich coolen Funktionen von Numpy-Arrays erklärt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X