Matplotlib

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.
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Hallo,
ich habe ein kleines Problem mit meinen Achseinstellungen.
Wollte eigentlich ein Bild einfügen, aber das geht irgendwie nicht, egal ich probiers zu erklären.
Ich lese aus einer textdatei zwei Werte aus einmal ein Messergebnis für die y Achse und einmal die zeit( Format: 091235 Stunden, Minuten, Sekunden)
Jetzt wenn ich das ganze plotte kommt folgendes Ergebnis zur schau.
Es werden nur ein paar Werte an der x Achse angezeigt. Ist ja auch nicht schlecht!
Aber dann das Problem:
Es zeigt z.B. die Uhrzeit 196000 an und als nächstes 198000 und dann 20000
Normalerweise ist ja die 196000 schon die 20000 da es ja eine Zeit ist und die nur bis 60 Minuten geht, aber das Programm die zeit bis 100 zählt.
Weiß vielleicht wer eine Lsg.

Vielen Dank

Gruß
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Campionissimo: Wandle die Zeit beim Einlesen in DateTime-Objekte um und plotte dann mit diesen.
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Danke erst mal für die Antwort!

leider geht das nicht, da es ein float wert ist.
Wenn ich in beim einlesen in einen str umwandel meckert er.
Könnte es nur danach machen und schon wieder meckert er

Code: Alles auswählen

 File "C:\TAF\eclipse_workspace\pyTAF\Krinner\Diagramm.py", line 145, in <module>
    a = datetime.strptime(str(xListA[1]),fmt)
  File "C:\Python25\lib\_strptime.py", line 330, in strptime
    (data_string, format))
ValueError: time data did not match format:  data=210206.0  fmt=%H:%M:%S'
ERROR: Module: Diagramm could not be imported.
Code:

Code: Alles auswählen

 xList = []
    print filename
    f = open(filename)

    for line in f:
        line = line.rstrip() 
        parts = line.split()
        #print parts[3]
        #xList.append(float(parts[1]))
        xList.append(float(parts[13]))

    return (xList)

(xListA, yListA) = readXYDataFromFile('Daten.txt')
(xListB) = readXYDataFromFile1("Daten1.txt")

fig1 = plt.figure()
ax1 = fig1.add_subplot(211)
fmt = "%H:%M:%S'"
a = datetime.strptime(str(xListA[1]),fmt)
ax1.plot(xListA, yListA, 'b-')
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Hab jetzt ein Format bekommen!
1900-01-01 21:02:06
aber ich möchte ja nur die Uhrzeit
Da kann ich nicht sagen b = a[5:10]

Und b einfügen in meinen code
Vielleicht weiß ja wer was

