Gnuplot找到3D数据的局部最大值

时间:2016-11-18 21:57:30

标签: sed find max gnuplot

我在gnuplot中有问题...

我正在从我的数据点进行绘制,这些点是离散的"线" (见附图)其中y值为1,1 / 2,1 / 3等... 在每个离散的"线"我想获得最大Z值及其X和Y坐标,并突出显示它们,或者可能在它们上面拟合函数等...

这是我的代码:

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

这是数据文件:http://pastebin.com/umqGWtyy

正如您在图片中看到的那样,"线"数据点对应于数据文件中的每一行,因此例如以第一行开始然后每30行的数据点对应于"行" y值为1,然后从第二行每30对应一行""哪个y值是1/2等...

因此我想从这些数据中获得最大Z值......

我也试过sed,但我失败了......

所以我的问题是,它可以找到全局最大值而不是其他本地的...... :(请帮帮我:)

以下是图片:enter image description here

我不知道...希望这是可以理解的,对不起我的英语......:)

1 个答案:

答案 0 :(得分:1)

GPVAL_DATA_Z_MAX似乎不能解决您的问题,但您可以使用 stats 来查找所有局部最大值,然后将它们全部绘制在循环图中。

#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)

注意:每个使用的索引从零开始。

这仅适用于绘图,您拥有所有最大值,但您还没有X和Y坐标。

你也有最大值的索引,所以如果你可以从A<n>_index_max行(实际上是它的30 *索引+ i或第n个块&#39;第i行)检索XY值,你就得到了第n个最大位置。要检索第n行,您可以使用每次再次使用统计信息

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
}

如果您在获取Ai_统计信息后立即执行此操作,则您已拥有所有职位P<i>_max_x P<i>_max_y和Z值A<i>_max

如果您愿意,可以将它们打印到文件中:

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