Gnuplot 通过宏定义可调的新点类型

Gnuplot 通过宏定义可调的新点类型,gnuplot,Gnuplot,我想使用具有另一种颜色的厚边框的符号来绘制数据点。 我可以用相同的符号(例如,一个圆;pt 7)绘制两次数据点,但尺寸不同于给定的系数(此处1.5),当然也有不同的颜色(此处颜色1-红色-和3-蓝色-) 我试图通过一个宏来实现这一点。到目前为止,我已经将这一行添加到gnuplot初始化文件(.gnuplot gnuplot.ini,如果我没有弄错的话): 在gnuplot中,我会: s=surr(7,1,3,1) p 'data.dat' @s 这很好,但我想对其进行两方面的改进: 第一:能够

我想使用具有另一种颜色的厚边框的符号来绘制数据点。 我可以用相同的符号(例如,一个圆;
pt 7
)绘制两次数据点,但尺寸不同于给定的系数(此处
1.5
),当然也有不同的颜色(此处颜色
1
-红色-和
3
-蓝色-)

我试图通过一个宏来实现这一点。到目前为止,我已经将这一行添加到gnuplot初始化文件(.gnuplot gnuplot.ini,如果我没有弄错的话):

在gnuplot中,我会:

s=surr(7,1,3,1)
p 'data.dat' @s
这很好,但我想对其进行两方面的改进:

第一:能够像这样做

s=surr(7,@cblue,@cblue2,2) 

先前定义

但是,
@cblue
不是整数,这不起作用。另一方面,我希望仍然能够使用整数。不幸的是,我不知道哪种格式适合这里

第二:调整两个符号之间的比率(在我的定义中固定为1.5)。然而,定义

surr(a,b,c,d,e)=sprintf("pt %d lc %s ps %d*%d, \"\" pt %d lc %s ps %d",a,b,d,e,a,c,d)    
抱怨
%d*%d
,我不知道如何解决这个问题


有什么想法吗?

如果您想对给定的参数有充分的灵活性,必须只使用字符串参数:

surr(pt, lc1, lc2, ps, fac)=sprintf("pt %s lc %s ps %s*%s, \"\" pt %s lc %s ps %s", pt, lc1, ps, fac, pt, lc2, ps)
现在,您可以使用任何您想要的:

cblue = 'rgbcolor "#0083AB"'
cblue2 = 'rgbcolor "#64A8A3"'

s=surr("7",cblue,cblue2,"1", "2")
plot 'data.dat' @s

允许您输入整数或字符串的一个选项是使用字符串concat运算符
,它可以将int转换为字符串(而不是从double转换为string!)。试一试


这至少在Linux上是可行的,不确定这种自动转换是否在Windows上也有效。

非常感谢!这两种解决方案在Mac上都能完美工作。我不知道字符串concat操作符,非常方便的东西。
surr(a,b,c,d,e)=sprintf("pt %d lc %s ps %d*%d, \"\" pt %d lc %s ps %d",a,b,d,e,a,c,d)    
surr(pt, lc1, lc2, ps, fac)=sprintf("pt %s lc %s ps %s*%s, \"\" pt %s lc %s ps %s", pt, lc1, ps, fac, pt, lc2, ps)
cblue = 'rgbcolor "#0083AB"'
cblue2 = 'rgbcolor "#64A8A3"'

s=surr("7",cblue,cblue2,"1", "2")
plot 'data.dat' @s
s = surr("7", "2", "3", "2", "4")
plot 'data.dat' @s
surr(pt, lc1, lc2, ps, fac) = "pt ".pt." lc ".lc1." ps ".ps.sprintf("*%f", fac).", '' pt ".pt." lc ".lc2." ps ".ps

cblue = 'rgbcolor "#0083AB"'
cblue2 = 'rgbcolor "#64A8A3"'
s=surr(7, cblue,cblue2,1, 2)

plot 'data.dat' @s