Search code examples
gnuplot

Merge key entries in gnuplot


I would like to plot data with lines and points with different colors. It seems to exist different solutions:

However, none of them handle the key properly, showing only one entry with both the line and a point with different colors... Is there another way to achieve it?

This is minimal (non-)working example.

set key bottom right
plot '+' using 1:1 title "same data with different lines and points color" with lines lc 'blue', '' using 1:1 every 3 notitle with points ps 1.2 pt 7 lc 'red';

Kind regards, Alexis.


Solution

  • Having 3 different colors for a linespoints plot is certainly "non-standard" and as you noticed a challenge especially for the proper key.

    Here is a suggestion without using multiplot. Personally, I would use multiplot only if absolutely necessary. Otherwise you will lose the benefits of automargin and autoscale and you have to deal with margins and ranges, etc. yourself as you did in your solution.

    Since the automatic creation of the key is the problem, then "do-it-yourself".

    Update: simplified plot command and legend at graph coordinates.

    This suggestion draws the legend via labels and arrows. You give the position and distances of the legend in graph coordinates. The mix of points and linespoints within a for loop is taken from here.

    Script: (works with gnuplot>=5.0.0, Jan. 2015)

    ### legend for plot with linespoints and different colors for line, fill and border
    reset session
    
    # no. lw  pt  colorLine  colorFill  colorBorder label
    mySettings = '\
      1   2   5   0x00ff00   0xffff00   0xff0000     "x + 1"   \
      2   2   7   0x0000ff   0xff00ff   0x000000     "x^2 - 8" \
    '  # end of settings
    
    myLw(n)      = real(word(mySettings,n*7-5))   # linewidth
    myPt(n)      =  int(word(mySettings,n*7-4))   # pointtype
    cL(n)        =  int(word(mySettings,n*7-3))   # color line
    cF(n)        =  int(word(mySettings,n*7-2))   # color fill
    cB(n)        =  int(word(mySettings,n*7-1))   # color border
    myLabel(n)   =      word(mySettings,n*7)      # label
    myLt(n)      = n==1 ? 1 : -2
    myPtL(v,i)   = i==1 ? 0     : i==2 ? myPt(v) : myPt(v)-1
    myColor(v,i) = i==1 ? cL(v) : i==2 ? cF(v) : cB(v)
    myPs         = 3   # fixed pointsize
    
    # Legend position graph units
    xPos = 0.05     # x-position
    yPos = 0.95     # y-position
    dy   = 0.07     # y distance
    dx   = 0.025    # x length
    
    set for [i=1:words(mySettings)/7] arrow from graph xPos-dx,yPos-(i-1)*dy to graph xPos+dx,yPos-(i-1)*dy \
        lw myLw(i) lc rgb myColor(i,1) nohead back
    set for [i=1:2] for [j=2:3] label myLabel(i) at graph xPos,yPos-(i-1)*dy left offset 3,0 \
        point pt myPtL(i,j) ps myPs lc rgb myColor(i,j) lw myLw(i) front
    
    set samples 11       # samples for functions
    set key noautotitle
    set grid x
    set grid y
    
    f1(x) = x + 1
    f2(x) = x**2 - 8
    
    plot for [i=1:3]        f1(x) w lp lt myLt(i) pt myPtL(1,i) ps (i>>1)*myPs lc rgb myColor(1,i) lw myLw(1), \
         for [i=1:3] [-5:5] f2(x) w lp lt myLt(i) pt myPtL(2,i) ps (i>>1)*myPs lc rgb myColor(2,i) lw myLw(2)
    ### end of script
    

    Result:

    enter image description here