51 lines
1.3 KiB
Python
Executable file
51 lines
1.3 KiB
Python
Executable file
#!/usr/bin/env python
|
|
# -*- noplot -*-
|
|
"""
|
|
Some simple functions to generate colours.
|
|
"""
|
|
import numpy as np
|
|
from matplotlib.colors import colorConverter
|
|
|
|
def pastel(colour, weight=2.4):
|
|
""" Convert colour into a nice pastel shade"""
|
|
rgb = np.asarray(colorConverter.to_rgb(colour))
|
|
# scale colour
|
|
maxc = max(rgb)
|
|
if maxc < 1.0 and maxc > 0:
|
|
# scale colour
|
|
scale = 1.0 / maxc
|
|
rgb = rgb * scale
|
|
# now decrease saturation
|
|
total = rgb.sum()
|
|
slack = 0
|
|
for x in rgb:
|
|
slack += 1.0 - x
|
|
|
|
# want to increase weight from total to weight
|
|
# pick x s.t. slack * x == weight - total
|
|
# x = (weight - total) / slack
|
|
x = (weight - total) / slack
|
|
|
|
rgb = [c + (x * (1.0-c)) for c in rgb]
|
|
|
|
return rgb
|
|
|
|
def get_colours(n):
|
|
""" Return n pastel colours. """
|
|
base = np.asarray([[1,0,0], [0,1,0], [0,0,1]])
|
|
|
|
if n <= 3:
|
|
return base[0:n]
|
|
|
|
# how many new colours to we need to insert between
|
|
# red and green and between green and blue?
|
|
needed = (((n - 3) + 1) / 2, (n - 3) / 2)
|
|
|
|
colours = []
|
|
for start in (0, 1):
|
|
for x in np.linspace(0, 1, needed[start]+2):
|
|
colours.append((base[start] * (1.0 - x)) +
|
|
(base[start+1] * x))
|
|
|
|
return [pastel(c) for c in colours[0:n]]
|
|
|