2009-05-18 18 views
16

Deseo generar una lista de especificaciones de color en forma de (r, g, b) tuplas, que abarquen todo el espectro de colores con tantas entradas como desee. Así durante 5 entradas que me gustaría algo así como:Generación de rangos de color en Python

  • (0, 0, 1)
  • (0, 1, 0)
  • (1, 0, 0)
  • (1, 0,5 , 1)
  • (0, 0, 0,5)

Por supuesto, si hay más entradas que la combinación de 0 y 1 se debe a su vez a usar fracciones, etc. ¿Cuál sería la mejor manera de hacerlo ¿esta?

Respuesta

38

Utilice el espacio de color HSV/HSB/HSL (tres nombres para más o menos lo mismo). Genere N tuplas igualmente distribuidas en el espacio de hue, luego simplemente conviértalas a RGB.

Código de ejemplo:

import colorsys 
N = 5 
HSV_tuples = [(x*1.0/N, 0.5, 0.5) for x in range(N)] 
RGB_tuples = map(lambda x: colorsys.hsv_to_rgb(*x), HSV_tuples) 
+0

Correcto, eso es lo que quiero, pero ¿cómo puedo generar esas tuplas? :) –

+3

Fácil, eso es solo una serie lineal simple. He incluido un código de muestra básico arriba, como una forma de hacerlo. – kquinn

+1

Genial, luego uso colorsys.hsv_to_rgb obtengo exactamente lo que necesito :). [colorsys.hsv_to_rgb (x * 1.0/N, 0.5, 0.5) para x en el rango (N)]. –

7

he creado la siguiente función en base a kquinn's respuesta.

import colorsys 

def get_N_HexCol(N=5): 

    HSV_tuples = [(x*1.0/N, 0.5, 0.5) for x in xrange(N)] 
    hex_out = [] 
    for rgb in HSV_tuples: 
     rgb = map(lambda x: int(x*255),colorsys.hsv_to_rgb(*rgb)) 
     hex_out.append("".join(map(lambda x: chr(x).encode('hex'),rgb))) 
    return hex_out 
+0

Estaba buscando esto (y). Pero en mi caso no había mucha luz después de ver agregarlos para formar un espectro. El resultado es el siguiente [Spectrum] (https://postimg.org/image/qspiz6c4h/) Necesito tener más brillo. – ln2khanal

+0

El espacio hsv es tono, saturación, valor, por lo que una saturación más cercana a 1 hará que los colores sean más fuertes y un valor más cercano a 1 aumentará el brillo. –

+0

¿Alguien sabe la mejor manera de actualizar esto a Py3? Algo así como: 'hex_out.append (" ". Join (list (map (lambda x: chr (x) [2:], rgb))))' – kuanb

2

Siguiendo los pasos de la kquinn y jhrf :)

Para Python 3 se puede hacer de la siguiente manera:

def get_N_HexCol(N=5): 
    HSV_tuples = [(x * 1.0/N, 0.5, 0.5) for x in range(N)] 
    hex_out = [] 
    for rgb in HSV_tuples: 
     rgb = map(lambda x: int(x * 255), colorsys.hsv_to_rgb(*rgb)) 
     hex_out.append('#%02x%02x%02x' % tuple(rgb)) 
    return hex_out 
0

Paletas de colores son interesantes. ¿Sabía que el mismo brillo de, por ejemplo, verde, se percibe más intensamente que, por ejemplo, el rojo? Eche un vistazo al http://poynton.ca/PDFs/ColorFAQ.pdf. Si desea utilizar paletas preconfigurados, echar un vistazo a seaborn's palettes:

import seaborn as sns 
palette = sns.color_palette(None, 3) 

Genera 3 colores de la paleta actual.

Cuestiones relacionadas