具有多个语句的Gnuplot函数

时间:2015-01-07 07:03:14

标签: gnuplot

问题

是否可以定义在?

中定义多个语句的函数

上下文

我想通过定义函数来自动化创建堆积图所涉及的一些计算。特别是,我希望有像

这样的东西
mp_setup(bottom_margin, top_margin) = \
    set tmargin 0; \
    set bmargin 0; \
    mp_available_height = 1.0 - top_margin - bottom_margin; \
    mp_current_height = bottom_margin;
mp_plot(plot_height) = \
    mp_plot_size = plot_height * mp_available_height; \
    set origin 0,mp_current_height; \
    set size 1,mp_plot_size; \
    mp_current_height = mp_current_height + mp_plot_size;

预期用途为:

...
set multiplot
mp_setup(0.05, 0.05)

mp_plot(1.0/3.0)
plot ...

mp_plot(2.0/3.0)
plot ...

这应该会自动导致绘图很好地堆叠,而不必计算每个图形的原点和大小。

问题

定义上述函数的方法不起作用,因为看起来函数定义的解析在第一次出现;时结束;但是这些分号对于分隔每个语句是必要的(否则,我们set tmargin 0 set bmargin 0...无效)。

Gnuplot似乎也不支持任何分组语句(如C / C ++中的{...});或者至少,我从未遇到过它。

可能的解决方案

我知道存储多个函数并评估它们的唯一方法是使用宏:

mp_setup = "<as above>"
mp_plot = "<as above>"

但这里的问题是宏不允许传入参数,而是必须事先声明每个变量,如下所示:

...
set multiplot
top_margin = 0.05
bottom_margin = 0.05
@mp_setup

plot_height = 1.0/3.0
@mp_plot
plot ...

 plot_height = 2.0/3.0
@mp_plot
plot ...

这个解决方案虽然应该可行但并不那么优雅。

没有别的办法吗?

2 个答案:

答案 0 :(得分:1)

不,不可能定义这样的功能。在gnuplot中,用户定义的函数不能包含setunset或其他命令。只允许那些表达式,它们返回数字或字符串变量。在这里,您可以使用逗号分隔几个表达式:

a = 0
f(x) = (a = a + 1, a + x)
print f(1)
print f(1)

除了使用宏(@var)的解决方案之外,我更喜欢在函数内构造字符串并调用eval

set_margin(s, v) = sprintf('set %smargin at screen %f;', s, v)
set_margins(l, r, b, t) = set_margin('l', l).set_margin('r', r).set_margin('b', b).set_margin('t', t)

eval(set_margins(0.1, 0.95, 0.15, 0.98))

对于多时间布局的特定情况,您还可以看到Removing blank gap in gnuplot multiplot

答案 1 :(得分:0)

你可以这样做

mp_setup(bottom_margin,top_margin)=(tmargin = 0,bmargin = 0,mp_available_height = 1.0 -top_margin-bottom_margin,mp_current_height = bottom_margin)

试验: print mp_setup(0.05,0.05) ==&GT; 0.05

正如您所提到的,函数中的分组语句尚未支持。 我希望这对你有所帮助