Gnuplot how to lower the number of tics in x axis

2020-02-14 01:56发布

问题:

The figure has too many xtics and ytics. Can I have half of them?

I know I can manually set tics in a way similar to this:

set xtics (1,2,4,8,16,32,64,128,256,512,1024)

But I feel it is not a general solution. You can not manually set tics for all figures. I have loads of them and the gnuplot code is automatically generated using Java.

Here is the code for the figure: https://dl.dropboxusercontent.com/u/45318932/gnuplot2.plt

Can you help lower down the number of x and y tics?

回答1:

There is no option in gnuplot to explicitly set the number of tics you want on an axis and have gnuplot decide where to put them. (I really wish there were.)

One option you have is to use the stats command (in gnuplot 4.6+) to find out the range of the data:

ntics = 4

stats 'data.dat' using 1 name 'x' nooutput
stats 'data.dat' using 2 name 'y' nooutput
stats 'data.dat' using 3 name 'z' nooutput

set xtics x_max/ntics
set ytics y_max/ntics
set ztics z_max/ntics

You might have to adjust whether you want the tics to be at integer values or not, but that is the general idea.



回答2:

There are different ways to set the number of tics depending on what exactly you want to do. For a fixed segment of length 2, starting at zero and ending at 32:

set xrange [0:32]
set xtics 0,2,32
plot sin(x)

If you want an exponential increment, try the following

set xrange [0:32]
set for [i=0:5] xtics (0,2**i)
plot sin(x)

Or you can use a logarithmic scale (in base 2 in this case):

set xrange [1:32]
set logscale x 2
plot sin(x)



回答3:

I had a similar problem that I wanted to handle a little more generically in case the data changes while still using somewhat round looking numbers. Therefore I made a helper function:

endsinone(n) = strstrt(gprintf("%g", incrguess), "1")
getincr(range, maxincr, guess) = range/guess < maxincr ? guess : \
    (endsinone(guess) ? getincr(range, maxincr, 5*guess) : getincr(range, maxincr, 2*guess))

Then I just have to pass in the range for the axis, the most increments I want on it, and a very lower bound guess about what I would expect the smallest possible increment to be. To keep the rounded looking numbers my functions assume the guess is expressible in the form 1eN or 5eN for some value N. Ie (50 is good, so is 0.0000001, 505 is not). With this function you just have to do something like

set xtics getincr(STATS_max, 6, 1e-9)

will return an incr of less than 6 tics, and there should be several of them assuming STATS_MAX > 1e-9.



标签: gnuplot axis