在ImageJ菜单栏Help->Examples中提供了许多示例脚本,在Plots下有一个Dynamic Plot的选项,其脚本运行结果如下。
下面对这段程序进行拆解,并进一步加深对ImageJ宏语言的理解。
首先,外面有一个macro引起的花括号,表明这段程序是一个macro,即宏。
macro "Dynamic Plot" {
}
进入宏之后,首先是一些基础的数据准备
close("*_", "keep");
close("*_.ijm", "keep");
left = 0; right = 4;
bottom = 0; top = 1.6;
nPoints = 50;
range = right - left;
Plot.create("Dynamic Plot", "X", "Y");
Plot.setLimits(left, right, bottom, top );
Plot.setFrameSize(800, 500);
Plot.setFontSize(18);
xValues = newArray(nPoints);
yValues1 = newArray(nPoints);
yValues2 = newArray(nPoints);
yValues3 = newArray(nPoints);
sigma = 0.4; ampl = 1; x0 = 2;
很显然,Plot是用于绘图的类,create则用于创建绘图坐标系,输入参数分别是图像名称和 x , y x,y x,y轴名称。
xValues是 x x x轴数据,随后定义了三组 y y y轴数据,分别对应图中的三个曲线,每一组数据均有50个点。
接下来进入图像的主循环,主要包括两层,内层是对每个点进行遍历,从而根据对应的点,来生成相应的数据。其中, y 1 , y 2 y_1,y_2 y1?,y2?是两个类似指数函数的函数, y 3 y_3 y3?则是 y 1 , y 2 y_1,y_2 y1?,y2?求和。
外层是对 d x \text dx dx值进行遍历,其功能就是不断地更改三组不同 y y y数据的位置,使之可以移动。
for(dx = -2; dx < 2; dx += 0.05){
for (p = 0; p < nPoints; p++){
x = p/(nPoints - 1) * range + left;
y1 = ampl * exp(-pow(x - x0, 2)/(sigma * sigma * 2));
y2 = 0.5 * ampl * exp(-pow(x -dx - x0, 2)/(sigma * sigma * 2));
xValues[p] = x;
yValues1[p] = y1;
yValues2[p] = y2;
yValues3[p] = y1 + y2;
}
Plot.setColor("#ccccff");
Plot.add("filled", xValues, yValues3);
Plot.drawGrid;
Plot.setLineWidth(2);
Plot.setColor("green");
Plot.add("line", xValues, yValues1);
Plot.setColor("red");
Plot.add("line", xValues, yValues2);
Plot.setLineWidth(1);
txt = "dx = " + d2s(dx, 2);
txt += "\n(use slider to change)";
Plot.addText(txt, 0.77, 0.12);
Plot.setLegend("Sum\nGauss1\nGauss2", "top-left");
Plot.appendToStack;
}
在完成数据赋值之后,通过Plot中的add函数来添加数据点,并通过几组set函数,对曲线的外观进行调整
函数 | 功能 | y 1 y_1 y1? | y 2 y_2 y2? | y 3 y_3 y3? |
---|---|---|---|---|
setColor | 颜色 | #ccccff | 绿色 | 红色 |
setLineWidth | 线宽 | 2 | 1 | 默认 |
最后,通过addText添加文字说明,用setLegend添加图例。