使用Java绘制高斯曲线

5
我正在使用Piccolo编写交互式小程序,需要在其中包含高斯曲线(又称正态分布图表)。
我想任何Java实现都足够了,但我找不到任何实现。理想情况下,我希望传递一组值,并在面板、图像对象或任何可以嵌入小程序的东西中绘制图表。
在自己开始编码之前,有人知道如何实现它的代码吗?
其他语言的实现也可以,只要它们容易移植到Java。

你是在数学方面还是在库方面遇到了问题? - isekaijin
只是一些库 :) 我本来可以自己编写代码,但不想重复造轮子浪费时间 ;) - Seb
2个回答

5
我不知道它是否有效,但Google找到了这段代码来绘制高斯分布图
该项目的主页在这里
如果Piccolo不能为您执行绘图,则建议使用JFreeChart进行实际绘图,因为它得到了广泛支持并且非常强大。(我不熟悉Piccolo)

看起来很有前途;在谷歌上没有找到。我会尝试一下,如果有效的话就接受这个答案,谢谢 :) - Seb
最终,我没有使用高斯图表而是传统的条形图。无论如何,这个答案是最好的,因为你提供了一个可工作代码的链接(尽管John也给出了一些很好的例子),所以我接受了它。 - Seb

2
编辑:看起来Apache Commons Math库有一个统计部分。具体来说,是关于常见分布的整个包。希望有一些数学专业人士,因为我不记得基本统计知识了……这是我尝试使用他们的库。我只是在这里使用滑动窗口,并计算这些值之间的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;
    }
}

我假设您想要图形的概率密度函数。 维基百科上有方程式,因为我不知道如何在此处包含数学标记。只需将p(x)用作Y值,X用作X值,您就可以从中得到一个相当简单的二维图形。
您看过Java下的Mathtools吗?
好的,那么这个怎么样……您给出一个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;
}

如果在网络上找不到合适的平均值和标准差,实现任意平均值和标准差应该很容易。


是的,我看过那些方程式了,如果我找不到已经可用的库,我会使用它们。无论如何,谢谢! - Seb
听起来不错!我搜索得越多,就越觉得我必须自己编码,所以这真的很受欢迎。谢谢! - Seb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接