Sverre Rabbelier
Sverre Rabbelier

Reputation: 1506

Generating color ranges in Python

I want to generate a list of color specifications in the form of (r, g, b) tuples, that span the entire color spectrum with as many entries as I want. So for 5 entries I would want something like:

Of course, if there are more entries than combination of 0 and 1 it should turn to use fractions, etc. What would be the best way to do this?

Upvotes: 41

Views: 88056

Answers (5)

jhrf
jhrf

Reputation: 1000

I created the following function based on kquinn's answer.

from colorsys import hsv_to_rgb
    
def get_hex_color_list(num_colors=5, saturation=1.0, value=1.0):
    hex_colors = []
    hsv_colors = [[float(x / num_colors), saturation, value] for x in range(num_colors)]
    
    for hsv in hsv_colors:
       hsv = [int(x * 255) for x in hsv_to_rgb(*hsv)]
    
       # Formatted as hexadecimal string using the ':02x' format specifier
       hex_colors.append(f"#{hsv[0]:02x}{hsv[1]:02x}{hsv[2]:02x}")
    
    return hex_colors

Upvotes: 14

momo668
momo668

Reputation: 443

However many number of colors you need and very simple.

from matplotlib import cm
n_colors = 10
colours = cm.rainbow(np.linspace(0, 1, n_colors))

Upvotes: 5

serv-inc
serv-inc

Reputation: 38297

Color palettes are interesting. Did you know that the same brightness of, say, green, is perceived more intensely than, say, red? Have a look at http://poynton.ca/PDFs/ColorFAQ.pdf. If you would like to use preconfigured palettes, have a look at seaborn's palettes:

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

Generates 3 colors from the current palette.

Upvotes: 44

ceprio
ceprio

Reputation: 393

Following the steps of kquinn's and jhrf :)

For Python 3 it can be done the following way:

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

Upvotes: 14

kquinn
kquinn

Reputation: 10750

Use the HSV/HSB/HSL color space (three names for more or less the same thing). Generate N tuples equally spread in hue space, then just convert them to RGB.

Sample code:

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)

Upvotes: 65

Related Questions