代码之家  ›  专栏  ›  技术社区  ›  Seb

用Java绘制高斯曲线

  •  5
  • Seb  · 技术社区  · 17 年前

    Piccolo 我需要包括一条高斯曲线(又名 Normal distribution chart

    我想任何一种Java实现都足够了,但我找不到。理想情况下,我想传递一组值,并将图表绘制在面板、图像对象或任何可以嵌入小程序的东西中。

    2 回复  |  直到 17 年前
        1
  •  5
  •   Brian Agnew    17 年前

    不知道它是否有效,但谷歌放弃了 this code to plot a Gaussian distribution .

    此项目的主页是 here .

    JFreeChart

        2
  •  2
  •   John Ellinwood    17 年前

    Edit:看起来像 Apache Commons Math library Distributions 希望有一些数学专家,因为我不记得基本的统计数据。..这是我尝试使用他们的图书馆。我在这里有一个滑动窗口,计算这些值之间的P。从这里获取PDF的真正方法是什么?它们只有CDF功能。

    public void testNormalDist() throws MathException {
        DistributionFactory f = DistributionFactory.newInstance();
        NormalDistribution n = f.createNormalDistribution(0.0d, 1.0d);
        double lastx = Double.NEGATIVE_INFINITY;
        double nextx = Double.NEGATIVE_INFINITY;
        for (int i=-100; i < 100; i++) {
            nextx = i / 100d;
            System.out.println(n.cumulativeProbability(lastx, nextx));
            lastx = nextx;
        }
    }
    

    equations are on wikipedia ,因为我不知道如何在这里包含数学标记。只需使用p(x)作为Y值,x作为x值,你就可以从中得到一个非常简单的二维图。

    你看过吗 Mathtools under Java ?

    好吧,这个怎么样。..你给它一个X点数组(当然,你可以通过将每个像素位置除以图像的宽度来将X像素转换为这些点),它将返回分布曲线的高度(再次乘以你的归一化因子)。这是平均值为0、标准偏差为1的基本情况。

    public double[] normalDistBasic(double[] xarray, double mu) {
        double[] yarray = new double[xarray.length];
        double rad2pi = 2.50662827d;
        for (int off = 0; off < yarray.length; off++) {
            double x = xarray[off];
            double ss = -1d * x * x / 2d;
            yarray[off] = (-1f / rad2pi) * Math.exp(ss);
        }
        return yarray;
    }
    

    如果在网上找不到,那么实现一个任意均值和标准差的方法应该很容易。