gnuplot自动订购数据?

时间:2017-08-18 10:44:46

标签: gnuplot

我有两个数据系列:

2.72121 -1326.8380227810
2.81569 -1326.8407684060
2.91018 -1326.8428301680
3.00466 -1326.8448265650
3.09915 -1326.8470902260
3.19364 -1326.8497826100
3.28812 -1326.8530603940
3.38261 -1326.8571516770
3.47710 -1326.8628214990
3.57158 -1326.8694360090
3.66607 -1326.8759488230
3.76056 -1326.8820177910
3.85504 -1326.8875129030
3.94953 -1326.8923946780
4.04401 -1326.8966652370
4.13850 -1326.9003601490
4.23299 -1326.9035228070

4.23299   -1326.9035228070
4.13850   -1326.9003601490
4.04401   -1326.8966652370
3.94953   -1326.8923946780
3.85504   -1326.8875129030
3.76056   -1326.8820177910
3.66607   -1326.8759488230
3.57158   -1326.8694360090
3.47710   -1326.8628214990
3.38261   -1326.8571516770
3.28812   -1326.8530603940
3.19364   -1326.8497826100
3.09915   -1326.8470902260
3.00466   -1326.8448265650
2.91018   -1326.8428301680
2.81569   -1326.8407684060
2.72121   -1326.8380227810

是相同的数据系列,但顺序相反。这是第一个系列:

Plot of first series

那是第二个:

Plot for the second series

完整的gnuplot代码是:

set loadpath 'C:\Users\sjojungfrun\Programs\gnuplot\palettes'

load 'parula.pal'
set lmargin 10

unset key
set xtics font 'arial,16'
set ytics font 'arial,16'
set grid ytics

e_kcal = 627.509391
b_angs = 0.52918
stats "reverse_scan_coord.dat" nooutput
e_min = STATS_min_y

plot "reverse_scan_coord.dat" u ($1 * b_angs):(($2 - e_min) * e_kcal) w lp pt 7 lw 2 lc 11 #smooth csplines

我正在使用gnuplot的Windows 5.0版补丁级别5。

我做错了吗?我对这个自动订购功能感到非常惊讶。

先谢谢您的帮助。

干杯!

2 个答案:

答案 0 :(得分:0)

如果不反转xrange,则x值的范围从较小/较小正数到较大/较正数。 默认情况下,gnuplot连接图中的点,这些点是数据文件中的相邻数据点。 因此,在您的情况下,可以确实说出图表是从右到左绘制的,如评论中所述。

答案 1 :(得分:0)

虽然问题得到了回答并且 OP 的误解得到澄清,但让我添加一些代码来创建一个满足 OP 初步理解的绘图,即 gnuplot 会自动根据方向调整轴方向数据。 因此,严格来说,这不是答案,而是在某些(非常特殊的)情况下可能对某人有用的补充。 嗯,通常情况下,要么您事先知道数据的方向,要么您总是想用增加 (noreverse) 或减少 (reverse) x 值来绘制它。

代码的作用:检查第一个和最后一个数据点,如果最后一个小于第一个,则将轴方向设置为 reverse,否则设置为 noreverse。如果我忽略了一个简单的 gnuplot 选项,请告诉我。

代码:

### automatically set axis in same direction as data
reset session

$Data1 <<EOD
2.72121 -1326.8380227810
2.81569 -1326.8407684060
2.91018 -1326.8428301680
3.00466 -1326.8448265650
3.09915 -1326.8470902260
3.19364 -1326.8497826100
3.28812 -1326.8530603940
3.38261 -1326.8571516770
3.47710 -1326.8628214990
3.57158 -1326.8694360090
3.66607 -1326.8759488230
3.76056 -1326.8820177910
3.85504 -1326.8875129030
3.94953 -1326.8923946780
4.04401 -1326.8966652370
4.13850 -1326.9003601490
4.23299 -1326.9035228070
EOD

$Data2 <<EOD
4.23299   -1326.9035228070
4.13850   -1326.9003601490
4.04401   -1326.8966652370
3.94953   -1326.8923946780
3.85504   -1326.8875129030
3.76056   -1326.8820177910
3.66607   -1326.8759488230
3.57158   -1326.8694360090
3.47710   -1326.8628214990
3.38261   -1326.8571516770
3.28812   -1326.8530603940
3.19364   -1326.8497826100
3.09915   -1326.8470902260
3.00466   -1326.8448265650
2.91018   -1326.8428301680
2.81569   -1326.8407684060
2.72121   -1326.8380227810
EOD

DirectionCheck(data,colX) = \
    sprintf('stats %s u (column(0)==0 ? x0=column(%d):x1=column(%d)) nooutput; \
    if (x0>x1) { set xrange[:] reverse } \
    else       { set xrange[:] noreverse }',data,colX,colX)

set multiplot layout 2,1
    set ytic 0.02

    SetDirection = DirectionCheck('$Data1',1)
    @SetDirection
    plot $Data1 u 1:2 w lp pt 7 lc "red"

    SetDirection = DirectionCheck('$Data2',1)
    @SetDirection
    plot $Data2 u 1:2 w lp pt 7 lc "blue"
unset multiplot
### end of code

结果:

enter image description here