Seite 1 von 1

Zeitintervall auf der X-Achse plotten?

Verfasst: Sonntag 27. November 2016, 17:41
von rusb
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?

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Sonntag 27. November 2016, 19:30
von MagBen
Zeile 8: x = 0
Zeile 13: x = x + 0
Daraus folgt, dass x immer gleich Null sein wird und xs nur Nullen enthält.

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Montag 28. November 2016, 20:11
von rusb
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?

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Montag 28. November 2016, 22:22
von kbr
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?

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Montag 28. November 2016, 23:12
von rusb
weiß ich leider nicht

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Donnerstag 1. Dezember 2016, 08:36
von rmanske
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.

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Donnerstag 1. Dezember 2016, 09:09
von Sirius3
@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

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Donnerstag 1. Dezember 2016, 10:01
von rmanske
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

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Donnerstag 1. Dezember 2016, 10:33
von 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()``.

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Donnerstag 1. Dezember 2016, 12:21
von rmanske
@BlackJack: Danke erstmal für die Erläuterung. Aber was ist der Grund dafür? Leuchtet mir als Python-Neuling nicht ein.

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Donnerstag 1. Dezember 2016, 12:29
von 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.

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Samstag 3. Dezember 2016, 09:19
von rmanske
@BlackJack: Danke für die Erklärung.

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Montag 5. Dezember 2016, 18:11
von rusb
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?

Re: Zeitintervall auf der X-Achse plotten?

Verfasst: Dienstag 6. Dezember 2016, 03:40
von rmanske
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]