Angemommen ich habe 100 Datensätze mit Zahlen und möchte die in einem X-Y-Plot darstellen. Wenn ich jetzt in X-Richtung nur 50 Punkte zur Verfügung habe, habe ich zwei Möglichkeiten. 1. Ich plotte nur jeden zweiten Wert. Nachteil. Die Kurve wird insofern verfälscht, das etwa Ausreisser fehlen. Das Maximum/Minumum ist visuell nicht sichtbar. 2. Ich plotte jeweils den Mittelwert zweier Werte. Nachteil: Die Kurve wird verfälscht in dem Ausreisser zwar berücksichtig aber untertrieben werden. Das Maximum/Minimum ist nicht sichtbar. Ich habe das Gefühl, das ich da was ganz einfaches nicht sehe. Aber ich komme nicht drauf. Mein Problem muss eigentlich schon tausendfach aufgetreten sein, aber ich finde bei Google einfach nichts dazu. Vielleicht habe die falschen Suchbegriffe. Unter Skalierung finde ich entweder triviales wie das Verhältnis von Skalenendwert zu Maximum des Messbereiches für die Umrechnung in die Pixelkoordinate oder Hinweise zur Bedienung einzelner Programme. Aber keine Texte zu so einer Grundfrage. Komplizierter wird es ja noch wenn der Plotbereich nicht in einem ganzzahligen Verhältnis zur Anzahl der Werte steht. Nochmal zur Abgrenzung: Es geht nicht darum, die Messwerte in Pixelkoordinaten umzurechnen. Das ist ja einfach Dreisatz. Auch das die Pixelkoordinate natürlich auf einen nächstliegenden ganzzahligen Wert gerundet werden muss, ist klar und das dies unvermeidbar ist. Kann mir da jemand einen Hinweis geben?
@ Aha >Man plotet jeden punkt da wo er nach dem dreisatz hinkommt. >>Nochmal zur Abgrenzung: Es geht nicht darum, die Messwerte in >>Pixelkoordinaten umzurechnen. Das ist ja einfach Dreisatz.
Ich glaube hier im Off-Topic bin ich etwas isoliert. Kann vielleicht einer von den Mods das woanders hinschieben? Das wäre nett. Habe leider nichts gefunden, was zum Topic "Algorithmen" passen würde.
Zulu schrieb: > Wenn ich jetzt in X-Richtung nur 50 Punkte zur Verfügung habe, habe ich > zwei Möglichkeiten. > 1. Ich plotte nur jeden zweiten Wert. Nachteil. Die Kurve wird insofern > verfälscht, das etwa Ausreisser fehlen. Das Maximum/Minumum ist visuell > nicht sichtbar. > > 2. Ich plotte jeweils den Mittelwert zweier Werte. Nachteil: Die Kurve > wird verfälscht in dem Ausreisser zwar berücksichtig aber untertrieben > werden. Das Maximum/Minimum ist nicht sichtbar. 3. Du plottest 50 Werte in der einen Farbe und 50 Werte in einer anderen (benötigt ggf. zwei X Achsen) 4. Du plottest nur eine (verschiebbaren) Ausschnitt Ansonsten wüßte ich nicht wie man durch Reduktion um 50% die ursprünglichen Daten erhalten kann. Je nach Art der Daten kann man höchsten das ein oder andere Verfahren einsetzen um halt die eigentliche Information nicht zu zerstören.
@ Läubi >3. Du plottest 50 Werte in der einen Farbe und 50 Werte in einer anderen >(benötigt ggf. zwei X Achsen) Äh? Dann würde also an einer X-Stelle zwei Punkte in Y-Richtung geplottet? Verstehe ich das richtig? >4. Du plottest nur eine (verschiebbaren) Ausschnitt Das geht leider nicht. >Ansonsten wüßte ich nicht wie man durch Reduktion um 50% die >ursprünglichen Daten erhalten kann. Die Frage scheint dann doch nicht so dumm zu sein. Vor allem: Wenn das Verhältnis ungeradzahlig ist, dann muss ich noch den/die benachbarten Wert(e) gewichten, je nach dem welcher Anteil durch die Zielskala abgedeckt ist, oder wie? Wie machen es denn die Plot-Libraries oder Matlab usw.? Da kann ich ja auch auf 1024*786 Plots machen, wo die X-Achse mal so 10000 Werte hat.
Hmmm. Bei einem Funktionsplot würde ich überhaupt nur die Y-Werte ausrechnen, die auf der X-Skala des Plots vorhanden sind. D.h. wenn die Funktion irgendwie 138ten Grades ist würden dazwischenliegende extrem von den Nachbarn abweichende Werte auch verlorengehen können. Das nimmt man aber anscheinend in Kauf, oder wie? Wenn ich aber Wertepaare habe, dann geht das nicht, weil ich mir die X-Werte nicht aussuchen kann. Bei rationalen Verhältnissen vielleicht interpolieren?
Zulu schrieb: > @ Läubi > >>3. Du plottest 50 Werte in der einen Farbe und 50 Werte in einer anderen >>(benötigt ggf. zwei X Achsen) > > Äh? Dann würde also an einer X-Stelle zwei Punkte in Y-Richtung > geplottet? > Verstehe ich das richtig? Jupp. > Wie machen es denn die Plot-Libraries oder Matlab usw.? Da kann ich ja > auch auf 1024*786 Plots machen, wo die X-Achse mal so 10000 Werte hat. Da gibt es verschiedene Möglichkeiten: 1) Du Plottest das ganze in der "richtigen" Auflösung und rechnest es dann auf die Zielgröße runter 2) Wenn du eine Funktion hast, wird diese halt nur an den gegeben Stellen ausgewertet > Wenn ich aber Wertepaare habe, dann geht das nicht, weil ich mir die > X-Werte nicht aussuchen kann. Du kannst z.B. zwischen zwei Werten linear interpolieren, also ne Kombination aus 1 + 2. Es gibt einfach kein Verfahren was für jeden Zweck optimal ist... wenn du ne Sinusfunktion hast macht es in bestimmten Grenzen nix aus wenn Werte(in regelmäßigen Abständen) fehlen, du wirst immer noch nen Sinus erkennen. Sind es aber (chaotische) Meßwerte sodass jeder Punkt information enthält und keine Redundanz dann hast du keine Möglichkeit das zu reduzieren ohne Informationen zu verlieren! Wäre ansosnten sicher DAS perfekte Kompressionsverfahren: Du hast 100 Werte und reduzierst diese ohne Informationsverlust auf 50 Werte. Diese nach dem gleichen Verfahren auf 25... und so weiter bis du nurnoch einen Punkt hast der die Information der 100 Werte enthält ;) Wie gesagt wenn man etwas über die Werte weiß (z.B. Temperaturverlauf) und dich interessiert in einem Plot vorallem die Maximaltemperaturen dann kannst du auch aus zwei Werten einfach das Maximum nehmen. Dann geht dir abe rggf die Information über das Minimum verloren.
@Zulu Das Dilmma kenne ich aber ich habe damals eine einfache eigene Lösung dafür gefunden. Von den 100 Werten nehme man jeden 2. Ggf.wenn sinvoll werden 2 Werte entweder zu einem Mittel zusammengefasst. Wenn es wichtig ist ausreißer mitzubekommen dann nimmt man von beiden Werten den Größeren. Fürs Maximum bzw. Minimum (Absolut über die ganze Messreihe) läst man eben entweder eine Schleife durchlaufen um beide heraus zu finden bzw. mit einer vorhandenen Funktion ausgeben um dann an betreffender Stelle den dortigen Wert zu überschreiben. Nebenbei bekommt man so die nötige Skalierung für y gleich mit heraus. Egal mit welcher Sprache man es macht hat man dann seine 50 Messwerte mit maximum/Minimum die man dann entsprechend ausgeben kann. Fertig.
>Wäre ansosnten sicher DAS perfekte Kompressionsverfahren Ja. Schade. Wieder ein Patent verpasst. ;-) >wenn du ne Sinusfunktion hast macht es in bestimmten Grenzen nix aus wenn <Werte(in regelmäßigen Abständen) fehlen, du wirst immer noch nen Sinus >erkennen. Ja. Das habe ich auch schon gedacht. Deswegen ja auch das Beispiel mit der Funktion 128ten Grades von oben. Damit wollte ich andeuten, das es eine Funktion ist, die sehr wahrscheinich Ausreisser hat. Pragmatisch gesehen, stimme ich Dir zu das es die optimale Lösung nicht gibt. Nun ist es so, das in meinem Fall die Kurve einen typischen Verlauf hat. Dann werde ich die Interpolation machen. Aber eine Frage noch: >Du Plottest das ganze in der "richtigen" Auflösung und rechnest es >dann auf die Zielgröße runter Das verschiebt doch nur das Grundproblem von Interpolation auf: Links ein gesetzter Pixel, rechts ein gelöschter? Was nun? (Bei diagonalen noch schlimmer). Hast Du noch einen Buchtip oder sowas zu dem Thema im allgemeinen?
Bin nicht so der Buch Typ sorry, ich les zwar gerne aber das meiste Online/Digital :) Wo kommen den die Daten her und was hast du für ein Ausgabegerät? Ich mein wenn man nur 50 Pixel hat um etwas darzustellen sollte man auch nur 50 Werte aufnehmen. > Das verschiebt doch nur das Grundproblem von Interpolation auf: Links > ein gesetzter Pixel, rechts ein gelöschter? Was nun? Da würd ich mich mal im Bereich Grafikprogramme umsehen, da gibt es sicher Modelle, besonders wenn man verschiedene Farben zur verfügung hat, könnte man es ja so machen das man den Mittleren Farbwert bestimmt, sodass eine Schware und eine Weiße Linie zusammen eine graue ergeben wenn man sie auf eine Linie reduziert.
Ein geeignetes Excel-Diagramm aussuchen, wäre auch ein Versuch ohne größere Anstrengung. Nur ein Quadrat 100x100 mm GEZEICHNET muß nicht ein Quadrat 100x100 GEDRUCKT sein. Gewisse "Streu- und Rieselverluste" sind unterwegs durch Umrechnung, Treiber und mechanische Differenzen zu erwarten. Das trifft dann folglich auch auf die Diagramme zu.
Der naheliegendste Weg ist es, alle Messpunkte zu verwenden, diese einzeln in Bildschirmkoordinaten umzurechnen und auf ganze Zahlen zu runden. Diese Bildschirmpunkte kann man nun entweder als einzelne Pixel darstellen oder durch Linien miteinander verbinden. Was passiert, wenn die Messpunkte in horizontaler Richtung dichter liegen als die Pixel auf dem Bildschirm? Bei der Darstellung mit einzelnen Pixeln werden jetzt eben mehrere Messpunkte an derselben x-Koordinate angezeigt. Statt einer geeordneten Reihe von Punkten sieht man also eher eine Punktwolke. Es gehen aber keine Ausreißer verloren. Bei der Darstellung als Linienzug erscheint die Linie an den Stellen, wo benachbarte Messpunkte stark streuen, einfach breiter, da die Details wegen der zu geringen x-Auflösung nicht mehr dargestellt werden können. Auch hier gehen keine Ausreißer verloren. Optisch ansprechender sieht das Ganze aus, wenn der Linienzug antialiased gezeichnet wird. Dadurch wird die visuell empfundene Bildschirmausflösung erhöht. Neuere Vektorgrafikbibliotheken wie z.B Cairo verarbeiten deswegen auch nichtganzahlige Koordinaten und Linienstärken. Die oben erwähnte Rundung auf ganzzahlige Pixelkoordinaten entfällt damit. Welche der drei Möglichkeiten am besten aussieht, ist auch etwas Geschmacksache. Wenn die Messpunkte eine halbwegs stetige Kurve bilden, würde ich sie als Linienzug, wenn möglich mit Antialiasing, darstellen.
@ Läubi >Bin nicht so der Buch Typ sorry, ich les zwar gerne aber das meiste >Online/Digital :) Das macht ja nichts. Ich meinte mit "oder so" auch einen Link. >Wo kommen den die Daten her und was hast du für ein Ausgabegerät? >Ich mein wenn man nur 50 Pixel hat um etwas darzustellen sollte man auch >nur 50 Werte aufnehmen. Nun ganz allgemein Peripherie, manuelle Eingabe und alles was sonst so Daten von sich läßt. Akut ist jetzt aber ein propriätäres Messgerät an der Reihe. Da kann ich weder die Schrittweite noch Anfangs- oder Endwert ändern. Ich könnte also einzig Werte weglassen. >> Das verschiebt doch nur das Grundproblem von Interpolation auf: Links >> ein gesetzter Pixel, rechts ein gelöschter? Was nun? >Da würd ich mich mal im Bereich Grafikprogramme umsehen, da gibt es >sicher Modelle... Ja klar, gibt es die. Ich wollte damit nur sagen, das ein Problem von gewisser Komplexität (Interpolation) gegen ein anderes Problem ähnlicher Komplexität getauscht wird. War nicht als Frage oder Kritik gemeint. @ yalu Deinen Ansatz finde ich interessant. Ganz verstehen tue ich aber nur den ersten. Beim zweiten und dritten wäre meine Frage, was denn der Endpunkt der Linie ist, wenn auf einer X-Stelle mehrer Y-Werte liegen? Ich verstehe das so, das von X-Stelle zu X-Stelle ein Segment gezeichnet wird. Oder meinst Du eine irgendwie gefittete Kurve? Eine "Linie" kann, aber muss ja nicht nur aus einer Geraden bestehen. Was verstehst Du unter eine Linie? Eher eine Gerade oder eine Polyline. In jedem Fall wäre die Frage welcher der Punkte an einer X-Stelle als Stützpunkt verwendet werden soll.
> Ganz verstehen tue ich aber nur den ersten. Beim zweiten und dritten > wäre meine Frage, was denn der Endpunkt der Linie ist, wenn auf einer > X-Stelle mehrer Y-Werte liegen? An der Sache ist nichts magisches. In C würde man das etwa so programmieren:
1 | for(i=1; i<n; i++) |
2 | drawline(mp[i-1].x, mp[i-1].y, // letzter Messpunkt |
3 | mp[i ].x, mp[i ].y); // aktueller Messpunkt |
mp ist dabei ein Array mit den (bereits in Bildschirmkoordinaten umgerechneten) Koordinaten der Messpunkte. drawline zeichnet eine gerade Linie zwischen zwei Punkten. Haben zwei aufeinanderfolgende Messpunkte nach der Rundung die gleiche x-Koordinate, verläuft die Verbindungslinie senkrecht. Das angehängte Bild soll das verdeutlichen: Die Pixel, an den Messpunkten sind rot, die Verbindungslinien blau gezeichnet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.