プロット空間の寸法を gnuplot に保存することは可能ですか? キャンバス全体ではなく、プロット フレーム内の領域を意味します。
1 に答える
コマンドの後、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_*MAX
GPVAL_TERM_*SIZE
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)
....