Wie gesagt ich habe Zeiten in diesem Format: 210811
wenn ich 21:08:11 mache bekomme ich eine Fehlermeldung das eine Floatzahl benötigt wird.
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Was is ich eigentlich möchte ist, dass für die x Achse nur meine Werte verwendet werden und keine die sich das autoscale raußzieht.
Weiß da jemand nen Vorschlag??`??
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Weiss zu diesen Thema keiner was ?
Wäre echt super
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

... Wie gesagt ich habe Zeiten in diesem Format: 210811 ...
Lesen ist echt 'ne Kunst, oder? In der Zeit, wo du hier auf eine Antwort gewartet hast, hättest du auch einfach mal in der Python-Dokumentation das Modul nachschlagen können, das gkuhl erwähnt hat.

Code: Alles auswählen

>>> import datetime
>>> d = datetime.time(21,8,11)
>>> print d
21:08:11
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

... und mpl harmoniert auch ganz wunderbar mit strftime. Und wie das benutzt wird, steht u. a. in einem aktuellen Thread (siehe auch http://matplotlib.sourceforge.net/api/dates_api.html).

HTH
Christian
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Das ist ja kein Problem auf das Format zu kommen.

Dann hab ich statt meiner Liste:
xListA=['1215 0',......]
dann diese Liste
['12:15:00']
diese Liste übergebe ich dann an:

ax1.plot(xListA,yListA)

Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:........\org.python.pydev.debug_1.5.0.1251989166\pysrc\runfiles.py", line 331, in __get_module_from_str
    mod = __import__(modname)
  File "C:\.......\pyTAF\Krinner\Diagramm.py", line 176, in <module>
    ax1.plot(xListA,yListA)
  File "C:\Python25\Lib\site-packages\matplotlib\axes.py", line 3433, in plot
    self.add_line(line)
  File "C:\Python25\Lib\site-packages\matplotlib\axes.py", line 1385, in add_line
    self._update_line_limits(line)
  File "C:\Python25\Lib\site-packages\matplotlib\axes.py", line 1393, in _update_line_limits
    p = line.get_path()
  File "C:\Python25\Lib\site-packages\matplotlib\lines.py", line 651, in get_path
    self.recache()
  File "C:\Python25\Lib\site-packages\matplotlib\lines.py", line 438, in recache
    x = np.asarray(self.convert_xunits(self._xorig), float)
  File "C:\Python25\Lib\site-packages\numpy\core\numeric.py", line 235, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: invalid literal for float(): 21:01:49
ERROR: Module: Diagramm could not be imported.
Aber danke für deine Antwort!
Vielleicht gibts noch ein paar Ratschläge?
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

So wie ich gkuhl verstanden habe, sollst du nicht die String-Repräsentation des Datetime Objekts benutzen, sondern das Objekt selber. Und evt. plot_date benutzen? Wie gesagt, mal ins Handbuch schauen kann nicht schaden ...
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Das komische ist wenn ich das mache:

Code: Alles auswählen

a = datetime.strptime(parts[3],"%H%M%S")
print a
b = datetime.time(a)
print b
#b = str(a.strftime("%H:%M:%S"))
#print b
xList.append((a))
yList.append(str(parts[1]))
un dann die werte an plot(xListA,yListA)
Übergebe funzt es, aber wenn ich
b wieder aktiviere
also:

Code: Alles auswählen

a = datetime.strptime(parts[3],"%H%M%S")
#print a
#b = datetime.time(a)
#print b
b = str(a.strftime("%H:%M:%S"))
print b
xList.append((b))
yList.append(str(parts[1]))



Dann kommt wieder die Fehlermeldung mit float usw. siehe oben
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Ich möchte nochmal von vor beginnen weil es sonst zu verwirrungen kommt.

Ich habe zwei Listen:
in einer Liste stehen Messwerte, in der anderen Zeiten
Listewerte schauen so aus:
Liste 1:['1.543','5.32',....]
Liste 2:['124512','130015',...]
Diese Werte möchte ich plotten, das funktioniert.
Jetzt mein Problem:
Bei der Liste 2 werden an der Achse falsche Werte aufgetragen.
Der Graph selbst stimmt aber, nur die Achse nicht, da die Zeiten von 134000 nächster Achspkt 136000 nächster Achspunkt 138000 nächster Achspunkt 140000.
Aber in der Zeit gibt es keine 13.60 Uhr da es 14 Uhr wäre und schon gar nicht 13.80 Uhr
Hoffe es gibt keine Verwirrung mehr
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Gib' mal ein syntaktisch korrektes Minimalbeispiel und eine dazu passende Fehlermeldung/-beschreibung, wenn Du mit diesem Minimalbeispiel nicht weiterkommst:

Code: Alles auswählen

from datetime import datetime
import pylab as plt
from matplotlib.dates import DateFormatter

fig1 = plt.figure()
ax1  = fig1.add_subplot(111)

data  = plt.arange(3)
dates = map(datetime.strptime, "061520 071532 084303".split(), ["%H%M%S"] * 3)

ax1.plot(dates, data)
# optional:
#ax1.xaxis.set_major_formatter(DateFormatter('%H:%M:%S'))

plt.show()
HTH
Christian

PS Ein Minimalbeispiel sollte die Daten, die es verarbeitet enthalten, denn wir wissen nicht was in Deinen Dateien steht.
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Wow!
Danke
Das erste was sdu gemacht hast funktioniert genauso wie mein Problem war.
Aber der Alternativ weg mit dem Datformatter war erfolgreich.
Super danke.

Hab nämlich ewig probiert und viel gegooglet.
Danke nochmal
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Da nicht für. Aber noch Etwas: Du kennst die Beispiele, die man auf der mpl-Seite runterladen kann?
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Hallo,

bis jetzt hat alles mit MPL funktioniert. Bin eigentlich sehr zufrieden!
Ich habe jetz zwei Kleinigkeiten und ein größere Problem.
Die Kleinigkeiten:
Hab mal in google nachgeschaut aber nicht wirklich was gefunden.
Ich möchte einen plot auf den ganzen Bildschirm ausgeben. Mit dem key f würde es gehen möchte es aber automatisch machen. Des Weiteren kann man in MPL die Position des Fensters bestimmen ?

Jetzt zu meinen größeren Problem:
Ich habe ein Auswahlmenü erstellt 1 2 und 3
wenn ich die 1 drücke kommt der erste plot, denn schließe ich dann wieder
dann kommt die aufforderung der Eingabe wieder. Ich drücke wieder die 1 und mein Programm stürzt ab.
Ich hab keine ahnung warum. Hab mal was mit Backend gelesen, aber...
Was könnte man dagegen tun ?
Vielen Dank hab mir bis jetzt immer gut geholfen;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Erstelle mal ein Minimalbeispiel, an dem den Problem nachvollzogen werden kann.

Für eine völlig neue Frage kann man übrigens auch ein neues Thema erstellen ;-)

Sebastian
Das Leben ist wie ein Tennisball.
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Ein Beispiel, dass den Fehler wiedergibt:

Code: Alles auswählen

while True:
    
    
    zahl = int(raw_input('Ihre Eingabe: '))
    

    if zahl == 0:

        xListA = [1, 2, 3, 4, 5, 6, 7]
        yListA = [5, 10, 15, 20, 25, 30, 35]
        
        fig1 = plt.figure(1)
        ax1 = fig1.add_subplot(111)      
        ax1.plot(xListA,yListA,"b-")
        ax1.set_xlabel('Daten')
        ax1.set_ylabel('Daten]', color='b')
        title('Daten')
        plt.show()

    if zahl == 1:
        
        xListA = [1, 2, 3, 4, 5, 6, 7]
        yListA = [5, 10, 15, 20, 25, 30, 35]
        
        fig1 = plt.figure(1)
        ax1 = fig1.add_subplot(111)
    
        ax1.plot(xListA,yListA,"b-")
        ax1.set_xlabel('Daten')
        ax1.set_ylabel('Daten]', color='b')
        title('Daten')
        plt.show()
Also wenn ich 0 eingebe kommt der plot dann schließe ich ihn und dann kommt die Eingabe aufforderung wieder, dann gib ich nochmal o ein und dann kommt der Fehler
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Und die Fehlermeldung ist?
BlackJack

@gkuhl: Na wahrscheinlich:

Code: Alles auswählen

In [47]: int('o')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

ValueError: invalid literal for int() with base 10: 'o'
SCNR :twisted:
Antworten