Search code examples
javanormal-distribution

Java Guassian Distribution-Bell Curve


I have calculated mean and SD of a set of values. Now I need to draw a bell curve using those value to show the normal distribution in JAVA Swing. How do i proceed with this situation.

List : 204 297 348 528 681 684 785 957 1044 1140 1378 1545 1818

Total count : 13

Average value (Mean): 877.615384615385

Standard deviation (SD) : 477.272626245539

If i can get the x and y cordinates I can do it, but how do i get those values?


Solution

  • First you need to calculate the variance for the set. The variance is computed as the average squared deviation of each number from its mean.

    double variance(double[] population) {
            long n = 0;
            double mean = 0;
            double s = 0.0;
    
            for (double x : population) {
                    n++;
                    double delta = x – mean;
                    mean += delta / n;
                    s += delta * (x – mean);
            }
            // if you want to calculate std deviation
    
            return (s / n);
    }
    

    Once you have that you can choose x depending on your graph resolution compared to your value set spread and plug it in to the following equation to get y.

    protected double stdDeviation, variance, mean; 
    
        public double getY(double x) { 
    
            return Math.pow(Math.exp(-(((x - mean) * (x - mean)) / ((2 * variance)))), 1 / (stdDeviation * Math.sqrt(2 * Math.PI))); 
    
        } 
    

    To display the resulting set: say we take the population set you laid out and decide you want to show x=0 to x=2000 on a graph with an x resolution of 1000 pixels. Then you would plug in a loop (int x = 0; x <= 2000; x = 2) and feed those values into the equation above to get your y values for the pair. Since the y you want to show is 0-1 then you map these values to whatever you want your y resolution to be with appropriate rounding behavior so your graph doesn't end up too jaggy. So if you want your y resolution to be 500 pixels then you set 0 to 0 and 1 to 500 and .5 to 250 etc. etc. This is a contrived example and you might need a lot more flexibility but I think it illustrates the point. Most graphing libraries will handle these little things for you.