mikrocontroller.net

Forum: Offtopic Y-Werte bei Skalierung eines Plots


Autor: Zulu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: aha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man plotet jeden punkt da wo er nach dem dreisatz hinkommt.

Autor: Zulu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.

Autor: Zulu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Zulu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.

Autor: Zulu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Zulu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: oszi40 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Zulu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.

Autor: yalu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> 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:
for(i=1; i<n; i++)
  drawline(mp[i-1].x, mp[i-1].y,    // letzter Messpunkt
           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, Yahoo oder Facebook? Keine Anmeldung erforderlich!
Mit Google-Account einloggen | Mit Yahoo-Account einloggen | Mit Facebook-Account einloggen
Noch kein Account? Hier anmelden.