Benutzer:Marsupilami/Gnuplot/Amo timeseries 1856-present

Voraussetzungen Bearbeiten

 

Die Software-Voraussetzungen zum wieder neu Erstellen von Datei:Amo timeseries 1856-present.svg sind:

Bauanleitung Bearbeiten

Die aktuellen Daten sind als Datei amon.us.long.data zu speichern. Oftmals enthält die erste Zeile keine sinnvollen Daten und ist zu entfernen, ebenso sieht es am Ende der Datei aus. Die Datei sollte nur Zeilen enthalten, die folgenden Aufbau mit 13 Spalten und einem führenden Leerzeichen haben:

 1856    0.243    0.176    0.248    0.167    0.219    0.241    0.255    0.232    0.299    0.149    0.159    0.253

Das folgende bash-Script zum Aufbereiten der Daten ist als format.sh zu speichern und mit chmod u+x format.sh ausführbar zu machen.

#!/bin/bash
# Author: Marsupilami

input="amon.us.long.data"

# temp files
output="${input}.tmp1"
positive="${input}.tmp2"
negative="${input}.tmp3"
average="${input}.tmp4"


# format
grep "^ [0-9]" "$input" |\
        while read X; do
                X=($X)
                for I in {1..12}; do
                        let J=I*8
                        printf -v J %02d $J     # leading zero
                        echo ${X[0]}.${J} ${X[$I]}
                done
        done > "$output"


# positive values
grep -v " -" "$output" > "$positive"


# negative values
grep " -" "$output" > "$negative"


# fill array for moving average
COUNTER=0
while read X; do
        X=($X)
        VALUE[$COUNTER]=${X[1]}
        let COUNTER++
done < "$output"


# moving average
RANGE=12
START_IGNORE=5
let END=COUNTER-START_IGNORE-1
COUNTER=0

while read X; do
        X=($X)
        if [ $COUNTER -ge $START_IGNORE ] && [ $COUNTER -lt $END ]; then
                A=0
                for ((I=$COUNTER-$START_IGNORE; I<$COUNTER+$RANGE-$START_IGNORE; I++))
                do
                        A=$(echo "$A + ${VALUE[$I]} / $RANGE" | bc -l)
                done
                echo ${X[0]} $A
        fi
        let COUNTER++
done < "$output" > "$average"

Im folgenden Gnuplot-Script die Endjahreszahl 2022 an zwei Stellen durch die gewünschte Zahl ersetzen und als generate.gnu speichern.

set title 'Monthly values for the AMO index, 1856 - 2022'
set xlabel 'Year'
set ylabel 'AMO Departure'

set yrange [-0.7:0.7]
set xrange [1850:2022]

set grid linetype rgb "#e9e7e2"

set terminal svg size 672,372
set output 'graph.svg'

plot    'amon.us.long.data.tmp2' notitle with impulses lt rgb "#fe6000", \
        'amon.us.long.data.tmp3' notitle with impulses lt rgb "#3c9fef", \
        'amon.us.long.data.tmp4' notitle with lines lw 2.5 lt rgb "#000000"

Das bash-Script wird über ./format.sh aufgerufen und läuft ca. eine Minute. Dabei generiert es im aktuellen Verzeichnis vier temporäre Dateien, wovon drei von Gnuplot weiterverwendet werden.

Zum Generieren der SVG-Datei gnuplot generate.gnu aufrufen. Die generierte SVG-Datei heißt graph.svg und liegt auch im lokalen Verzeichnis.

Aufräumen Bearbeiten

Zum Aufräumen im aktuellen Verzeichnis nach dem Upload der Datei graph.svg:

rm format.sh generate.gnu amon.us.long.data amon.us.long.data.tmp{1..4} graph.svg