matplotlib Achsenskalierung

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
carsten171263
User
Beiträge: 4
Registriert: Montag 16. Dezember 2013, 17:01

Hallo,

ich baue z.Z. an einer kleinen Wetterstation mit einer Raspberry Pi. Die ganze Datenerfassung und Verarbeitung läuft mit Python. Ich bin in Sachen Python aber ein Neuling. Nun zu meinem Problem: Aus einer Datei werden die Werte der letzten 48 Stunden ausgelesen. Pro Stunde ein Datensatz. In der Grafik erscheint dann auch die Beschriftung mit Stunden mit 10er Schritten. Ich würde jetzt aber gerne auf der x-Achse die Werte von 0,6,12,18,24 Uhr usw. beschriften. In der Datei ist auch jedem Wert Datum und Zeit zugeordnet. Problem ist auch das sich die Daten jede Stunde um eine Stunde nach links verschieben. Das Programm sieht so aus:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Carsten Retzlaff caretzlaff@gmail.com

import shutil
import time
import matplotlib

# Zeit und Datum
Datum = time.strftime("%d.%m.%Y")
Zeit = time.strftime("%H:%M")

#Log Datei
wdlog=open("/home/pi/wetter/wdlog.txt", "a")

z=0
#letzten Werte
leda = open("/home/pi/wetter/wetterdaten.csv", "r") 
for inp in leda:
	z=z+1
leda.close()

wdlog.write(Datum + ":" + Zeit+ "\n")
wdlog.write ("Auswertung"+ "\n")

lt=0
att=[]
ald=[]
att24=[]
ald24=[]
ht24=[]
ht=[]
ng=[]
ng24=[]
leda = open("/home/pi/wetter/wetterdaten.csv", "r") 
for inp in leda:
	werte = inp.split(";")
	tt=werte[3]
	ld=werte[4]
	if lt >= z-30*24:
		ald.append(ld)
		att.append(tt)
		ht.append(1013)
		ng.append(0)
		#print tt,ld
	if lt >= z-2*24:
		ald24.append(ld)
		att24.append(tt)
		ht24.append(1013)
		ng24.append(0)	
	lt=lt+1
leda.close()

wdlog.write ("Grafik erstellen!"+ "\n")

from matplotlib import pyplot

pyplot.plot(att)
pyplot.plot(ng)
pyplot.title('Temperatur '+Datum+":"+Zeit)
pyplot.xlabel('Stunden h')
pyplot.ylabel('Temperatur Grad Celsius')
pyplot.savefig('/home/pi/wetter/wdtempplot.png')
#pyplot.show()

pyplot.clf()

pyplot.plot(ald)
pyplot.plot(ht)
pyplot.title('Luftdruck '+Datum+":"+Zeit)
pyplot.xlabel('Stunden h')
pyplot.ylabel('Luftdruck hPa')
#pyplot.ylim(970,1030)
pyplot.savefig('/home/pi/wetter/wdluftplot.png')
#pyplot.show()

pyplot.clf()

pyplot.plot(att24)
pyplot.plot(ng24)
pyplot.title('Temperatur '+Datum+":"+Zeit)
pyplot.xlabel('Stunden')
pyplot.ylabel('Temperatur Grad Celsius')
pyplot.xlim(0,48)
pyplot.savefig('/home/pi/wetter/wlt24.png')
#pyplot.show()

pyplot.clf()

pyplot.plot(ald24)
pyplot.plot(ht24)
pyplot.title('Luftdruck '+Datum+":"+Zeit)
pyplot.xlabel('Stunden')
pyplot.ylabel('Luftdruck hPa')
pyplot.ylim(990,1020)
pyplot.xlim(0,48)
pyplot.savefig('/home/pi/wetter/wll24.png')
#pyplot.show()

wdlog.write ("Grafik fertig!"+ "\n")
wdlog.write ("Dateien kopieren"+ "\n")

shutil.copy2('/home/pi/wetter/wdtempplot.png','/var/www/bilder/wdtempplot.png')
shutil.copy2('/home/pi/wetter/wdluftplot.png','/var/www/bilder/wdluftplot.png')
shutil.copy2('/home/pi/wetter/wlt24.png','/var/www/bilder/wlt24.png')
shutil.copy2('/home/pi/wetter/wll24.png','/var/www/bilder/wll24.png')

