Forum: PC-Programmierung gnuplot: Daten für eine heat map


von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

ich habe über einen längeren Zeitraum verschiedenen Klimadaten 
(Temperaturen, Lichtverhältnisse, Luftfeuchtigkeit etc.) aufgezeichnet 
und möchte diese in einer heat map ("Wärmebild") mit gnuplot 
visualisieren (gnuplot-Beispiele: 
http://gnuplot.sourceforge.net/demo_4.3/heatmaps.html).

Wunschvorstellung der Dartellung:
X-Achse --> Kalendertag
Y-Achse --> Tages-Stunde/Minute
Z-Achse (bzw. mehr der Farbwert) --> der jeweilige Messwert zum 
Timestamp

Problem:
Soweit ich die gnuplot-Doku verstanden habe, muss bei den Input-Daten 
die Dimension der Matrix in x- und y-Richtung (Bsp.1 obiger Link ) bzw. 
die Anzahl der Werte-Kombinationen (Bsp.2) genau mit der Dimension des 
Diagramms in x-/y-Richtung übereinstimmen, es dürfen keine Werte fehlen. 
Wenn nicht kommt ein Fehler (schon probiert).

Und genau da habe ich ein Problem. Die Werte landen zwar ziemlich 
konstant im Minutentakt in einer Datenbank (Timestamp, Messwert). Es 
kommt aber vor, dass mal eine Minute fehlt, weil gerade ein 
Minutenumschlag im jeweiligen Messzyklus erfolgt oder über einen 
längeren Zeitraum Werte fehlen, weil es ein Problem bei der Aufzeichnung 
gab.

Diese Lücken müßte man bei der Datenaufbereitung für das Wärmediagramm 
schliessen. Kennt jemand einen Weg mit gnuplot selbst oder muss ich 
wirklich ein entsprechendes Aufbereitungsscript schreiben?

Grüße & Danke Uwe

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Hallo Uwe,

GNU-Plot kann das, soweit ich weiß, nicht selber lösen.
Eigentlich solltest du an deiner Datenerfassung arbeiten um das Problem 
zu beheben bzw. die Daten vor dem Eintrag in die DB entsprechend 
aufarbeiten.

Wenn das aber jetzt schon mal so ist, würde ich das mit einem kleinen 
Script erschlagen. Ein gleitendes Filter über die Werte oder die 
Zeitstempel auswerten und entsprechend ausrichten.

Mit Perl oder PHP eigentlich kein Thema...

von branadic (Gast)


Lesenswert?

Muss es GNUPLOT sein? Darf es nicht auch (GNU)-Octave sein? Dann 
könntest du die Daten analysieren lassen und Einträge zu denen die 
z-Info fehlt entfernen, bevor du sie plottest.

branadic

von Andreas M. (amesser)


Lesenswert?

Uwe Berger schrieb:
> MoinMoin,
>
> Und genau da habe ich ein Problem. Die Werte landen zwar ziemlich
> konstant im Minutentakt in einer Datenbank (Timestamp, Messwert). Es
> kommt aber vor, dass mal eine Minute fehlt, weil gerade ein
> Minutenumschlag im jeweiligen Messzyklus erfolgt oder über einen
> längeren Zeitraum Werte fehlen, weil es ein Problem bei der Aufzeichnung
> gab.

Ich würde dafür nicht gnuplot benutzen. In der Meteorologie gibts z.B.

http://gmt.soest.hawaii.edu/

Dort kann man bei fehlenden Messwerten z.B. eine extra Farbe benutzen 
oder einfach interpolieren. Allerdings ist das Tool etwas 
gewöhnungsbedürftig...

Gruß
Andreas

von Uwe B. (boerge) Benutzerseite


Angehängte Dateien:

Lesenswert?

MoinMoin,

ich wollte mich zu dem Thema nochmal melden und meine Lösung vorstellen, 
falls jemand ähnliches sucht bzw. keine Ahnung hat, was eine "heat map" 
ist:

* ich habe ein Tcl-Script geschrieben, welches das auszuwertende 
Intervall bestimmt, eine einstellbare "Tagesrasterung" vornimmt, über 
die jeweils eine Mittelwertbildung der Werte aus der DB erfolgt, die 
Werte für gnuplot aufbereitet und in einer Textdatei ablegt

* wenn zu einem Abschnitt kein Wert gefunden wurde, wird er mit einem 
speziellen Wert gekennzeichnet, der später im Diagramm eine spezielle 
Farbe bekommt.

Datenbeispiel:
1.Spalte: Datum,
2.Spalte: Tagesstunde (als Kommazahl wg. späterer Achsenbeschriftung),
3.Spalte: entspr. Mittelwert; 1000.00 Kennung für "nicht vorhanden"
1
...
2
2011-02-22 18.75 1000.00
3
2011-02-22 18.83 1000.00
4
2011-02-22 18.92 22.02
5
2011-02-22 19.00 35.46
6
2011-02-22 19.08 16.82
7
2011-02-22 19.17 -5.89
8
2011-02-22 19.25 -6.25
9
2011-02-22 19.33 -6.31
10
2011-02-22 19.42 -6.30
11
2011-02-22 19.50 -6.45
12
2011-02-22 19.58 -6.52
13
2011-02-22 19.67 -6.66
14
2011-02-22 19.75 -6.71
15
2011-02-22 19.83 -6.86
16
2011-02-22 19.92 -6.84
17
2011-02-22 20.00 -6.83
18
...

* diese Daten werden dann, zusammen mit ein paar Anweisungen in gnuplot 
geschmissen. Das gnuplot-Script für angehangenes Diagramm sieht ungefähr 
so aus (wird bei mir natürlich dynamisch generiert...):
1
unset key
2
set terminal png font arial 8 size 1200, 400
3
set view map
4
set output 'heatmap.png'
5
set title "Temperaturverlauf über Datum/Tageszeit" 
6
7
set xdata time
8
set timefmt "%Y-%m-%d"
9
set format x "%d.%m.\n%Y"
10
set xrange ["2011-03-01":"2012-09-27"]
11
set xlabel "Datum"
12
13
set yrange [0:24]
14
set ytics 1
15
set ylabel "Tagesstunde"
16
17
set colorbox size 10, 300
18
set cblabel "Temperatur" 
19
set cbrange [-25.0:50.0]
20
21
set palette defined (0 "blue",17 "#00ffff",33 "white",55 "yellow",\
22
    70 "red",100 "#990000", 101 "grey")
23
24
plot 'data.txt' using 1:2:3 with image

* nicht vorhandene Werte werden in grau dargestellt (bei "set palette 
..." das Wertepaar 101 "gey"... (RTFM ;-)))

* oben angehangenes Diagramm wurde aus 173952 Wertetripel generiert, die 
Rasterung beträgt 5 Minuten

Fazit: gnuplot ist auch für eine solche Darstellung ganz gut 
brauchbar...

Grüße Uwe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.