klose: kurve zeichnen

Hallo,

gegeben sei eine Menge an Punkten xn, yn
Abgelegt sind diese in einem Array, der wie folgt aussieht:

points[x1] = y1
points[x2] = y2
points[xn] = yn
points[x1000] = y1000

Zu erwähnen wäre noch, dass x die Zeitachse repräsentiert, y eine Anzahl an Objekten (es handelt sich hierbei um eine Lebens-Simulation und ich möchte den Anstieg und den Niedergang einer Population anhand einer Kurve darstellen.

points[0] = 1 // bei Sekunde null gibt es nur ein Objekt
points[1] = 2 // nun sind es schon zwei Objekte
points[2] = 4 // nun sind es schon 4 Objekte
points[3] = 2 // nun sind es nur noch zwei Objekte (zwei sind schon gestorben)

Das ganze möchte ich in einer Kurve festhalten. Mein Problem ist nun, dass ich ja viel zu viele Kurvenpunkte habe, um zum Beispiel eine schöne Bezierkurve zu zeichnen. Ich müsste sicherlich Punkte aussortieren. Aber wie mache ich das am Besten? Oder was für Alternativen gibt es? Ich bin leider in Mathe grottenschlecht... :(

Es handelt sich übrigens um ca. 2000 Punkte (=2000 Sekunden)

Über einen Denkanstoss würde ich mich freuen!

klose

  1. n'Abend,

    gegeben sei eine Menge an Punkten xn, yn

    points[x1] = y1
    points[x2] = y2
    points[xn] = yn
    points[x1000] = y1000

    Zu erwähnen wäre noch, dass x die Zeitachse repräsentiert, y eine Anzahl an Objekten (es handelt sich hierbei um eine Lebens-Simulation und ich möchte den Anstieg und den Niedergang einer Population anhand einer Kurve darstellen.

    muss es unbedingt eine Kurve sein, oder ist eine andere graphische Darstellung ebenso brauchbar?

    points[0] = 1 // bei Sekunde null gibt es nur ein Objekt
    points[1] = 2 // nun sind es schon zwei Objekte
    points[2] = 4 // nun sind es schon 4 Objekte
    points[3] = 2 // nun sind es nur noch zwei Objekte (zwei sind schon gestorben)

    Würde ich als Balkendiagramm darstellen - über jedem x-Wert ein Balken in der Höhe des y-Werts.
    Wenn man das Diagramm skalieren muss, so dass mehrere x-Werte auf ein Pixel in der Horizontalen kommen, ist natürlich die Frage, welchen der zugehörigen y-Werte man zur Darstellung auswählt.

    In diesem Fall würde ich einen Balken in der Höhe des kleinsten y-Werts in kräftiger Farbe anzeigen, und diesen Balken z.B. in schwächerer Farbe bis zum größten y-Wert fortsetzen.

    Das ganze möchte ich in einer Kurve festhalten. Mein Problem ist nun, dass ich ja viel zu viele Kurvenpunkte habe, um zum Beispiel eine schöne Bezierkurve zu zeichnen. Ich müsste sicherlich Punkte aussortieren.

    Punkte aussortieren und dann eine Kurve hineininterpolieren halte ich für schwierig. Dann schon eher einen Ausflug in die Statistik, intervallweise eine Art gewichteten Mittelwert bilden. Oder einen "langsamen" Tiefpass über alle Punkte legen.

    So long,
     Martin

    --
    Niemand lebt allein von seinen Träumen.
    Aber wer träumt, lebt noch.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo,

      gegeben sei eine Menge an Punkten xn, yn

      points[x1] = y1
      points[x2] = y2
      points[xn] = yn
      points[x1000] = y1000

      Würde ich als Balkendiagramm darstellen - über jedem x-Wert ein Balken in der Höhe des y-Werts.
      Wenn man das Diagramm skalieren muss, so dass mehrere x-Werte auf ein Pixel in der Horizontalen kommen, ist natürlich die Frage, welchen der zugehörigen y-Werte man zur Darstellung auswählt.

      Klar, Balkendiagramm. Mann, warum ist mir das nicht eingefallen... ich war so auf eine Kurve fixiert, dass ich alle anderen Möglichkeiten nicht wahrgenommen habe. Danke für den TIp!

      Das ganze möchte ich in einer Kurve festhalten. Mein Problem ist nun, dass ich ja viel zu viele Kurvenpunkte habe, um zum Beispiel eine schöne Bezierkurve zu zeichnen. Ich müsste sicherlich Punkte aussortieren.

      Punkte aussortieren und dann eine Kurve hineininterpolieren halte ich für schwierig. Dann schon eher einen Ausflug in die Statistik, intervallweise eine Art gewichteten Mittelwert bilden. Oder einen "langsamen" Tiefpass über alle Punkte legen.

      Genau, dass dachte ich mir nämlich auch. Welcher Punkt hat weniger Gewichtung, um entfernt zu werden, etc. Schwierige Aufgabe für einen Mathe-Deppen wie mich. Die Intervall-Lösung hingegen gefällt mir sehr gut, das werde ich auch noch probieren. Wahlweise kann man dann in meiner Applikation zwischen Balkendiagramm und Kurve wählen. Hättest du noch einen Tip für mich, wie man (vorzugsweise in Java) eine schöne Kurve aus gegebenen Punkten hinbekommt?

      Danke nochmals!

      1. Was verstehst du unter einer schönen Kurve? Welche Kriterien soll die Kurve erfüllen? Sollen Ausreißer eher unterdrückt werden oder willst du gerade sowas auch hervorheben? D.h. geht es eher um die allgemeine Tendenz, oder um Details der Werte.

        Bei Bezier zum Beispiel wie du anfangs dachtest, hast du das Problem dass de Kurve zwar schon deine Punkte trifft, aber zwischen den Punkten weicht sie noch ziemlich von den Werten ab.
        Einfach mit einer Geraden verbinden wäre die ehrlichste Methode, ist aber evtl. recht zackig.

      2. Hallo klose,

        Genau, dass dachte ich mir nämlich auch. Welcher Punkt hat weniger Gewichtung, um entfernt zu werden, etc. Schwierige Aufgabe für einen Mathe-Deppen wie mich. Die Intervall-Lösung hingegen gefällt mir sehr gut, das werde ich auch noch probieren. Wahlweise kann man dann in meiner Applikation zwischen Balkendiagramm und Kurve wählen. Hättest du noch einen Tip für mich, wie man (vorzugsweise in Java) eine schöne Kurve aus gegebenen Punkten hinbekommt?

        Wenn es eine Kurve sein soll, auf der alle Punkte exakt liegen, muss du zwischen ihnen interpolieren. Ein relativ einfaches und (in Java dank JScience auch einfach zu implementierendes) Verfahren ist die Interpolation nach Newton. Weniger Überschwinger, dafür mehr Rechenaufwand hast du bei der Spline-Interpolation.

        Wenn die Rohdaten allerdings Messwerte mit einigen Ausreißern enthalten, empfiehlt sich vielleicht eher eine (diskrete) Approximation. Die resultierende Kurve läuft nicht durch die Punkte, sondern ist das Polynom beliebigen Grades, das für diese Punkte den geringsten Fehler hat. Ist der Grad des Approximationspolynoms gleich der Anzahl der Punkte minus eins, ist es dasselbe wie ein Interpolationspolynom.

        Wie gesagt, wenn es Java sein soll, empfehle ich wärmstens JScience. Das (bei der Approximation) anfallende Lösen linearer Gleichungssysteme kannst du auch relative einfach von Jama erledigen lassen.

        Grüße
        Richard

  2. Hello,

    man kann HTML+CSS auch vergewaltigen

    http://selfhtml.bitworks.de/grafik/sinus.php
    http://selfhtml.bitworks.de/grafik/sinus.php.txt

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. Hallo,

    Das ganze möchte ich in einer Kurve festhalten.

    gnuplot?

    Mein Problem ist nun, dass ich ja viel zu viele Kurvenpunkte habe, um zum Beispiel eine schöne Bezierkurve zu zeichnen. Ich müsste sicherlich Punkte aussortieren. Aber wie mache ich das am Besten?

    Mit der Smooth-Option.

    Dann kannst du diesen Graph als Bild exportieren und in dein HTML Dokument einbinden.

    Grüße