是否可以将绘图空间的尺寸存储在 gnuplot 中?我不是指整个画布,而是绘图框内的区域。
问问题
261 次
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
和GPVAL_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)
....
于 2013-10-02T07:38:36.380 回答