Wenn Sie Diagramme erstellen und verschiedene Datensätze anzeigen, ist es normalerweise eine gute Idee, die Sätze nach Farben zu unterscheiden. Eine Zeile ist also rot und die nächste ist grün und so weiter. Das Problem ist dann, dass, wenn die Anzahl der Datensätze unbekannt ist, diese Farben zufällig generiert werden müssen und sie oft sehr nahe beieinander liegen (z. B. grün, hellgrün).
Irgendwelche Ideen, wie dies gelöst werden könnte und wie es möglich wäre, deutlich unterschiedliche Farben zu erzeugen?
Ich wäre großartig, wenn Beispiele (Sie können das Problem und die Lösung ohne Beispiele diskutieren, wenn Sie dies einfacher finden) in C # - und RGB-basierten Farben vorliegen würden.
Antworten:
Sie haben drei Farbkanäle 0 bis 255 R, G und B.
Gehen Sie zuerst durch
Dann geh durch
Teilen Sie dann durch 2 => 128 und beginnen Sie erneut:
Teilen Sie durch 2 => 64
Addiere das nächste Mal 64 zu 128 => 192
folge dem Muster.
Einfach zu programmieren und gibt Ihnen ziemlich unterschiedliche Farben.
BEARBEITEN: Anforderung eines Codebeispiels
Fügen Sie außerdem das zusätzliche Muster wie folgt hinzu, wenn Grau eine akzeptable Farbe ist:
Es gibt verschiedene Möglichkeiten, diese im Code zu generieren.
Der einfache Weg
Wenn Sie garantieren können, dass Sie nie mehr als eine feste Anzahl von Farben benötigen, generieren Sie einfach eine Reihe von Farben nach diesem Muster und verwenden Sie diese:
Der harte Weg
Wenn Sie nicht wissen, wie viele Farben Sie benötigen, generiert der folgende Code mit diesem Muster bis zu 896 Farben. (896 = 256 * 7/2) 256 ist der Farbraum pro Kanal. Wir haben 7 Muster und hören auf, bevor wir zu Farben gelangen, die nur durch einen Farbwert getrennt sind.
Ich habe diesen Code wahrscheinlich härter bearbeitet als nötig. Zuerst gibt es einen Intensitätsgenerator, der bei 255 beginnt und dann die Werte gemäß dem oben beschriebenen Muster erzeugt. Der Mustergenerator durchläuft nur die sieben Farbmuster.
quelle
int
Zähler haben möchte .Um eine Variationsliste zu implementieren, in der Ihre Farben verwendet werden, 255 nutzen Sie alle Möglichkeiten, und fügen Sie dann 0 und alle RGB-Muster mit diesen beiden Werten hinzu. Fügen Sie dann 128 und alle RGB-Kombinationen mit diesen hinzu. Dann 64. Dann 192. Etc.
In Java
Dies wird in Zukunft unendlich viele Muster dieses Typs (2 ^ 24) erzeugen. Nach ungefähr hundert Punkten werden Sie jedoch wahrscheinlich keinen großen Unterschied zwischen einer Farbe mit 0 oder 32 an der Stelle des Blaus sehen.
Möglicherweise ist es besser, dies in einen anderen Farbraum zu normalisieren. LAB-Farbraum zum Beispiel mit normalisierten und konvertierten L-, A-, B-Werten. So wird die Unterscheidbarkeit der Farbe durch etwas gedrückt, das dem menschlichen Auge ähnlicher ist.
getElement () kehrt den Endian einer 8-Bit-Zahl um und beginnt mit dem Zählen von -1 statt 0 (Maskierung mit 255). So geht es 255,0,127,192,64, ... wenn die Zahl wächst, bewegt es sich immer weniger signifikante Bits und unterteilt die Zahl.
getPattern () bestimmt, welches das wichtigste Element im Muster sein soll (es ist die Kubikwurzel). Anschließend werden die verschiedenen 3N² + 3N + 1-Muster, die dieses höchstwertige Element betreffen, aufgeschlüsselt.
Dieser Algorithmus erzeugt (erste 128 Werte):
Lesen Sie von links nach rechts, von oben nach unten. 729 Farben (9³). Also alle Muster bis zu n = 9. Sie werden die Geschwindigkeit bemerken, mit der sie zu kollidieren beginnen. Es gibt nur so viele WRGBCYMK-Variationen. Und diese Lösung ist zwar clever, macht aber im Grunde nur verschiedene Schattierungen von Primärfarben.
Ein Großteil der Zusammenstöße ist auf Grün zurückzuführen und darauf, wie ähnlich die meisten Grüns den meisten Menschen aussehen. Die Forderung, dass jeder zu Beginn maximal unterschiedlich sein muss und nicht nur so unterschiedlich, dass er nicht die gleiche Farbe hat. Und grundlegende Fehler in der Idee, die zu Primärfarbenmustern und identischen Farbtönen führen.
Durch die Verwendung der CIELab2000-Routine für Farbraum und Abstand zum zufälligen Auswählen und Ausprobieren von 10.000 verschiedenen Farben und zum Ermitteln des maximal entfernten Mindestabstands zu vorherigen Farben (so ziemlich die Definition der Anforderung) wird vermieden, dass Konflikte länger auftreten als bei der obigen Lösung:
Das könnte man einfach als statische Liste für den Easy Way bezeichnen. Es dauerte anderthalb Stunden, um 729 Einträge zu generieren:
Mit Brute Force (Testen aller 16.777.216 RGB-Farben mit CIELab Delta2000 / Beginnend mit Schwarz) wird eine Serie erstellt. Das beginnt bei ungefähr 26 zu kollidieren, könnte es aber durch visuelle Inspektion und manuelles Ablegen auf 30 oder 40 schaffen (was mit einem Computer nicht möglich ist). Wenn man also das absolute Maximum erreicht, kann man programmgesteuert nur ein paar Dutzend verschiedene Farben erzeugen. Eine diskrete Liste ist die beste Wahl. Mit einer Liste erhalten Sie mehr diskrete Farben als programmgesteuert. Der einfache Weg ist die beste Lösung. Beginnen Sie mit dem Mischen und Abgleichen mit anderen Möglichkeiten, um Ihre Daten als Farbe zu ändern.
Update: Ich habe das ungefähr einen Monat lang fortgesetzt, also bei 1024 Brute Force.
quelle
Ich habe eine Seite online gestellt, auf der prozedural visuell unterschiedliche Farben erzeugt werden können:
http://phrogz.net/css/distinct-colors.html
Im Gegensatz zu anderen Antworten hier, die gleichmäßig über den RGB- oder HSV-Raum gehen (wo eine nichtlineare Beziehung zwischen den Achsenwerten und den Wahrnehmungsunterschieden besteht ), verwendet meine Seite den Standard- CMI- Farbabstandsalgorithmus (I: c) , um zu verhindern, dass auch zwei Farben vorhanden sind optisch nah.
Auf der letzten Registerkarte der Seite können Sie die Werte auf verschiedene Arten sortieren und dann verschachteln (geordnetes Mischen), sodass Sie sehr unterschiedliche Farben nebeneinander platzieren.
Zum jetzigen Zeitpunkt funktioniert es nur in Chrome und Safari mit einem Shim für Firefox. Es verwendet Eingabeschieberegler für den HTML5-Bereich in der Benutzeroberfläche, die IE9 und Firefox nativ noch nicht unterstützen.
quelle
Ich denke, der HSV (oder HSL) Raum hat hier mehr Möglichkeiten. Wenn Ihnen die zusätzliche Konvertierung nichts ausmacht, ist es ziemlich einfach, alle Farben durch einfaches Drehen des Farbtonwerts durchzugehen. Wenn dies nicht ausreicht, können Sie die Werte für Sättigung / Wert / Helligkeit ändern und die Drehung erneut durchführen. Oder Sie können jederzeit die Farbtonwerte verschieben oder Ihren "Schritt" -Winkel ändern und mehrmals drehen.
quelle
Die vorherigen RGB-Lösungen weisen einen Fehler auf. Sie nutzen nicht den gesamten Farbraum, da sie einen Farbwert und 0 für die Kanäle verwenden:
Stattdessen sollten sie alle möglichen Farbwerte verwenden, um gemischte Farben zu erzeugen, die über die Farbkanäle hinweg bis zu 3 verschiedene Werte haben können:
Mit dem vollen Farbraum können Sie deutlichere Farben erzeugen. Wenn Sie beispielsweise 4 Werte pro Kanal haben, können 4 * 4 * 4 = 64 Farben generiert werden. Mit dem anderen Schema können nur 4 * 7 + 1 = 29 Farben erzeugt werden.
Wenn Sie N Farben möchten, ist die Anzahl der erforderlichen Werte pro Kanal wie folgt: Ceil (cube_root (N))
Damit können Sie dann die möglichen Werte (Bereich 0-255) (Python) bestimmen:
Dann können Sie die RGB-Farben durchlaufen (dies wird nicht empfohlen):
Verschachtelte Schleifen funktionieren, werden jedoch nicht empfohlen, da sie den blauen Kanal bevorzugen und die resultierenden Farben nicht genügend Rot aufweisen (N ist höchstwahrscheinlich kleiner als die Anzahl aller möglichen Farbwerte).
Sie können einen besseren Algorithmus für die Schleifen erstellen, bei denen jeder Kanal gleich behandelt wird und deutlichere Farbwerte gegenüber kleinen bevorzugt werden.
Ich habe eine Lösung, wollte sie aber nicht veröffentlichen, da sie nicht so einfach zu verstehen oder effizient ist. Sie können die Lösung jedoch anzeigen , wenn Sie dies wirklich möchten.
Hier ist ein Beispiel von 64 generierten Farben: 64 Farben
quelle
Ich brauchte die gleiche Funktionalität in einer einfachen Form.
Was ich brauchte, war, aus einem zunehmenden Indexwert so einzigartige wie möglich Farben zu erzeugen.
Hier ist der Code in C # (jede andere Sprachimplementierung sollte sehr ähnlich sein)
Der Mechanismus ist sehr einfach
Ein Muster von color_writers wird aus indexA-Werten von 0 bis 7 generiert.
Für Indizes <8 sind diese Farben = color_writer [indexA] * 255.
Für Indizes zwischen 8 und 15 sind diese Farben = color_writer [indexA] * 255 + (color_writer [indexA + 1]) * 127
Für Indizes zwischen 16 und 23 sind diese Farben = color_writer [indexA] * 255 + (color_writer [indexA + 1]) * 127 + (color_writer [indexA + 2]) * 63
Und so weiter:
Hinweis: Um zu vermeiden, dass helle und schwer sichtbare Farben erzeugt werden (in diesem Beispiel: Gelb auf weißem Hintergrund), können Sie diese mit einer rekursiven Schleife ändern:
quelle
Ich würde mit einer eingestellten Helligkeit von 100% beginnen und zuerst die Primärfarben umgehen:
FF0000, 00FF00, 0000FF
dann die Kombinationen
FFFF00, FF00FF, 00FFFF
Als nächstes halbieren Sie zum Beispiel die Helligkeit und machen Sie die gleiche Runde. Es gibt nicht zu viele wirklich klar unterscheidbare Farben, danach würde ich anfangen, die Linienbreite zu variieren und gepunktete / gestrichelte Linien usw. zu machen.
quelle
Ich habe diesen Algorithmus kürzer implementiert
quelle
Sie können sich den Farbraum auch als alle Kombinationen von drei Zahlen von 0 bis einschließlich 255 vorstellen. Dies ist die Basis-255-Darstellung einer Zahl zwischen 0 und 255 ^ 3, die drei Dezimalstellen haben muss (fügen Sie bei Bedarf am Ende Nullen hinzu.)
Um also x Farben zu generieren, berechnen Sie x Prozentsätze mit gleichmäßigem Abstand von 0 bis 100. Ermitteln Sie Zahlen, indem Sie diese Prozentsätze mit 255 ^ 3 multiplizieren, diese Zahlen in die Basis 255 konvertieren und wie zuvor erwähnt Nullen hinzufügen.
Basiskonvertierungsalgorithmus als Referenz (im Pseudocode, der C # ziemlich nahe kommt):
Möglicherweise müssen Sie auch etwas tun, um die Reichweite ein wenig zu erhöhen, um Weiß und Schwarz zu vermeiden, wenn Sie möchten. Diese Zahlen sind eigentlich keine glatte Farbskala, aber sie erzeugen separate Farben, wenn Sie nicht zu viele haben.
Diese Frage bezieht sich mehr auf die Basiskonvertierung in .NET.
quelle
für die n-te Farbe. Nur diese Art von Code würde ausreichen. Dies habe ich in meinem OpenCV-Clustering-Problem verwendet. Dadurch werden unterschiedliche Farben erstellt, wenn sich die Farbe ändert.
quelle
Falls jemand eine zufällige mittlere bis hohe dunkle Farbe für den weißen Vordergrund in C # erzeugen muss, ist hier der Code.
Sie können durch
RandomObject
Ihr eigenesRandom
Klassenobjekt ersetzen .quelle
Sie können einen zufälligen Satz Ihrer 3 255-Werte erhalten und ihn mit dem letzten Satz von 3 Werten vergleichen, um sicherzustellen, dass sie jeweils mindestens X von den alten Werten entfernt sind, bevor Sie sie verwenden.
ALT: 190, 120, 100
NEU: 180, 200, 30
Wenn X = 20, wird der neue Satz erneut regeneriert.
quelle