Python plot from data help?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Basilius Sapientia
User
Beiträge: 46
Registriert: Freitag 5. September 2014, 22:34

Liebe ihr!

Ich bin ganz neu ;) ... habe es schon geschafft meine ersten Plots zu plotten. Doch jetzt stehe ich vor einem Problem! Ich habe diesen Code:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

with open("dataafl") as f:
    data = f.read()

data = data.split('\n')

Temp = [row.split(' ')[0] for row in data]
X1 = [row.split(' ')[1] for row in data]

fig = plt.figure()

ax1 = fig.add_subplot(111)

ax1.set_title("Plot title...")    
ax1.set_xlabel('your x label..')
ax1.set_ylabel('your y label...')

ax1.plot(Temp,X1, c='r', label='the data')

leg = ax1.legend()

plt.show()
Hier sind meine Daten, die im "File" sind:
#Temp X1 X2
309.820 0.473 0.529
309.422 0.400 0.601
309.031 0.371 0.625
308.006 0.326 0.657
306.686 0.293 0.690
304.553 0.255 0.724
301.803 0.218 0.758
299.097 0.193 0.783
296.000 0.168 0.804
294.534 0.157 0.814
Dadurch bekomme ich folgende Fehlermeldung:
Traceback (most recent call last):
File "/home/basilius/MEGAsync/Q5/plot_aflv4", line 10, in <module>
X1 = [row.split(' ')[1] for row in data]
IndexError: list index out of range
[Finished in 0.4s]
Was mache ich falsch? Ich würde gerne X1, Temp und X2, Temp in einem Plot haben. Danach würde ich gerne einen Curvefit [Regression nach einem Polynomium dritten Grades] machen (für beide Plots einzeln) und das dann sichtbar auf dem Graph machen. Hoffentlich kann mir hier Jemand helfen?

Viele liebe Grüße!
Zuletzt geändert von Basilius Sapientia am Dienstag 30. September 2014, 19:00, insgesamt 2-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

X1 ist nicht definiert. Python kann auch nicht wissen, dass du die Spalte aus X1 meinst. Zeige mal deinen richtigen Code, welcher den Fehler auch produziert. Die in der Fehlermeldung angezeigte Zeile ist so ja nicht in deinem Code vorhanden.

NumPy bietet übrigens die Möglichkeit zum Laden von csv-Dateien, dann muss du dich nicht selbst darum kümmern und vermeidest übliche Fehler beim Parsing. Ansonsten bietet Python auch noch ein csv-Modul.
Das Leben ist wie ein Tennisball.
Basilius Sapientia
User
Beiträge: 46
Registriert: Freitag 5. September 2014, 22:34

EyDu hat geschrieben:X1 ist nicht definiert. Python kann auch nicht wissen, dass du die Spalte aus X1 meinst. Zeige mal deinen richtigen Code, welcher den Fehler auch produziert. Die in der Fehlermeldung angezeigte Zeile ist so ja nicht in deinem Code vorhanden.

NumPy bietet übrigens die Möglichkeit zum Laden von csv-Dateien, dann muss du dich nicht selbst darum kümmern und vermeidest übliche Fehler beim Parsing. Ansonsten bietet Python auch noch ein csv-Modul.
Danke für die schnelle Antwort. Leider hatte ich einen falschen Code und eine falsche Fehlermeldung hochgeladen. Jetzt habe ich den richtigen Code und die richtige Fehlermeldung hochgeladen. Können sie mir bitte helfen? Und wie würden sie es mit csv lösen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du greifst auf ein (Listen-)Element zu, welches nicht existiert:

Code: Alles auswählen

>>> l = [1,2,3]
>>> l[0]
1
>>> l[1]
2
>>> l[2]
3
>>> l[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
Ich tippe mal auf eine Leerzeile in der csv-Datei. Wie gesagt: Nutze NumPy zum Laden der Daten, dann funktioniert das auch mit allen gültigen Dateien.
Das Leben ist wie ein Tennisball.
Basilius Sapientia
User
Beiträge: 46
Registriert: Freitag 5. September 2014, 22:34

Vielen Dank!
Zuletzt geändert von Basilius Sapientia am Dienstag 30. September 2014, 19:28, insgesamt 2-mal geändert.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

So geht's

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

dataafl = np.loadtxt("dataafl")

plt.figure()

plt.plot(dataafl[:,0], dataafl[:,1], label="X1")
plt.plot(dataafl[:,0], dataafl[:,2], label="X2")

plt.legend()
plt.xlabel("Temp")
plt.ylabel("X")
plt.show()
add_subplot brauchst Du nur, wenn Du mehrere Plots in einem Fenster nebeneinander und/oder übereinander anordnen möchtest.
Numpy hat eine ganze Reihe von IO Funktionen (http://docs.scipy.org/doc/numpy/referen ... es.io.html), sodass Du Deine Daten häufig ohne open sowie ohne Schleife einlesen kannst. Das ist sowieso ein Grundsatz bei der Programmierung mit Numpy: vermeide Schleifen.
a fool with a tool is still a fool, www.magben.de, YouTube
Basilius Sapientia
User
Beiträge: 46
Registriert: Freitag 5. September 2014, 22:34

MagBen hat geschrieben:So geht's

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

dataafl = np.loadtxt("dataafl")

plt.figure()

plt.plot(dataafl[:,0], dataafl[:,1], label="X1")
plt.plot(dataafl[:,0], dataafl[:,2], label="X2")

plt.legend()
plt.xlabel("Temp")
plt.ylabel("X")
plt.show()
add_subplot brauchst Du nur, wenn Du mehrere Plots in einem Fenster nebeneinander und/oder übereinander anordnen möchtest.
Numpy hat eine ganze Reihe von IO Funktionen (http://docs.scipy.org/doc/numpy/referen ... es.io.html), sodass Du Deine Daten häufig ohne open sowie ohne Schleife einlesen kannst. Das ist sowieso ein Grundsatz bei der Programmierung mit Numpy: vermeide Schleifen.

Vielen, vielen Dank! Von hier müsste ich es schaffen :) Eine andere möglichkeit wäre auch dies hier:

Code: Alles auswählen

import numpy
import matplotlib.pyplot as plt
Temp, X1, X2 = numpy.loadtxt("dataafl.csv", skiprows=1, unpack=True)
print(Temp)
Antworten