2010-09-15 134 views
2

對於我的聚類gui,我目前對簇使用隨機顏色,因爲我不會事先知道我將結束多少個簇。Python中的顏色處理

在Python,這看起來像:

import random 
def randomColor(): 
    return (random.random(),random.random(),random.random()) 

然而,當我更新的東西,顏色改變。

所以,我贊成是有它有一個輸入參數的函數我如

def nonrandomColor(i): 
    ... 
    return color 

總是返回相同的顏色,相同的我,同時保持生成任意多種顏色的能力。

回答沒有在Python配製,它更多的總體佈局我感興趣的

+0

顯然你想要的是小便池協議的三維泛化http://blog.xkcd.com/2009/09/02/urinal-protocol-安全漏洞/,最好在HSL空間,這樣你就可以將界限放在飽和度和亮度上,以保證體面的對比度。 ...或者我正在推翻它。 – 2010-09-15 12:55:01

+0

本着超順眼的精神,對顏色使用[sub-random sequences](http://en.wikipedia.org/wiki/Low-discrepancy_sequence)應該提供一些對比。 – 2010-09-15 13:17:15

回答

2

只需設置隨機生成的索引的seed,這可能比存儲的顏色更便宜。

random.seed(i) 

注意,這將使隨機數方式比以前少了隨機的。如果這是一個問題,例如如果您的應用程序在其他地方使用隨機數字,您可能需要查看其他答案建議的緩存選項。

+0

這個伎倆。很好,只有一條線。 – Theodor 2010-09-15 12:40:10

+3

-1因爲經常設置你的隨機種子會導致你的隨機數發生器非常不隨機。如果你的程序也使用隨機數字來做其他事情,這將是一個壞主意。 – 2010-09-15 12:42:20

+0

@Jason:同意,我會添加一些詞來指出。 – unwind 2010-09-15 12:45:53

1

要存儲在字典中的顏色或列表:

colors = {} # int -> color 
def nonrandomColor(i): 
    if i not in colors: 
     colors[i] = randomColor() 
    return colors[i] 
6

一方法是使用緩存。使用defaultdict

>>> import random 
>>> def randomColor(): 
... return (random.random(),random.random(),random.random()) 
... 
>>> from collections import defaultdict 
>>> colors = defaultdict(randomColor) 
>>> colors[3] 
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264) 
>>> colors[1] 
(0.48991106537516382, 0.77039712435566876, 0.73707003166893892) 
>>> colors[3] 
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264) 
+0

將dict的前幾個條目設置爲前面易於區分的顏色(紅色,黃色,綠色,藍色)將減少用藍色,藍色,藍色和藍色線條生成圖形的機會。 – 2010-09-15 12:40:14

+0

@Jason:你的想法很有用。顏色是各種各樣的藍色陰影的風險不高,但前幾種顏色的靜態也使圖形更容易理解。 – 2010-09-15 13:16:08

-1

您可以使用i播種隨機數發生器。所以,只要種子保持不變,你就會得到相同的價值。

>>> import random 
>>> random.seed(12) 
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255) 
(121, 168, 170) 
>>> random.seed(12) 
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255) 
(121, 168, 170) 
>>> random.seed(10) 
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255) 
(146, 109, 147) 
>>> random.seed(10) 
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255) 
(146, 109, 147) 

取決於你很可能會產生的顏色的數量(即10或上百萬),高速緩存方法可能比seed()方法更好。

+0

如果可能的話,不要混淆全球種子!創建你自己的'random.Random'對象,並設置它的種子。 – JeromeJ 2015-06-20 17:22:27

1

如果你想要可重複的非碰撞顏色,那麼你可以使用類似下面的函數。它將數字分爲1,10,100,然後將它們用作顏色的RGB部分。

def color(i): 
    r = i % 10 
    g = (i//10) % 10 
    b = (i//100) % 10 
    return(r*25, g*25, b*25) 

例如:

color(1) == (25,0,0) 
color(10) == (0,25,0) 
color(999) = (225,225,255)