Place key below multiplot graph in gnuplot

前端 未结 2 1453
有刺的猬
有刺的猬 2021-01-01 07:22

As the title suggests I want to place the plot legend below a multiplot graph. I add the legend for just one of the plots because the line styles are the same for all. The p

相关标签:
2条回答
  • 2021-01-01 07:52

    Here is a way to do it with some functions to help adjust the positions of the margins in the plot:

    #!/usr/bin/env gnuplot
    
    ### n: change this parameter to equal the number of data sets to be plotted
    n = 3
    # t: top margin in pixels
    t = 75.0
    # b: key height in pixels (bottom margin)
    b = 300.0
    # h: height of output in pixels
    h = 150.0*n + t + b
    
    ### define functions to help set top/bottom margins
    top(i,n,h,t,b) = 1.0 - (t+(h-t-b)*(i-1)/n)/h
    bot(i,n,h,t,b) = 1.0 - (t+(h-t-b)*i/n)/h
    
    ### first set up some basic plot parameters
    set term pngcairo enhanced size 800,h font 'FreeMono-Bold,14'
    set output 'bigkey.png'
    
    set title 'Big Key Plot'
    set ylabel 'Y Axis'
    
    set multiplot layout (n+1),1
    ### First plot
    # change only plot command here
    currentplot = 1
    set tmargin at screen top(currentplot,n,h,t,b)
    set bmargin at screen bot(currentplot,n,h,t,b)
    unset key
    unset xtics
    plot sin(1*x) title 'Line 1', \
         sin(2*x) title 'Line 2', \
         sin(3*x) title 'Line 3', \
         sin(4*x) title 'Line 4', \
         sin(5*x) title 'Line 5', \
         sin(6*x) title 'Line 6', \
         sin(7*x) title 'Line 7'
    ### Middle plot
    # copy and paste this code to make more middle plots
    currentplot = currentplot + 1
    set tmargin at screen top(currentplot,n,h,t,b)
    set bmargin at screen bot(currentplot,n,h,t,b)
    unset title
    replot
    ### Last plot
    # change only plot command here
    currentplot = currentplot + 1
    set tmargin at screen top(currentplot,n,h,t,b)
    set bmargin at screen bot(currentplot,n,h,t,b)
    set xlabel 'X Axis'
    set xtics
    replot
    ### Last (key) plot
    set tmargin at screen bot(n,n,h,t,b)
    set bmargin at screen 0
    set key center center
    set border 0
    unset tics
    unset xlabel
    unset ylabel
    set yrange [0:1]
    plot 2 t 'Line 1', \
         2 t 'Line 2', \
         2 t 'Line 3', \
         2 t 'Line 4', \
         2 t 'Line 5', \
         2 t 'Line 6', \
         2 t 'Line 7'
    
    unset multiplot
    

    Here is the result: enter image description here

    The things you have to adjust manually are the number of plots and the size of the bottom margin, which is where the key gets drawn. The comments generally say where you have to change things.

    I put the key in a plot by itself so that it would be easy to keep the sizes of the other plots the exact same. Plotting the number 2 when the y range is 0 to 1 keeps the lines from showing in the key plot.

    This is mostly based on my answer here, which is why I have the plots all touching. You can adjust the top() and bot() functions with an additional margin parameter if you want a gap between the plots.

    0 讨论(0)
  • 2021-01-01 07:57

    Without more details, it's hard to know if this is helpful or not, but gnuplot allows you to specify the position of the key in absolute terms:

    set key at screen 0.5,screen 0.1 #for example
    

    Which might allow you to move it around to wherever you want it to be ...

    0 讨论(0)
提交回复
热议问题