MySQL in matplotlib

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
AimLegend
User
Beiträge: 5
Registriert: Sonntag 21. Juni 2020, 10:28

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. :)
Benutzeravatar
__blackjack__
User
Beiträge: 13926
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
AimLegend
User
Beiträge: 5
Registriert: Sonntag 21. Juni 2020, 10:28

Danke für die Antwort.
Bei mir wurden, keine Ahnung wieso, Datum und Uhrzeit als einzelne Spalten gespeichert.
AimLegend
User
Beiträge: 5
Registriert: Sonntag 21. Juni 2020, 10:28

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()
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
AimLegend
User
Beiträge: 5
Registriert: Sonntag 21. Juni 2020, 10:28

@Sirius3 Vielen Dank das hat mir sehr weitergeholfen. :)
Probiere den Code jetzt Mal aus und schreibe dann nochmal ob es funktioniert hat.
AimLegend
User
Beiträge: 5
Registriert: Sonntag 21. Juni 2020, 10:28

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. :cry:
Antworten