2

プロット空間の寸法を gnuplot に保存することは可能ですか? キャンバス全体ではなく、プロット フレーム内の領域を意味します。

4

1 に答える 1

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_*MIN値はそうではありません (少なくとも 4.6.0、4.6.3、および 4.7 (2013-09-23) では)。この値は でなければなりませんが、それはです。さまざまな端末のかなり完全なチェックは次のとおりです。GPVAL_TERM_*MAXGPVAL_TERM_*SIZEpdfcairo20wxt1

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)
....
于 2013-10-02T07:38:36.380 に答える