Matplotlib erster Versuch

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
DMS33GER
User
Beiträge: 4
Registriert: Samstag 18. November 2017, 13:37

Hallo,
ich beschäftige mich jetzt schon ein paar Monate mit Python. Nun komme ich aber einfach nicht weiter und bräuchte mal Hilfe.
Ziel ist es Verschiedene Temperaturmessungen in einem Diagramm darzustellen. Die Werte hole ich aus verschiedenen DB oder txt Dateien. Dabei sehen die X-Werte so aus "Jahr-Monat-Tag Uhrzeit" und bei Y1..Y3 Temperaturen wie "18,6".
Beim Ploten mit Matplotlib kommt folgende Ausgabe, bei der die Y-Skala in 3 Teile gespalten wird. Die Temperaturen sollten sich doch aber übereinander legen und nur eine Y-Skala haben.

Plot: https://drive.google.com/file/d/1mcJzjN ... Q-tbT/view

Code: Alles auswählen

...
plt.plot(x, y1, label='T1')
plt.plot(x, y2, label='T2')
plt.plot(x, y3, label='T3')
plt.grid(True)
plt.xticks(rotation=45)
plt.ylabel('Temp. in °C')
plt.title(pyNAME)
plt.legend()
plt.show()
MfG DMS

Ich bin doch auch nur ein Mensch! Und Menschen machen Fehler und lernen meist daraus.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

im Prinzip funktioniert das so, wie du das gezeigt hast. Der Fehler muss also in dem Teil liegen, den du nicht zeigst. Versuch’ am besten mal, ein lauffähiges Minimalbeispiel zu finden, das den Fehler zeigt. Sprich: So lange Teile des Programms entfernen, bis der Fehler nicht mehr auftritt.

Was für einen Typ haben die Werte, die du da plottest?
DMS33GER
User
Beiträge: 4
Registriert: Samstag 18. November 2017, 13:37

hm..

Code: Alles auswählen

try:
	y2 = []
	result2 = c.execute("SELECT Datensatz, Temp FROM covelin ORDER BY Datensatz ASC LIMIT 10")
	for row in result2:
		r2 = str(float(row[1]))
		r2 = str(r2.replace(".", ","))
		y2 += [r2]
except:
	print("[FAIL] SQL 2")
	sys.exit(0)
Ohne string geht es aber wie zeige ich auf dem Plot die Werte mit Komma?

Danke, narpfel. Irgendwie werd ich mich mal zu Komma und Punkt belesen müssen ...
MfG DMS

Ich bin doch auch nur ein Mensch! Und Menschen machen Fehler und lernen meist daraus.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Du könntest einen Tick Formatter benutzen.

Zu deinem Code: Ein `except` ohne konkrete Ausnahme, die abgefangen werden soll, ist quasi nie eine gute Idee, weil man damit alle Fehler verschluckt. Außerdem ist ein`print("Fehler!"); sys.exit()` keine sinnvolle Fehlerbehandlung, weil das Programm ohne die Fehlerbehandlung auch abbrechen würde, dabei aber noch einen zur Fehlersuche verwendbaren Traceback ausgegeben würde.

Warum konvertierst du den `Temp`-Wert aus der Datenbank in einen `float`? Die Werte sollten direkt als Zahlen in der Datenbank gespeichert werden.

`y2 += [r2]` ist nur eine ineffiziente Möglichkeit, `y2.append(r2)` zu schreiben.

Den Code könnte man so ein wenig pythonischer formulieren (ungetestet):

Code: Alles auswählen

result = c.execute("SELECT Datensatz, Temp FROM covelin ORDER BY Datensatz ASC LIMIT 10")
y2 = [temperature for (_, temperature) in result]
# oder
from operator import itemgetter
y2 = list(map(itemgetter(1), result))
DMS33GER
User
Beiträge: 4
Registriert: Samstag 18. November 2017, 13:37

Bisher hab ich hier und da Mal was gelesen und kopiert. Die Datenerfassung is schon etwas älter und nicht von mir. Bei vielen liefen Scripte wohl nebenbei in einem terminal und es wurden Messwerte gleich mit gezeigt und daher das `print("Fehler!")` wenn in einer Schleife bei einem Block kein Wert ermittelt wurde (Gerät offline usw.).
Ich merke schon vor mir waren wohl auch nur Amateure beschäftigt.

Danke für deine Hilfe, ich werd deine Anmerkungen mit aufnehmen und schön weiter basteln und lernen.
MfG DMS

Ich bin doch auch nur ein Mensch! Und Menschen machen Fehler und lernen meist daraus.
Antworten