Search code examples
plotgnuplot

gnuplot overlapping key (legend) in multiplot


I tried to draw a multi-plot like

Example

This one. You can see what is the problem here. I'm following the script in the link: Why do I have a problem with the two axes on the right when I use the multi-axis function?

Here's my script now:

reset
set encoding iso_8859_1
set term postscript eps enhanced color "Times-Roman, 20"
set output 'Sglass555_strain_number_of_Aloxides_SR1e12_5a.eps'
set key at screen 0.9, screen 0.95 samplen 1.2 width -10 vertical maxrows 3 maxcols 3
set key font "Times-Roman, 19"

data1 = "stress_strain_Sglass_xdir_SR1e12_S100p.txt"
data2 = "AlOx_BO0p4_MFFNVT_RFFNPT2"
data3 = "stress_strain_Sglass_xdir_SR1e12_S100p.txt"
data4 = "dissociated-and-formed-bonds-per-atom-pair2.txt"
data5 = "AlOx_BO0p3_MFFNVT_RFFNPT2"
data6 = "number_of_oxide_bond_BO0p3_strain.txt"
data7 = "number_of_oxide_bond_BO0p4_strain.txt"

set tics out
set autoscale  y
set autoscale y2

set lmargin 10
set tmargin 6
set bmargin 4
set rmargin 14

set multiplot
    # First and second
    set xlabel "Strain (nm/nm)"
    set xrange [0:0.4]

    set ylabel "Relative number of bonds and events"
    set yrange [-200:250]
    set ytics nomirror

    set y2label "Ratio of oxides (%)" offset -4
    set y2range [0:100]
    set y2tics nomirror
    set grid lw 4 xtics, ytics

    plot data4 u 1:4 w l lt 1 lw 2 lc rgb "red" title "Al-O bond dissociation event" axes x1y1, \
         data4 u 1:7 w l lt 1 lw 2 lc rgb "orange" title "Al-O bond formation event" axes x1y1, \
         data7 u 1:($3-3680) w l lt 1 lw 2 lc rgb "black" title "Al-O relative bond number" axes x1y1, \
         data2 u 1:(($5/($3+$4+$5+$6+$7+$8+$9))*100) w lp lt 1 lw 2 pt 10 ps 1.5 lc rgb "blue" title "ratio of AlO_4" axes x1y2, \
         data2 u 1:((($6+$7)/($3+$4+$5+$6+$7+$8+$9))*100) w lp lt 1 lw 2 pt 8 ps 1.5 lc rgb "skyblue" title "ratio of AlO_{5+}" axes x1y2, \
         data2 u 1:((($3+$4)/($3+$4+$5+$6+$7+$8+$9))*100) w lp lt 1 lw 2 pt 6 ps 1.5 lc rgb "royalblue" title "ratio of AlO_{3-}" axes x1y2

    # Third
    unset xlabel
    unset ylabel
    unset y2label
    unset tics

    set y2range [0:25]
    plot data3 u 1:2 w p pt 1 ps 1.5 pi 500 lc rgb "web-green" title "Stress-strain" axes x1y2
    set rmargin 7
    set border 8
    set y2label "Stress (GPa)" offset -3
    set y2tics nomirror offset 0,0
    plot NaN title ""

unset multiplot

Problem is, whatever I do, it seems that I cannot resolve that overlapping legend issue. I think this is because I'm using multiple plot commands, but I'm not sure how can I manage & control these legend contents. I wish one legend to escape from other legends, 3 columns or 2 columns.

Is it possible to control two legends using a single set key command? Or should I need to use a separate set key command?


Solution

  • You can use keyentry to workaround this, check help keyentry.

    Add the the following line to your first series of plot commands:

    keyentry w p pt 1 ps 1.5 lc rgb "web-green" title "Stress-strain"
    

    and shorten the second plot command to:

    plot data3 u 1:2 w p pt 1 ps 1.5 pi 500 lc rgb "web-green" axes x1y2 notitle
    

    Addition:

    Just for completeness and reference, find a minimal example below...

    Code:

    ### 3 axes with legend entry
    reset session
    
    set multiplot
    
        set samples 21
        set lmargin 10
        set tmargin 4
        set bmargin 4
        set rmargin 15
        set key at screen 0.9, screen 0.95 vertical maxrows 2
        
        set xlabel "x-axis for all"
        set ylabel "First y-axis" tc "red"
        set yrange [-10:10]
        set y2label "Second y-axis" offset -2,0 tc "web-green"
        set y2range [-20:20]
        set y2tics nomirror
        set grid xtics, ytics
        
        # data for first and second y-axes
        plot    x w lp lc "red"       pt 6 axes x1y1 title "first dataset",\
              2*x w lp lc "red"       pt 7 axes x1y1 title "second dataset",\
             -3*x w lp lc "web-green" pt 6 axes x1y2 title "third dataset",\
             -4*x w lp lc "web-green" pt 7 axes x1y2 title "fourth dataset",\
             keyentry w lp lc "blue"  pt 6 axes x1y2 title "fifth dataset", \
             keyentry w lp lc "blue"  pt 7 axes x1y2 title "sixth dataset"
    
        # data for third y-axis
        unset tics
        unset xlabel
        unset ylabel
        unset y2label
        set y2range[-40:40]
        plot 5*x w lp lc "blue" pt 6 axes x1y2 notitle,\
             6*x w lp lc "blue" pt 7 axes x1y2 notitle
    
        # just to get 3rd y-axis
        set border 8
        set rmargin 7
        unset xtics
        set y2label "Third y-axis" offset -2,0 tc "blue"
        set y2tics
        plot NaN notitle
    
    unset multiplot
    ### end of code
    

    Result:

    enter image description here