Zeitintervall auf der X-Achse plotten?

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
rusb
User
Beiträge: 9
Registriert: Donnerstag 20. Oktober 2016, 10:53

Hallo Leute. Ich habe ein Skript erstellt mit dem ich ein analoges Signal (eine elektrische Spannung) einlesen kann und den Wert grafisch auch ausgeben kann. Mit einem sogenannten Potentiometer kann ich auch die Spannung ständig variieren. Ich würde aber gerne beim Plot einen Zeitintervall einbauen, sodass er mir z.B sagt, bei Sekunde 1 betrug die Spannung 3V und bei Sekunde 2 betrug die Spannung 3V usw. Also so dass der Graph quasi wie eine Art "Gebirge" aussieht. Da ich leider nicht weiß wie ich das mit der Zeit auf der X-Achse hinbekommen. erhalte ich beim wert '0' auf der X-Achse quasi nur ein "Strich"

Code: Alles auswählen

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

def func(i):
    xs = []
    ys = []
    i = 1
    x = 0
    while i < 10:
        a = getAnalogData(CH, CLK, DIN, DOUT, CS)  # Gibt mir den Spannungswert zurück 
        xs.append(x)
        ys.append(a)
        x = x + 0
        i = i + 1
    ax1.clear()
    ax1.plot(xs,ys)

ani = animation.FuncAnimation(fig,rusb, interval = 500)
plt.show()
Das Problem an der Code ist das die X-Achse quasi ständig bei 0 steht bleibt. Ich möchte aber gerne mit der X-Achse gerne eine Zeitachse realisieren.

Hat jemand einen Codebeispiel woran ich mich orientieren könnte?
Zuletzt geändert von Anonymous am Sonntag 27. November 2016, 18:12, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Zeile 8: x = 0
Zeile 13: x = x + 0
Daraus folgt, dass x immer gleich Null sein wird und xs nur Nullen enthält.
a fool with a tool is still a fool, www.magben.de, YouTube
rusb
User
Beiträge: 9
Registriert: Donnerstag 20. Oktober 2016, 10:53

Das ist mir ja klar. Das habe ich nur so gemacht. Ich würde aber einfach wissen, wie man eine Zeitachse plotten kann? Hat da niemand eine Idee?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

rusb hat geschrieben:Das ist mir ja klar. Das habe ich nur so gemacht. Ich würde aber einfach wissen, wie man eine Zeitachse plotten kann? Hat da niemand eine Idee?
In y legst Du die Messwerte ab, die Du zu einem gegebenen Zeitpunkt t gemessen hast. Und was gehört dann folgerichtig in x?
rusb
User
Beiträge: 9
Registriert: Donnerstag 20. Oktober 2016, 10:53

weiß ich leider nicht
rmanske
User
Beiträge: 26
Registriert: Freitag 30. September 2016, 13:26

Ich habe so etwas ähnliches gemacht und mir dafür eine Funktion geschrieben.

Du nimmst zu jedem Messwert die Zeit, an dem der Messwert genommen wurde. Am Ende bildest Du von dem Messwert an der Stelle die Differenz zum ersten Messwert.

Beispiel:
1. Messwert: 20:00:00 Uhr
2. Messwert: 20:00:01 Uhr
3. Messwert: 20:00:03 Uhr
4. Messwert: 20:00:07 Uhr
Dann erhält der erste Messwert natürlich den Wert 0.
Der zweite Messwert 1 s (20:00:01 - 20:00:00)
Der dritte Messwert 3 s (20:00:03 - 20:00:00)
Der vierte Messwert 7 s (20:00:07 - 20:00:00)

Code: Alles auswählen

    def build_timedelta(timevals):
            return [ timedelta.total_seconds(
                datetime.strptime(times, "%d.%m.%Y %H:%M:%S,%f") -
                datetime.strptime(timevals[0], "%d.%m.%Y %H:%M:%S,%f"))
               for times in timevals ]
Das wären dann Deine Werte, die Du auf der x-Achse plottest.

