Servus,
Ich bastel gerade an einem kleinen Tool zur Darstellung von Messreihen.
Wenn ich mit Programmen wie Matlab Diagramme mit mehreren Kurven plotte,
haben diese ja in der Regel unterschiedliche, gut unterscheibare Farben.
Hat jemand eine Ahnung wie diese Farben festgelegt werden? Wird da
einfach aus einer definierten Liste ausgewählt, oder gibt es einen
Algorithmus, der Farben mit möglichst großer "optischer Distanz"
berechnet?
Gruß
Hallo,
ich weiss zwar nicht wie es Matlab macht aber an deiner Stelle würde ich
mir ein paar Farben definieren, die man gut unterscheiden kann und diese
in einer Tabelle/ Array oder was auch immer speichern.
Mehr als 10 Farben brauchst du bestimmt nicht, da es sonst sehr
unübersichtlich wird. Berechnen würde ich da nichts, obwohl das in
manchen Farbräumen recht einfach ist ( bsp HSV-farbraum ).
Befass' dich mal mit dem HSB-Farbsystem. B steht für "brightness"
(Helligkeit), S für "saturation", Sättigung (volkstümlich auch
"Reinheit" der Farben.
Die Farbe selbst legst du über einen Wert H ("hue") von 0 bis 360 (im
Modell entlag eines Kreisumfanges) fest. Es beginnt bei 0 Grad mit Rot,
dann folgen in je 60 Grad-Schritten die weiteren Grundfarben, also
60=Gelb, 120=Grün, 180=Cyan, 240=Blau, 300=Magenta, 360=0=Rot, natürlich
mit allen Zwischenstufen.
Wenn du also 20 Messwerte hast, telst du einfach den Bereich von 0 bis
300 in 20 Abschnitte und du hast maximal Farbdistanz ...
Es gibt, in Wahrheit, nur sehr wenig gut unterscheidbare Farben. Ganz
wichtig, wenn man auch noch Drucken will. Die meisten Programme
verwenden hierfür einfach Tabellen. Die komfortablen (komplizierten)
lassen aber dem Anwender noch die Möglichkeit diese Umzudefinieren.
Allerdings spielen hierbei auch sehr oft die Gewohnheit und der
Geschmack eine Rolle.
Zwei einfache Beispiele: Dein Lieblingshintergrund ist schwarz. Die
Beste Zeichenfarbe ist dabei aber weiß. Sieht nicht so toll beim
Ausdruck aus, obwohl die Druckerhersteller es gerne sehen würden, wenn
Du den gesamten Ausdruck schwärzen würdest. Am Monitor ist Gelb, als
Linienfarbe, relativ gut sichtbar. Auf weißem Papier ist aber Schluss
mit Lustig.
Langer Rede, kurzer Sinn: Implementiere 2 Farbtabellen und las' dem
Anwender die Möglichkeit weiße Linien auf weißem Grund zu produzieren.
Kannst ja mal in den Quelltext von
Beitrag "Re: Visualisierung von geloggten Daten" (Funktion
FileOpen)schauen, dort ist es so gelöst, das der Farbkreis durch die
Anzahl der Kanäle geteilt wird und die Farben damit initialisiert werden
(maximale Sättigung).
mfG vom ingo
Danke nochmal für die Antworten. Ich werds jetzt so machen, dass ich
eine Tabelle nehme, die am Anfang automatisch befüllt wird. Dafür
variiere ich wie vorgeschlagen den H-Wert. Allerdings nehme ich für
Aufeinanderfolgende Graphen natürlich nicht benachbarte Werte (sonst
wäre die Unterscheidung ja bereits bei zwei Graphen schlecht), sondern
ich mache mehrere Umläufe nach dem Schema 0, 120, 240, 60, 180, 30, 90,
150, 210, 270, 330, ...
Klar, dass man da irgendwann nichts mehr unterscheiden kann, aber wenn
der Anwender 100 Graphen darstellen möchte, ist das seine Sache :-)
Man könnte natürlich auch noch den Linien-Stil variieren...
pks schrieb:> Allerdings nehme ich für> Aufeinanderfolgende Graphen natürlich nicht benachbarte Werte
hmm, bei beispielsweise zwei graphen wäre dan der abstand 180°, das kann
man doch super auseinanderhalten (wenn man die entsprechenden farben als
farben anerkennt).
ich würde bis zu einem vorher festgesetzten grenzwert einfach die 360
durch die anzahl der graphen teilen (maximaler farbabstand). wenn der
grenzwert unterschritten wird (hausnummer 45° -> 8 farben), danach
anfangen mit dem linienstil zu variieren (5 möglichkeiten?, das wären
dann immerhin schon 40 linien bei 8 farben), danach kann man noch mit
den markern anfangen zu spielen (10 möglichkeiten?, das wären dann in
summe 400 linien).
aber bei 400 linien kannst du auch anfangen, einfach nur irgendwelche
"kunst" zu drucken ;-)
Daniel F. schrieb:> ich würde bis zu einem vorher festgesetzten grenzwert einfach die 360> durch die anzahl der graphen teilen (maximaler farbabstand).
und wenn man einen graphen jinzufügt, ändern sich die Farben der bisher
vorhandenen. Hast du das schon mal in einem Tool gesehen?
Ich würde einfach eine Reihe (16?) von handerstellten, vom Benutzer aber
umkonfigurierbaren Linienstilen vordefinieren und die zyklisch
wiederholen, wenn der benutzer tatsächlich mehr Kurven hat.
Das ist imho das gewöhnliche vogehen, was man sonst überall sieht.
@pks
Natürlich kannst Du so viele Farben wie möglich in Farbtabellen
einbauen, oder sogar Automatismen dafür entwickeln, aber vergiss’ dabei
nicht die Praxis.
Außer Herrn Farbenfroh wird wohl kaum jemand mehr als 10 bis 15 Farben
oder Unterscheidungsmerkmale in EINE Grafik einbauen. Wenn die Grafik
nämlich auf Fingernagelgröße reduziert werden muss, weil nicht nur
Buntheit, sondern auch noch Klarheit (Legende) herrschen muss, wird die
Sache absurd.
Etwas anderes sind Flächengrafiken, die z.B. Temperaturverläufe
wiedergeben sollen. Hier können schon mal (rechnerisch) 255 Farben
ausgegeben werden, aber hier werden im Allgemeinen ein oder zwei gut
sichtbare Basisfarben in ihrer Helligkeit variiert. Dafür wird
normalerweise aber keine Farbtabelle verwandt.
Daniel F. schrieb:> ich würde bis zu einem vorher festgesetzten grenzwert einfach die 360> durch die anzahl der graphen teilen (maximaler farbabstand). wenn der> grenzwert unterschritten wird (hausnummer 45° -> 8 farben),
Die letzten 60 Grad würd' ich lassen, da gehts von Magenta zu Rot zurück
und das hatten wir schon in den ersten 60 Grad :-))
pks schrieb:> oder gibt es einen> Algorithmus, der Farben mit möglichst großer "optischer Distanz"> berechnet?
Ich habe das immer so gemacht, dass ich die Bits der Farbnummer nach
folgendem Schema auf die Bits des RGB-Wertes aufteile:
Bit (0=LSB) -> RGB / Bit
0 -> R/7
1 -> G/7
2 -> B/7
3 -> R/6
4 -> G/6
5 -> B/6
6 -> R/5
7 -> G/5
8 -> B/5
9 -> R/4
10-> G/4
11-> B/4
12-> R/3
13-> G/3
14-> B/3
15-> R/2
... und so weiter, je nachdem wie weit der Index gehen soll.
Eventuell noch R/G/B nach eigenem Geschmack tauschen und die Bits am
Ende noch invertieren, je nach Hintergrundfarbe.
(Ich fand das recht nützlich beim Debuggen von 3D-Grafik-Programmen, die
Objekte anhand ihrer ID nach obiger Methode einzufärben, da kann man
alles gut auseinanderhalten.)