Forum: PC-Programmierung Algorithmus automatische Farbe für Graphen


von pks (Gast)


Lesenswert?

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ß

von Walter T. (nicolas)


Lesenswert?

pks schrieb:
> Wird da
> einfach aus einer definierten Liste ausgewählt,

Ja.

von Christian (Gast)


Lesenswert?

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 ).

von pks (Gast)


Lesenswert?

Ok, dann werd ich das wohl per Liste machen...danke!

von Frank (Gast)


Lesenswert?

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 ...

von Amateur (Gast)


Lesenswert?

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.

von Daniel F. (df311)


Lesenswert?

matlab hat auch eingebaute colormaps, mit denen habe ich bisher ganz 
gute erfahrungen gemacht

von ingo (Gast)


Lesenswert?

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

von pks (Gast)


Lesenswert?

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...

von Daniel F. (df311)


Lesenswert?

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 ;-)

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von amateur (Gast)


Lesenswert?

@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.

von Frank (Gast)


Lesenswert?

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 :-))

von Stefan Noack (Gast)


Lesenswert?

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.

von Stefan Noack (Gast)


Lesenswert?

(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.)

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
Noch kein Account? Hier anmelden.