-1

I have a coding problem where i want to plot values (x and y) and calculate the linear regression and plot it in imageJ. Can anyone help?

I tried this

public class Plot implements PlugIn {
    public void run(String arg) {
        if (IJ.versionLessThan("1.27t"))
            return;

        float[] x = {0.375f, 0.75f, 1.5f, 2.25f, 3f,3.75f,4.5f,4.75f,5f};
        // x-coordinates
        float[] y = {123f,456f,5678f,4567f,4567f,5678f,2345f,4563f,2345f};
        // y-coordinates
        float[] e = {.8f,.6f,.5f,.4f,.3f,.5f,.6f,.7f,.8f};
        // error bars

        PlotWindow plot = new PlotWindow("Example Plot","x-axis","y-axis",x,y);
        plot.setLimits(0, 5.5, 0, 6000);
        plot.addErrorBars(e);

        // add a second curve
        float x2[] = {.4f,.5f,.6f,.7f,.8f};
        float y2[] = {4,3,3,4,5};

        int N=9;
        double sumx = 0.0, sumy = 0.0, sumx2 = 0.0;
        for (int i = 0; i < N; i++)
            sumx  += x[i];
        for (int i = 0; i < N; i++)
            sumx2 += x[i]*x[i];
        for (int i = 0; i < N; i++)
            sumy  += y[i];
        double xbar = sumx / N;
        double ybar = sumy / N;

        // second pass: compute summary statistics
        double xxbar = 0.0, yybar = 0.0, xybar = 0.0;
        for (int i = 0; i < N; i++) {
            xxbar += (x[i] - xbar) * (x[i] - xbar);
            yybar += (y[i] - ybar) * (y[i] - ybar);
            xybar += (x[i] - xbar) * (y[i] - ybar);
        }
        slope  = xybar / xxbar;
        intercept = ybar - slope * xbar;

        // more statistical analysis
        double rss = 0.0;      // residual sum of squares
        double ssr = 0.0;      // regression sum of squares
        for (int i = 0; i < N; i++) {
            double fit = slope*x[i] + intercept; //calculating fit
            rss += (fit - y[i]) * (fit - y[i]);
            ssr += (fit - ybar) * (fit - ybar); //calculating ssr
        }
    }
}
Jan Eglinger
  • 3,876
  • 1
  • 22
  • 49

1 Answers1

0

The following Groovy script (which is very similar to Java, and can be run straight from the Script editor in ImageJ) illustrates how to use the ij.gui.Plot and ij.measure.CurveFitter classes to generate a plot with a regression line:

import ij.gui.Plot
import ij.measure.CurveFitter

x = [0.375d, 0.75d, 1.5d, 2.25d, 3d,3.75d,4.5d,4.75d,5d];
// x-coordinates
y = [123d,456d,5678d,4567d,4567d,5678d,2345d,4563d,2345d];
// y-coordinates

plot = new Plot("Example Plot","x-axis","y-axis");
plot.addPoints(x,y,Plot.LINE)
plot.setLimits(0, 5.5, 0, 6000);

cf = new CurveFitter((double[]) x, (double[]) y)
cf.doFit(CurveFitter.STRAIGHT_LINE)

yfit = []
for (cx in x) {
    yfit.add(cf.f(cx))
}

plot.addPoints(x, yfit, Plot.LINE)
plotwindow = plot.show()

A few recommendations:

  • Don't call your own class Plot, as a reader of your code might confuse it with ij.gui.Plot.
  • Use ij.gui.Plot instead of ij.gui.PlotWindow; the former provides more functionality.
  • Don't do a manual regression when there are tools available to do so.
  • For questions specific to the ImageJ and SciJava APIs, the best place to ask is the ImageJ forum.
Jan Eglinger
  • 3,876
  • 1
  • 22
  • 49