Arch Stanton
Arch Stanton

Reputation: 394

Place tics at values stored in variables

I have used the stats command to store the x-postion of absolute maxima in my plot of seven datasets in seven variables, grN_pos_max_y with N that goes from 1 to 7. Can I place the tics in the x-axis at the positions specified by these variables?

I tried using

$maxima << EOD
gr1_pos_max_y
gr2_pos_max_y
gr3_pos_max_y
gr4_pos_max_y
gr5_pos_max_y
gr6_pos_max_y
gr7_pos_max_y
EOD

and then

plot ..., \
     $maxima u 1:(NaN):xticlabel(1) notitle

but I don't know how to read variables into a data block (if I replace the variable names by their values, however, it works).


Edit: This is what I want (I plotted it using Ethan's answer) uber cool plot

Upvotes: 0

Views: 162

Answers (2)

theozh
theozh

Reputation: 25734

There is no need for awk, you can do it all in gnuplot.

  • put stats into a loop and write the STATS values into a datablock $Maxima
  • plot your data and $Maxima as Ethan suggested with impulses
  • you can also plot the maxima y-value as labels in the graph

The script needs to be adapted depending on your file naming scheme.

Script:

### extract maxima from several files
reset session

N = 7
myFile(n) = sprintf("SO72750257_%d.dat",n)

# create some "random" test data
do for [n=1:N] {
    set table myFile(n)
        f(x) = -a*(x-x0)**2 +y0
        x0 = (n-1)*10./N + rand(0)*10./N
        a  = rand(0)*50+10
        y0 = rand(0)*80+20
        plot [0:10] '+' u 1:(f(x))
    unset table
}

# extract maxima
set print $Maxima
    do for [n=1:N] {
        stats myFile(n) u 1:2 nooutput
        print sprintf("%.1f %.1f", STATS_pos_max_y, STATS_max_y)
    }
set print

set yrange[0:]
set offsets graph 0.05, graph 0.05, graph 0.1, 0
set xtics ()    # remove all xtics 
set key out noautotitle

plot for [i=1:N] myFile(i) u 1:2 w l ti sprintf("Set %d",i), \
     $Maxima u 1:2:($0+1):xtic(1) w impulses lc var dt 2, \
     $Maxima u 1:2:2 w labels offset 0, char 1
### end of script

Result:

enter image description here

Upvotes: 1

Ethan
Ethan

Reputation: 15093

I'm not entirely sure I understand what you want, but this may get you partway there:

set xtics add (gr1_pos_max_y, gr2_pos_max_y, gr3_pos_max_y, gr4_pos_max_y, gr5_pos_max_y, gr6_pos_max_y, gr7_pos_max_y)
plot 'whatever'

That will get you plain (unlabeled) tic marks in addition to whatever tic marks and labels are being generated automatically.

If you want only these marks and no auto-generated marks, remove the keyword add.

If you want to place labels to go with these new tics, change it to:

  set xtics add ( "Max 1" gr1_pos_maxy,  "Max 2" gr2_pos_maxy, ... 

This is all assuming you want these tics to label a plot that contains something other than the tics themselves. If you want only a plot of these y values, perhaps as impulses?, please re-phrase the question or show a sketch of what you want it to look like.

Upvotes: 1

Related Questions