2016-11-18 6 views
0

ich ein Problem in gnuplot habe ...Gnuplot lokales Maximum von 3D-Daten zu finden

ich eine splot von meinen Datenpunkten mache, die diskret sind „Linien“ (eingebundene Bild sehen) unter y-Werten von 1,1/2,1/3 etc ... Bei jeder diskreten "Linie" möchte ich den maximalen Z-Wert und seine X- und Y-Koordinaten erhalten und sie hervorheben, oder vielleicht eine Funktion auf sie setzen etc ...

hier ist mein Code:

set title "1/m vs mutation rate" 
#set term pdfcairo size 6,4 
set term x11 

set xlabel "Mutation rate" 
set ylabel "1/m" 

set xrange[0.0001:0.05] 
set yrange[1.0/30:1] 
unset log x 

set cbrange[0:0.35] 
set zrange[0:1] 
set palette defined (0 "green", 1 "blue", 2 "red") 

#set view 78,348,1,1 
set view map 

set output "muemmeres500map.pdf" 

splot 'muemmeres500.txt' u 1:2:3 with points pt 5 ps 1 palette, "muemmeres500.txt" every 30 using ($3==GPVAL_DATA_Z_MAX?$1:NaN):($3==GPVAL_DATA_Z_MAX?$2:NaN):3 title "max1" lc rgb'black' lw 4, "muemmeres500.txt" every 30::2 using ($3==GPVAL_DATA_Z_MAX?$1:NaN):($3==GPVAL_DATA_Z_MAX?$2:NaN):3 title "max2" lc rgb'black' lw 4, "muemmeres500.txt" every 30::3 using ($3==GPVAL_DATA_Z_MAX?$1:NaN):($3==GPVAL_DATA_Z_MAX?$2:NaN):3 title "max3" lc rgb'black' lw 4, "muemmeres500.txt" every 30::4 using ($3==GPVAL_DATA_Z_MAX?$1:NaN):($3==GPVAL_DATA_Z_MAX?$2:NaN):3 title "max4" lc rgb'black' lw 4, "muemmeres500.txt" every 30::5 using ($3==GPVAL_DATA_Z_MAX?$1:NaN):($3==GPVAL_DATA_Z_MAX?$2:NaN):3 title "max5" lc rgb'black' lw 4 

unset output 

Und hier ist die Datendatei: http://pastebin.com/umqGWtyy

Wie Sie auf dem Bild sehen können, entsprechen die Datenpunkte "Linien" jeder Linie in der Datendatei, also zum Beispiel die Datenpunkte, die mit dem ersten beginnen, dann alle 30 entsprechen der "Linie" mit dem y-Wert 1 und dann von der zweiten Leitung entspricht jeder 30 an die „Linie“, der y-Wert ist 1/2 etc ...

Deshalb wollte ich den maximalen Z-Wert erhalten, von nur denjenigen Daten ...

I versuchte auch sed, aber ich scheiterte ...

Also mein Problem ist, dass es nur die globalen Maxima finden kann und nicht die anderen lokalen ... :(pls helfen Sie mir:)

Hier ist das Bild: enter image description here

Ich habe keine Ahnung ... hoffen, dass es für mein Englisch ... :)

Antwort

1

GPVAL_DATA_Z_MAX für Ihr Problem funktioniert nicht verständlich und leider ist scheinen aber Sie können stattdessen stats verwenden, um alle lokalen Maxima zu finden und sie dann alle in einem Loop-Diagramm zu plotten.

#Do it before setting the ranges (the column will be handled as an x column and it might get out of xrange) 
do for [i=0:28]{ 
    #Give an indexed prefix to each stat (so they *all* become accessible from outside the loop, like "A12_max" or "A25_min") 
    stats 'muemmeres500.txt' every 30::i u 3 nooutput prefix "A".i 
} 

#set all the things you need for the plot (including ranges) 
... 

splot 'muemmeres500.txt' u 1:2:3 with points pt 5 ps 1 palette, \ 
     for [i=0:28] '' every 30::i u 1:2:($3==value("A".i."_max") ? $3 : NaN) notitle #t "Max".(i+1) 

Hinweis: Die verwendeten Indizes von jedem Start von Null.

Das funktioniert nur zum Plotten, Sie haben alle Maxima, aber Sie haben noch nicht die X- und Y-Koordinaten.

Sie haben auch die Indizes der Maxima, also wenn Sie die X Y -Werte aus der A<n>_index_max Zeile (tatsächlich sein 30 * Index + i oder die i-te Zeile des n-ten Blocks) abrufen können, haben Sie die n-te maximale Position. Zum Abrufen der n-ten Zeile können Sie stats erneut mit alle verwenden.

do for [i=0:28]{ 
    stats 'muemmeres500.txt' every ::i:value("A".i."_index_max"):i:value("A".i."_index_max") u 1:2 nooutput prefix "P".i 
} 

Wenn Sie dieses Recht tun, nachdem die AI_ Statistiken bekommen haben Sie bereits alle Positionen P<i>_max_xP<i>_max_y und Z-Werte A<i>_max.

Wenn Sie möchten, können Sie sie in eine Datei drucken können:

set print "maxima.dat" 
do for [i=0:28]{ 
    print value("P".i."_max_x"), (value("P".i."_max_y")), (value("A".i."_max")) 
} 
unset print 
+0

danke, funktioniert super! http://imgur.com/a/Fo2Fd –