2009-03-31 16 views
4

Ich kodiere ein interaktives Applet mit Piccolo und ich muss eine Gaußsche Kurve (aka Normal distribution chart) darin enthalten.Zeichne Gaußsche Kurve in Java

Ich stelle mir vor jede Art von Java-Implementierung wäre genug, aber ich kann keine finden. Idealerweise würde ich gerne eine Reihe von Werten übergeben und das Diagramm in einem Panel, einem Bildobjekt oder irgendetwas, das in ein Applet eingebettet werden kann, zeichnen lassen.

Bevor ich meine Hände schmutzig mache und sie selbst schreibe, weiß irgendjemand von einem funktionierenden Code, um das zu tun?

Implementierungen in anderen Sprachen sind willkommen, solange sie leicht auf Java portierbar sind.

+0

Haben Sie Probleme mit der Mathematik oder mit den Bibliotheken? – pyon

+0

Nur Bibliotheken :) Ich könnte das selbst programmieren, aber das Rad nicht neu erfinden und Zeit verlieren;) – Seb

Antwort

4

Ich weiß nicht, ob es funktioniert, aber Google warf this code to plot a Gaussian distribution.

Die Homepage für dieses Projekt ist here.

Wenn Piccolo das Plotten nicht für Sie durchführt, würde ich vielleicht JFreeChart für das tatsächliche Plotten verwenden, da es weit verbreitet und sehr fähig ist. (Ich bin nicht vertraut mit Piccolo)

+0

Das sieht vielversprechend aus; habe es bei Google nicht gefunden. Ich werde versuchen und diese Antwort akzeptieren, wenn das funktioniert, danke :) – Seb

+0

Schließlich habe ich kein Gauss-Diagramm, sondern ein traditionelles Balkendiagramm verwendet. Wie dem auch sei, diese Antwort ist die beste, weil du einen Link zu funktionierendem Code geliefert hast (obwohl John auch einige großartige Beispiele gegeben hat), also akzeptiere ich es. – Seb

2

Edit: Es sieht aus wie die Apache Commons Math library hat eine Statistik-Sektion. Genauer gesagt, ein ganzes Paket auf gemeinsamen Distributions. Hoffentlich gibt es Mathe-Leute da draußen, weil ich mich nicht an grundlegende Statistiken erinnern kann ... hier ist mein Versuch, ihre Bibliothek zu benutzen. Ich habe hier nur ein gleitendes Fenster und berechne das P zwischen diesen Werten. Was ist der richtige Weg, um daraus ein PDF zu erhalten? Sie haben nur eine CDF-Funktion.

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; 
    } 
} 

Ich nehme an, Sie wollen die Wahrscheinlichkeit Dichtefunktion für das Diagramm. Die equations are on wikipedia, da ich nicht weiß, wie man Mathe Markup hier einbezieht. Verwenden Sie einfach p (x) als Y-Wert und X als X-Wert, und Sie können daraus eine ziemlich einfache 2-d-Grafik erstellen.

Haben Sie sich Mathtools under Java angesehen?

Ok, wie wäre es damit ... Sie geben ihm eine Reihe von X Punkten (normalisiert, natürlich, können Sie Ihre X Pixel zu diesen konvertieren, indem Sie jede Pixelposition durch die Breite Ihres Bildes teilen), und es wird gib die Höhen der Verteilungskurve zurück (multipliziere wiederum mit deinem Normierungsfaktor). Dies ist für den Grund Fall, in dem Mittelwert 0 und Standardabweichung ist 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; 
} 

Es soll ziemlich einfach sein, eine zu implementieren, die beliebige Mittelwert und Standardabweichung nimmt, wenn man nicht im Netz gefunden werden kann.

+0

Ja, ich habe diese Gleichungen gesehen und verwende sie, wenn ich eine bereits funktionierende Bibliothek nicht finden kann. Danke trotzdem! – Seb

+0

Hört sich gut an! Je mehr ich suche, desto mehr denke ich, dass ich mich selbst programmieren muss, also ist das wirklich willkommen. Vielen Dank! – Seb