2011-03-03 4 views
2

Hey, J'ai un ensemble de valeurs pour la fréquence et le spectre de puissance et je dois tracer le spectre de puissance par rapport à la fréquence sur l'échelle logarithmique. Une fois cela fait, j'ai besoin de passer la meilleure ligne droite à travers celle-ci. J'ai la ligne sur une échelle linéaire .. mais quand j'essaie de la superposer sur le spectre du spectre, la courbe résultante ne montre aucune ligne, à la place, les points de données du premier tracé sont simplement décalés dans l'espace. En outre, la même ligne, si elle est tracée sur une échelle logarithmique à l'aide de la fonction loglog, n'apparaît pas. Est-ce que quelqu'un peut me dire ce que je devrais faire pour obtenir la ligne sur une échelle Log?Ajustement de courbe en python

SO J'ai un fichier ayant trois colonnes; Fréquence, Spécification de puissance. signal de puissance .. Voici un morceau de ce que je l'ai écrit pour tracer les données et la ligne ..

#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

Vous devez inclure du code dans votre question, démontrant ce que vous essayez. – detly

Répondre

2

Malgré le fait que les commandes de ligne de tracé ne sont pas correctes dans votre exemple, je suppose qu'il est semblable à ce que vous avez réellement faire.

La seconde parcelles de commande parcelle sur une autre plage de x:

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

ont également vous regardez les valeurs de la ligne, font-ils sens sont-ils dans la même gamme que yval, zval?

En outre, vous pouvez utiliser numpy.loadtxt pour charger votre fichier de données.

+0

Oui exactement pourquoi je suis confus .. Je n'ai que récemment commencé à travailler sur Python .. Cet ajustement de gamme et tout ne vient pas facilement à moi .. C'est pourquoi je suis coincé! –

+0

Passé un peu de temps et de travail à travers le guide de l'utilisateur, c'est excellent: http://matplotlib.sourceforge.net/contents.html – Bernhard

2

Si je comprends votre problème, vous voulez tracer deux lignes sur le même diagramme. Voici comment cela se fait en général:

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

Alors, tout d'abord vous les mettez à la fois dans le même Axes, de sorte qu'ils apparaissent dans le même schéma. Pour modifier la mise à l'échelle, vous pouvez utiliser set_xscale et set_yscale respectivement. En dehors de cela, je ne peux m'empêcher de remarquer que votre code pour lire le fichier est horrible. Comme le suggère @Bernhard dans sa réponse, essayez d'utiliser numpy.loadtxt. Cela pourrait ressembler à ceci:

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

Cela devrait vous donner les mêmes résultats que votre boucle, seulement il est beaucoup plus concis. Je vous recommande fortement de lire le Tentative NumPy Tutorial, car il explique beaucoup de fonctionnalités très intéressantes des tableaux numériques.

Questions connexes