2017-03-08 3 views
1

Ich habe einige Daten, die ich sie mit gnuplot plotten möchte. Aber ich für die gleichen x-Wert viele y Werte haben, werde ich Ihnen zeigen, gut zu verstehen:Plot Durchschnitt der n-ten Zeilen in gnuplot

0 0.650765 0.122225 0.013325 
0 0.522575 0.001447 0.010718 
0 0.576791 0.004277 0.104052 
0 0.512327 0.002268 0.005430 
0 0.530401 0.000000 0.036541 
0 0.518333 0.001128 0.017270 
20 0.512864 0.001111 0.005433 
20 0.510357 0.005312 0.000000 
20 0.526809 0.001089 0.033523 
20 0.527076 0.000000 0.034215 
20 0.507166 0.001131 0.000000 
20 0.513868 0.001306 0.004344 
40 0.531742 0.003295 0.0365 

In diesem Beispiel habe ich 6 Werte für jedes x value.So wie kann ich den Durchschnitt ziehen und das Vertrauen Balken (Intervall) ??

Dank für Hilfe

+0

Haben Sie die erste Spalte bedeuten x, Spalten 2/3/4 sind Y1/Y2/Y3 jeweils? Sie möchten die 6 y1-Werte, die zu x = 0 gehören, mitteln? Oder willst du y1/y2/y3 mitteln? Und was ist mit dem Konfidenzintervall, sind die Werte bereits in der Datendatei oder müssen sie berechnet werden? Wenn das berechnet werden muss, wie? – maij

+0

@maij ja, ich muss 3 Graphen zeichnen (kein Problem dafür). Für die sechs Werte (y1, d. H.) Berechne ich den Durchschnitt und ich werde ihn darstellen. Für den Vertrauensbalken fixiere ich den oberen Wert und den niedrigeren Wert für jeden Satz. – wolfgunner

Antwort

2

Um dies zu tun, benötigen Sie eine Art von externer Verarbeitung. Eine Möglichkeit wäre, gawk zu verwenden, um die erforderlichen Mengen zu berechnen und diese Hilfsausgabe an Gnuplot zu übergeben, um sie zu plotten. Zum Beispiel:

set terminal png enhanced 
set output 'test.png' 

fName = 'data.dat' 
plotCmd(col_num)=sprintf('< gawk -f analyze.awk -v col_num=%d %s', col_num, fName) 

set format y '%0.2f' 
set xr [-5:25] 

plot \ 
    plotCmd(2) u 1:2:3:4 w yerrorbars pt 3 lc rgb 'dark-red' t 'column 2' 

Dies setzt voraus, dass das Skript analyze.awk im selben Verzeichnis befindet, aus dem Gnuplot gestartet wird (sonst wäre es notwendig, den Pfad in der -f Option von gawk zu ändern Das Skript analyze.awk selbst liest.:

function analyze(x, data){ 
    n = 0;mean = 0; 
    val_min = 0;val_max = 0; 

    for(val in data){ 
     n += 1; 
     delta = val - mean; 
     mean += delta/n; 
     val_min = (n == 1)?val:((val < val_min)?val:val_min); 
     val_max = (n == 1)?val:((val > val_max)?val:val_max); 
    } 
    if(n > 0){ 
     print x, mean, val_min, val_max; 
    } 
} 

{ 
    curr = $1; 
    yval = $(col_num); 

    if(NR==1 || prev != curr){ 
     analyze(prev, data); 
     delete data; 
     prev = curr; 
    } 
    data[yval] = 1; 
} 

END{ 
    analyze(curr, data); 
} 

Es implementiert direkt die online algorithm den Mittelwert zu berechnen und für jeden einzelnen Wert von x druckt diese sowie die Min-/max-Werte bedeuten.

Im Gnuplot-Skript wird die interessierende Spalte an die Funktion plotCmd übergeben, die den auszuführenden Befehl vorbereitet und dessen Ausgabe mit u 1:2:3:4 w yerrorbars geplottet wird. Diese Syntax bedeutet, dass das Konfidenzintervall in der 3./4. Spalte gespeichert wird, während der Wert selbst (der Mittelwert) in der zweiten Spalte liegt.

Insgesamt ergeben die beiden obigen Skripte das Bild unten. Das Konfidenzintervall auf dem letzten Punkt ist nicht sichtbar, da die Beispieldaten in Ihrer Frage nur einen Datensatz für x = 40 enthalten, daher stimmen die Min/Max-Werte mit dem Mittelwert überein.

enter image description here

0

ermitteln Sie den Durchschnitt in diesem Fall zeichnen können:

plot "myfile.dat" using ($1):($2 + $3 + $4)/3 

Wenn Sie Durchschnitt wollen nur zweite und vierte Spalte zum Beispiel, können Sie ($2+$4)/2 und so weiter schreiben.

+0

Was ich will ist, dass ich den Durchschnitt für jede 6 Zeilen (Werte) darstelle, weil ich 3 Graphen zeichnen würde (y1 y2 y3). Danach extrahiere ich den Min-, Max-Wert für jeden Satz. – wolfgunner

Verwandte Themen