Search code examples
gnuplot

How to plot energy diagram using gnuplot


I have data file:

0 0 3 -0.17 6 -0.05
0 0 3 -0.23 6  0.90
0 0 3 -0.41 6  0.50
0 0 3 -0.50 6 -0.33
0 0 3 -0.20 6  0.80

I want to plot the figure like this which connects each point in the lines. Can you tell me how? enter image description here


Solution

  • The following suggestion uses the plotting styles with boxxyerror, with vectors and with labels. The zero level gets the color of the last entry because everything is plotted on top of each other. Check the following example as starting point for further tweaking.

    Script:

    ### energy diagram
    reset session
    
    $Data <<EOD
    0 0 3 -0.17 6 -0.05   A_{one}
    0 0 3 -0.23 6  0.90   B_{two}
    0 0 3 -0.41 6  0.50   C_{three}
    0 0 3 -0.50 6 -0.33   D_{four}
    0 0 3 -0.20 6  0.80   E_{five}
    EOD
    
    set key noautotitle
    set xrange [-1:8]
    
    myWidth = 0.3
    
    plot for [i=1:3] $Data u (column(2*i-1)):(column(i*2)):(myWidth):(0):0:xtic(i*2-1) w boxxy lw 3 lc var, \
         for [i=1:2] '' u (column(2*i-1)+myWidth):(column(i*2)): \
             (column(2*i+1)-column(2*i-1)-2*myWidth):(column(i*2+2)-column(i*2)):0 w vec nohead lw 1 dt 3 lc var, \
         '' u 5:6:7:0 w labels offset 6,0 tc var font ",16"
    ### end of script
    

    Result:

    enter image description here

    Addition:

    From your comments: If the levels are to close such that the labels overlap, you could add an individual offset (here in column 8). Check the following example where the data is modified that the levels B and E are very close.

    Script:

    Edit after OP's comment: simplifications, with xerrorbar instead of with boxxyerror and with custom xtics

    Edit 2: simplified input data

    • reduce the input data to the minimum
    • add xticlabel from columnheader
    • use column number as x-coordinate. Mind the difference in ...$Data u (col):col:...: e.g. if col=1, (col) is the fixed value of 1, and col is the value from column 1.
    ### energy diagram with individual offset of labels
    reset session
    
    $Data <<EOD
    A     B       C       Label       Offset
    0.0   -0.17   -0.05   A_{one}     0
    0.0   -0.23    0.90   B_{two}     0.05
    0.0   -0.41    0.50   C_{three}   0
    0.0   -0.50   -0.33   D_{four}    0
    0.0   -0.20    0.85   E_{five}   -0.05
    EOD
    
    set key noautotitle
    set errorbars 0
    set offset 0.5,0.5,0,0
    myWidth = 0.1
    
    plot for [col=1:3] $Data u (col):col:(myWidth):0:xtic(columnhead(col)) w xerr lw 3 ps 0 lc var, \
         for [col=1:2] '' u (col+myWidth):col:(1-2*myWidth):(column(col+1)-column(col)):0 \
             w vec nohead lw 1 dt 3 lc var, \
         '' u (3+myWidth):($3+$5):4:0 w labels left offset 1,0 tc var font ",16"
    ### end of script
    

    Result:

    enter image description here