Reputation: 1506
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
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
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
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
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
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