This is a small python function to convert a wave length of light to its corresponding RGB color. Note that this is a crude approximation. Calculating the actual RGB representation of a specific wave length is rather tricky. You could also say it’s impossible. That’s because your computer screen can only show a limited range of light colors. So, below code should be good enough for most presentational purposes.
def wave2rgb(wave): # This is a port of javascript code from http://stackoverflow.com/a/14917481 gamma = 0.8 intensity_max = 1 if wave < 380: red, green, blue = 0, 0, 0 elif wave < 440: red = -(wave - 440) / (440 - 380) green, blue = 0, 1 elif wave < 490: red = 0 green = (wave - 440) / (490 - 440) blue = 1 elif wave < 510: red, green = 0, 1 blue = -(wave - 510) / (510 - 490) elif wave < 580: red = (wave - 510) / (580 - 510) green, blue = 1, 0 elif wave < 645: red = 1 green = -(wave - 645) / (645 - 580) blue = 0 elif wave <= 780: red, green, blue = 1, 0, 0 else: red, green, blue = 0, 0, 0 # let the intensity fall of near the vision limits if wave < 380: factor = 0 elif wave < 420: factor = 0.3 + 0.7 * (wave - 380) / (420 - 380) elif wave < 700: factor = 1 elif wave <= 780: factor = 0.3 + 0.7 * (780 - wave) / (780 - 700) else: factor = 0 def f(c): if c == 0: return 0 else: return intensity_max * pow (c * factor, gamma) return f(red), f(green), f(blue)
Below is an example code that uses this function:
import matplotlib.pyplot as p import numpy as np N = 100 image = np.zeros((5,N,3)) for i in range(0, 5): for j in range(0, N): start = 380 end = 780 wave = j * (end-start)/N + start image[i][j] = wave2rgb(wave) ax = p.axes() ax.get_yaxis().set_visible(False) p.imshow(image) p.show()
This should produce an output similar to below: