Seite 1 von 1
MySQL in matplotlib
Verfasst: Montag 22. Juni 2020, 12:22
von AimLegend
Guten Tag,
ich habe einen Raspberry Pi, auf dem ich einen Temperatursensor habe, der jede Minute die Temperatur mit Datum und Uhrzeit in eine MySQL Datenbank einträgt. Jetzt möchte ich diese Daten in ein Diagramm mit matplotlib einfügen. Ich habe das Problem, dass ich Uhrzeit und Datum nicht in das Diagramm einfügen kann, da es die Uhrzeit als Zahlenwert nimmt und ich dadurch eine sehr komische Skalierung bekomme. Bei der Temperatur wird jeder Wert als ein Punkt der Skala angegeben, wodurch ich keine ordentliche Temperaturkurve angezeigt bekomme. Wenn jemand weiß wie man die Daten aus der Datenbank in ein Diagramm bekommt, würde ich mich über eine Antwort sehr freuen.

Re: MySQL in matplotlib
Verfasst: Montag 22. Juni 2020, 17:10
von __blackjack__
@AimLegend: Du machst halt irgendwas falsch. Matplotlib ist egal wo die Daten her kommen. Und wie kann es die Uhrzeit als Zahlenwert nehmen? Man übergibt doch komplette `datetime`-Objekte wo Datum *und* Uhrzeit enthalten sind. So steht das ja auch (hoffentlich) in der Datenbank.
Re: MySQL in matplotlib
Verfasst: Montag 22. Juni 2020, 17:17
von AimLegend
Danke für die Antwort.
Bei mir wurden, keine Ahnung wieso, Datum und Uhrzeit als einzelne Spalten gespeichert.
Re: MySQL in matplotlib
Verfasst: Montag 22. Juni 2020, 17:27
von AimLegend
Hier auch noch mal mein Code, damit ist es wahrscheinlich leichter den Fehler zu finden
Ich habe bei den Temperaturwerten und der Uhrzeit immer die Klammern und alles Unnötige entfernt.
Code: Alles auswählen
db = MySQLdb.connect("localhost", "USERNAME", "PASSWORD", "haus")
curs = db.cursor()
curs.execute("SELECT wert FROM temperatur_tb")
var = str(curs.fetchall())
var = var.replace("(", "")
var = var.replace(",)", "")
var = var.replace(")", "")
var = var.replace(" ", "")
print(var)
curs.execute("SELECT uhrzeit FROM temperatur_tb")
time1 = str(curs.fetchall())
time1 = time1.replace("(","")
time1 = time1.replace("datetime.timedelta","")
time1 = time1.replace("seconds=","")
time1 = time1.replace("),)","")
time1 = time1.replace(" ","")
time1 = time1.split(",")
t1 = list(time1)
print(time1)
class plot():
plt.ylabel('Temperatur')
plt.xlabel('Uhrzeit')
plt.plot(var,time1, 'b-')
plt.grid(True)
plt.show()
plot()
Re: MySQL in matplotlib
Verfasst: Montag 22. Juni 2020, 18:06
von Sirius3
@AimLegend: man verwendet nicht die Stringrepräsentation von Listen, um damit weiter zu arbeiten. Zum Schluß hast Du einen String und eine Liste mit Strings, die man beide nicht plotten kann.
Die Reihenfolge einer Datenbankabfrage ist beliebig, es ist also nicht garantiert, dass wert zu uhrzeit gehört, daher fragt man beides gemeinsam ab.
Das Kürzel tb im Tabellennamen ist unsinnig, da ja jeder weiß, dass es sich um eine TaBelle handelt.
Die Klasse plot ist totaler murks. Warum packst Du plot-Befehle in eine Klassendefinition? Dass Du zum Schluß noch eine Instanz dieser Klasse erzeugst, hat genau 0 Wirkung, weil die plot-Befehle schon bei der Klassendefinition ausgeführt werden.
Code: Alles auswählen
db = MySQLdb.connect("localhost", "USERNAME", "PASSWORD", "haus")
cursor = db.cursor()
cursor.execute("SELECT uhrzeit, wert FROM temperatur_tb")
daten = cursor.fetchall()
uhrzeiten = [u for u,t in daten]
temperaturen = [t for u,t in daten]
plt.ylabel('Temperatur')
plt.xlabel('Uhrzeit')
plt.plot(uhrzeiten, temperaturen, 'b-')
plt.grid(True)
plt.show()
Re: MySQL in matplotlib
Verfasst: Montag 22. Juni 2020, 18:37
von AimLegend
@Sirius3 Vielen Dank das hat mir sehr weitergeholfen.
Probiere den Code jetzt Mal aus und schreibe dann nochmal ob es funktioniert hat.
Re: MySQL in matplotlib
Verfasst: Montag 22. Juni 2020, 19:08
von AimLegend
Bei mir kommt die Fehlermeldung: "
TypeError: float() Argument must bei a string or a number, Not 'datetime.timedelta'". Jetzt habe ich es Mal mit dem Datum ausprobiert und da kommt nur so ein komisches Diagramm raus.