Ich hoffe ich habe das richtig verstanden.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@rmanske: eine Methode sollte nicht über den Umweg der Klasse aufgerufen werden; sondern direkt über ihre Instanz. Statt Code zu kopieren definiert man Funktionen. Variablennamen sollten nichts falsches beschreiben: `times` enthält nicht mehrere sondern maximal eine Zeit.

Also ungefähr so:

Code: Alles auswählen

def parse_datetime(date_time):
    return datetime.strptime(date_time, "%d.%m.%Y %H:%M:%S,%f")

def build_timedelta(times):
    start = parse_datetime(times[0])
    return [(parse_datetime(time) - start).total_seconds() for time in times]
oder damit man als Parameter irgendein iterierbares Objekt benutzen kann:

Code: Alles auswählen

def build_timedelta(times):
    start = None
    result = []
    for time in times:
        time = parse_datetime(time)
        if start is None:
            start = time
        result.append((time - start).total_seconds())
    return result
rmanske
User
Beiträge: 26
Registriert: Freitag 30. September 2016, 13:26

Sirius3 hat geschrieben:@rmanske: eine Methode sollte nicht über den Umweg der Klasse aufgerufen werden; sondern direkt über ihre Instanz.
Habe ich nicht verstanden, was Du meinst. Kannst Du das mal näher erklären? Danke schon mal
Sirius3 hat geschrieben: Statt Code zu kopieren definiert man Funktionen.
Verstehe ich nicht was Du meinst. Die Funktion "build_timedelta" ist nirgendwo kopiert sondern von mir.
Sirius3 hat geschrieben: Variablennamen sollten nichts falsches beschreiben: `times` enthält nicht mehrere sondern maximal eine Zeit.
O.k. Habe ich verstanden. Danke. Gelobe Besserung :D
BlackJack

@rmanske: `timedelta.total_seconds()` sollte man nicht auf der `timedelta`-Klasse aufrufen sondern als Methode auf dem Ergebnis der Subtraktion. Also nicht ``timedelta.total_seconds(a - b)`` sondern ``(a - b).total_seconds()``.
rmanske
User
Beiträge: 26
Registriert: Freitag 30. September 2016, 13:26

@BlackJack: Danke erstmal für die Erläuterung. Aber was ist der Grund dafür? Leuchtet mir als Python-Neuling nicht ein.
BlackJack

@rmanske: Weil man Methoden so aufruft. Kann ja auch sein das (a - b) was anderes als `timedelta` ergibt was aber auch eine `total_seconds`-Methode hat. Diese Möglichkeit der Polymorphie ist ja gerade ein Grund warum man objektorientiert programmiert. Kürzer ist es ausserdem auch noch.
rmanske
User
Beiträge: 26
Registriert: Freitag 30. September 2016, 13:26

@BlackJack: Danke für die Erklärung.
rusb
User
Beiträge: 9
Registriert: Donnerstag 20. Oktober 2016, 10:53

Wie kann ich beispielsweise genau auf die beiden Funktionen zugreifen?

Code: Alles auswählen

def parse_datetime(date_time):
    return datetime.strptime(date_time, "%d.%m.%Y %H:%M:%S,%f")
 
def build_timedelta(times):
    start = parse_datetime(times[0])
    return [(parse_datetime(time) - start).total_seconds() for time in times]

Was muss ich genau bei "bulid_timedelta(times)" in den Klammern einsetzen damit es funktioniert?
rmanske
User
Beiträge: 26
Registriert: Freitag 30. September 2016, 13:26

rusb hat geschrieben:Wie kann ich beispielsweise genau auf die beiden Funktionen zugreifen?
In dem Du über import die entsprechenden Module lädst.
rusb hat geschrieben: Was muss ich genau bei "bulid_timedelta(times)" in den Klammern einsetzen damit es funktioniert?
In die Klammer muss Deine Liste mit den aktuellen Zeiten der jeweiligen Messwerte.

[codebox=pycon file=Unbenannt.txt]xs.append(aktuelle_uhrzeit)
time_delta_list = build_timedelta(xs)[/code]
Antworten