wdlog.write ("Ende!"+ "\n")
Datum = time.strftime("%d.%m.%Y")
Zeit = time.strftime("%H:%M:%S")
wdlog.write(Datum + ":" + Zeit+ "\n")
wdlog.close()
Die Ausgabe sieht man hier: http://www.carsten171263.de

Wer kann mir einen Denkanstoß geben?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Du suchst die pyplot.xticks-Funktion.

Du solltest deinen Code zunächst mal in Funktionen aufteilen, da wiederholt sich jede Menge. Auch ist das Auslesen der Daten bei dir mehr als umständlich gelöst, mit dem csv-Modul geht das deutlich einfacher. Auch solltest du dir angewöhnen Dateien mit dem with-Statement zu öffnen und Code auf Modulebene vermeiden. Als Hinweis zum Suchen:

Code: Alles auswählen

def main():
    ...

if __name__ == "__main__":
    main()
Dein Code kommt dann in die main-Funktion. Damit ist sichergestellt, dass du dein Modul auch importieren kannst, ohne dass das unschöne Seiteneffekte hat.
Das Leben ist wie ein Tennisball.
carsten171263
User
Beiträge: 4
Registriert: Montag 16. Dezember 2013, 17:01

ja mit xticks habe ich mich schon beschäftigt. Google liefert aber leider meist nur englische Seiten und da komme ich mit mein paar Brocken englisch nicht weiter. Ich habe das bisher so verstanden:

xticks(arange(Startwert, Endwert, Step))
Also bei mir z.B. xticks(arang(0,48,2)) müßte doch auf der x-Achse "0 2 4 6 8 ... bis 48" ergeben oder?

wenn ich das so einbaue bekomme ich die Fehlermeldung, das arange nicht definiert ist!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Weil es auch nicht "arang" sonder "arange" heißt und aus dem numpy-Modul kommt. ;-) Also numpy importieren und ``numpy.arange`` verwenden. Oder einfach selbst die Liste der Stunden mittels ``range(0, 49, 2)`` erzeugen. Generell wirst du um Englisch aber nicht herumkommen, sonst bist du auf verlorenem Posten.
Das Leben ist wie ein Tennisball.
carsten171263
User
Beiträge: 4
Registriert: Montag 16. Dezember 2013, 17:01

... also ich habe es jetzt rausbekommen wie das mit den xticks funktioniert. Habe den Code jetzt so geändert:

Code: Alles auswählen

pyplot.plot(att24)
pyplot.plot(ng24)
pyplot.title('Temperatur '+Datum+":"+Zeit)
pyplot.xlabel('Stunden')
pyplot.ylabel('Temperatur Grad Celsius')
pyplot.xlim(0,48)
pyplot.xticks([0,6,12,18,24,30,36,42,48],[0,6,12,18,24,30,36,42,48])
pyplot.savefig('/home/pi/wetter/wlt24.png')
#pyplot.show()
Die ganze Sache ist jetzt noch statisch. Aber ich habe jetzt verstanden wie es geht. Jetzt muß ich noch aus den Daten die 0 Uhr, 6Uhr usw auslesen und an xtick übergeben, damit es dann auch an der richtigen stelle erscheint.

Mit dem Englisch hast Du recht, hatte in der Schule aber leider kein englisch und jetzt mit 50 noch mal damit anfangen ......? Ein bisschen Computerenglisch verstehe ich ja. Muß ich mich halt durchbeißen. Auf meinem ZX81 habe ich es damals auch geschafft und damals gabs glaube ich noch nicht mal Internet!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Deine Lösung kannst du mit dem von mir oben erläuterten range noch kompakter gestalten, du musst lediglich die Schrittweite anpassen. Mit Englisch musst du sicher nicht noch einmal anfangen, die meisten Seiten der Dokumentation sind recht einfach zu verstehen. Du musst dich nur daran gewöhnen, andernfalls bleibt dir viel Wissen verborgen und du werkelst an Problemen, für die es schon längst eine einfache Lösung gibt.
Das Leben ist wie ein Tennisball.
Antworten