Search code examples
plotgnuplotoffset

How to make `set offsets` apply to certain axis?


The gnuplot doc for set offsets is extremely terse and I cannot find how offsets interact with multiple x-axes or y-axes.

I have 2 plots and they use x1y1 and x1y2, so there are 2 y-axes one on the left one on the right. Right now, when I add some top offset it applies to the plot which uses y1. How can I make it affect the plot which uses y2?


Solution

  • That's what gnuplot help offsets says:

    Offsets provide a mechanism to put an empty boundary around the data inside an autoscaled graph. The offsets only affect the x1 and y1 axes, and only in 2D plot commands.

    So it looks like, it's not (directly) possible. By the way, do you want offsets affecting...

    • only y2 axis or
    • y1 and y2 axes in the same way or
    • y1 and y2 axes differently?

    Maybe you can edit your question and add an example for illustration.

    Addition:

    Maybe the following is helpful. As you already did, you can use the GPVAL_ variables. Important to know, that these values are only set after plotting. So, you have to plot, then modify your y1 and y2 ranges as desired and then replot. You could also use the variables GPVAL_Y_MIN, GPVAL_Y_MAX, GPVAL_Y2_MIN, and GPVAL_Y2_MAX which gnuplot's autoscaling algorithm suggests as ranges.

    Code:

    ### different "offsets" for y1 and y2 axes
    reset session
    
    set xlabel "x1-axis"
    set ylabel "y1-axis"
    set ytics nomirror
    set y2label "y2-axis"
    set y2tics nomirror
    
    plot 100*(sin(x)+1) axes x1y1 w l, \
         10*cos(x) axes x1y2 w l
    
    Y1FromBottom = 0.40    # y1 data will use 40% space from bottom
    Y2FromBottom = 0.80    # y2 data will use 80% space from bottom
    
    set yrange[:(GPVAL_DATA_Y_MAX-GPVAL_DATA_Y_MIN)/Y1FromBottom+GPVAL_DATA_Y_MIN]
    set y2range[:(GPVAL_DATA_Y2_MAX-GPVAL_DATA_Y2_MIN)/Y2FromBottom+GPVAL_DATA_Y2_MIN]
    
    replot 
    ### end of code
    

    Result:

    enter image description here