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.