Generating color ranges in Python
Question:
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:
- (0, 0, 1)
- (0, 1, 0)
- (1, 0, 0)
- (1, 0.5, 1)
- (0, 0, 0.5)
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?
Answers:
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)
I created the following function based on kquinn’s answer.
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
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
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.
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))
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:
- (0, 0, 1)
- (0, 1, 0)
- (1, 0, 0)
- (1, 0.5, 1)
- (0, 0, 0.5)
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?
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)
I created the following function based on kquinn’s answer.
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
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
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.
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))