Gnuplot:存储绘图区域尺寸供以后使用

时间:2013-10-02 01:52:58

标签: gnuplot

是否可以在gnuplot中存储绘图空间的尺寸?我不是指整个画布,而是指绘图框内的区域。

1 个答案:

答案 0 :(得分:2)

plot命令后,可以使用几个gnuplot定义的变量GPVAL_*(类型show variables all)来查看值。其中一些可以用来获得前一个情节的边缘:

plot sin(x)
TSCALE = 1.0
LMARGIN = TSCALE*GPVAL_TERM_XMIN/(1.0*GPVAL_TERM_XSIZE)
RMARGIN = TSCALE*GPVAL_TERM_XMAX/(1.0*GPVAL_TERM_XSIZE)
TMARGIN = TSCALE*GPVAL_TERM_YMAX/(1.0*GPVAL_TERM_YSIZE)
BMARGIN = TSCALE*GPVAL_TERM_YMIN/(1.0*GPVAL_TERM_YSIZE)

要稍后恢复边距,请使用

set lmargin at screen LMARGIN
set rmargin at screen RMARGIN
set tmargin at screen TMARGIN
set bmargin at screen BMARGIN

TSCALE是一个与终端相关的因素,因为GPVAL_TERM_*MINGPVAL_TERM_*MAX在内部通过过采样因子进行缩放,但GPVAL_TERM_*SIZE值不是(至少有4.6.0,4.6.3和4.7(2013-09-23))。对于pdfcairo,此值必须为20,而wxt则为1。对不同终端进行相当完整的检查是:

if (GPVAL_TERM eq 'pdfcairo' || \
    GPVAL_TERM eq 'cairolatex' || \
    GPVAL_TERM eq 'pngcairo' || \
    (GPVAL_TERM eq 'postscript' && strstrt(GPVAL_TERMOPTIONS, 'eps ') == 1)) {
        TSCALE = 20.0
} else {
    if (GPVAL_TERM eq 'svg' || GPVAL_TERM eq 'postscript') {
        TSCALE = 10.0
    } else {    
        TSCALE = 1.0
    }   
}

由于gnuplot 5.0有一个单独的变量GPVAL_TERM_SCALE可用,它已包含所选终端的相应值,并使此复杂检查过时。

自动化

有很多方法可以实现自动化。你可以,例如将这些定义写在字符串中,并在需要时调用eval

save_margins = 'TSCALE = 1.0;'\
               'LMARGIN = TSCALE*GPVAL_TERM_XMIN/(1.0*GPVAL_TERM_XSIZE);'.\
               'RMARGIN = TSCALE*GPVAL_TERM_XMAX/(1.0*GPVAL_TERM_XSIZE);'.\
               'TMARGIN = TSCALE*GPVAL_TERM_YMAX/(1.0*GPVAL_TERM_YSIZE);'.\
               'BMARGIN = TSCALE*GPVAL_TERM_YMIN/(1.0*GPVAL_TERM_YSIZE);'
plot sin(x)
eval(save_margins)
print LMARGIN

因此

restore_margins = 'set lmargin at screen LMARGIN;'.\
                  'set rmargin at screen RMARGIN;'.\
                  'set tmargin at screen TMARGIN;'.\
                  'set bmargin at screen BMARGIN'
eval(restore_margins)

普遍使用

要尽可能使用这些功能,只需将以下内容放入脚本,例如: fixed-margins.gp

save_margins = 'LMARGIN = TSCALE*GPVAL_TERM_XMIN/(1.0*GPVAL_TERM_XSIZE);'.\
               'RMARGIN = TSCALE*GPVAL_TERM_XMAX/(1.0*GPVAL_TERM_XSIZE);'.\
               'TMARGIN = TSCALE*GPVAL_TERM_YMAX/(1.0*GPVAL_TERM_YSIZE);'.\
               'BMARGIN = TSCALE*GPVAL_TERM_YMIN/(1.0*GPVAL_TERM_YSIZE);'
restore_margins = 'set lmargin at screen LMARGIN;'.\
                  'set rmargin at screen RMARGIN;'.\
                  'set tmargin at screen TMARGIN;'.\
                  'set bmargin at screen BMARGIN;'
set_fixed_margins = save_margins . restore_margins

if (exists('GPVAL_TERM_SCALE')) {
    TSCALE = GPVAL_TERM_SCALE
} else {
    if (GPVAL_TERM eq 'pdfcairo' || \
        GPVAL_TERM eq 'cairolatex' || \
        GPVAL_TERM eq 'pngcairo' || \
        (GPVAL_TERM eq 'postscript' && strstrt(GPVAL_TERMOPTIONS, 'eps ') == 1)) {
            TSCALE = 20.0
    } else {
        if (GPVAL_TERM eq 'svg' || GPVAL_TERM eq 'postscript') {
            TSCALE = 10.0
        } else {    
            TSCALE = 1.0
        }   
    }
}

要使用此功能,在设置终端后只需load脚本,然后eval在图中适当位置的边距字符串:

set terminal ...
load 'fixed-margins.gp'

set multiplot
plot sin(x)
eval(set_fixed_margins)
....