示例#1
0
def MacBeth_ColorChecker_patch_plot ():
    '''MacBeth ColorChecker Chart.
    The xyz values are from Hall p. 119.  I do not know for what lighting conditions this applies.'''
    xyz_colors = []
    xyz_colors.append (colormodels.xyz_color (0.092, 0.081, 0.058))
    xyz_colors.append (colormodels.xyz_color (0.411, 0.376, 0.303))
    xyz_colors.append (colormodels.xyz_color (0.183, 0.186, 0.373))
    xyz_colors.append (colormodels.xyz_color (0.094, 0.117, 0.067))
    xyz_colors.append (colormodels.xyz_color (0.269, 0.244, 0.503))
    xyz_colors.append (colormodels.xyz_color (0.350, 0.460, 0.531))
    xyz_colors.append (colormodels.xyz_color (0.386, 0.311, 0.066))
    xyz_colors.append (colormodels.xyz_color (0.123, 0.102, 0.359))
    xyz_colors.append (colormodels.xyz_color (0.284, 0.192, 0.151))
    xyz_colors.append (colormodels.xyz_color (0.059, 0.040, 0.102))
    xyz_colors.append (colormodels.xyz_color (0.368, 0.474, 0.127))
    xyz_colors.append (colormodels.xyz_color (0.497, 0.460, 0.094))
    xyz_colors.append (colormodels.xyz_color (0.050, 0.035, 0.183))
    xyz_colors.append (colormodels.xyz_color (0.149, 0.234, 0.106))
    xyz_colors.append (colormodels.xyz_color (0.176, 0.102, 0.048))
    xyz_colors.append (colormodels.xyz_color (0.614, 0.644, 0.112))
    xyz_colors.append (colormodels.xyz_color (0.300, 0.192, 0.332))
    xyz_colors.append (colormodels.xyz_color (0.149, 0.192, 0.421))
    xyz_colors.append (colormodels.xyz_color (0.981, 1.000, 1.184))
    xyz_colors.append (colormodels.xyz_color (0.632, 0.644, 0.763))
    xyz_colors.append (colormodels.xyz_color (0.374, 0.381, 0.451))
    xyz_colors.append (colormodels.xyz_color (0.189, 0.192, 0.227))
    xyz_colors.append (colormodels.xyz_color (0.067, 0.068, 0.080))
    xyz_colors.append (colormodels.xyz_color (0.000, 0.000, 0.000))

    color_names = []
    color_names.append ('dark skin')
    color_names.append ('light skin')
    color_names.append ('blue sky')
    color_names.append ('foliage')
    color_names.append ('blue flower')
    color_names.append ('bluish green')
    color_names.append ('orange')
    color_names.append ('purplish blue')
    color_names.append ('moderate red')
    color_names.append ('purple')
    color_names.append ('yellow green')
    color_names.append ('orange yellow')
    color_names.append ('blue')
    color_names.append ('green')
    color_names.append ('red')
    color_names.append ('yellow')
    color_names.append ('magenta')
    color_names.append ('cyan')
    color_names.append ('white')
    color_names.append ('neutral 8')
    color_names.append ('neutral 6.5')
    color_names.append ('neutral 5')
    color_names.append ('neutral 3.5')
    color_names.append ('black')

    plots.xyz_patch_plot (
        xyz_colors,
        color_names,
        'MacBeth ColorChecker Chart',
        'MacBeth')
示例#2
0
def perceptually_uniform_spectral_colors():
    '''Patch plot of (nearly) perceptually equally spaced colors, covering the pure spectral lines plus purples.'''
    # TODO - This may or may not be quite right...
    # get pure colors
    xyzs = ciexyz.get_normalized_spectral_line_colors(brightness=1.0,
                                                      num_purples=200,
                                                      dwl_angstroms=1)
    (num_colors, num_columns) = xyzs.shape

    # pick these two functions for either Luv or Lab
    uniform_from_xyz = colormodels.luv_from_xyz
    xyz_from_uniform = colormodels.xyz_from_luv
    #uniform_from_xyz = colormodels.lab_from_xyz
    #xyz_from_uniform = colormodels.xyz_from_lab

    # convert colors to a nearly perceptually uniform space
    uniforms = numpy.empty((num_colors, 3))
    for i in xrange(0, num_colors):
        uniforms[i] = uniform_from_xyz(xyzs[i])
    # determine spacing
    sum_ds = 0.0
    dss = numpy.empty((num_colors, 1))
    for i in xrange(0, num_colors - 1):
        dri = uniforms[i + 1] - uniforms[i]
        dsi = math.sqrt(numpy.dot(dri, dri))
        dss[i] = dsi
        sum_ds += dsi
    # last point closes the curve
    dri = uniforms[0] - uniforms[num_colors - 1]
    dsi = math.sqrt(numpy.dot(dri, dri))
    dss[num_colors - 1] = dsi
    sum_ds += dsi
    # pick out subsamples as evenly spaced as possible
    num_samples = 160
    ds_avg = sum_ds / float(num_samples - 1)
    E_list = []
    index = 0
    count = 0
    need = 0.0
    while True:
        while need > 1.0e-10:
            need -= dss[index]
            index += 1
        E_list.append(uniforms[index])
        need += ds_avg
        count += 1
        if count >= num_samples:
            break
    # patch plot
    xyz_list = []
    for uniform in E_list:
        xyz = xyz_from_uniform(uniform)
        xyz_list.append(xyz)
    plots.xyz_patch_plot(xyz_list,
                         None,
                         'Perceptually (almost) Equally Spaced Pure Colors',
                         'PerceptuallyEqualColors',
                         num_across=20)
示例#3
0
def rayleigh_patch_plot (named_illuminant_list, title, filename):
    '''Make a patch plot of the Rayleigh scattering color for each illuminant.'''
    xyz_colors = []
    color_names = []
    for (illuminant, name) in named_illuminant_list:
        xyz = rayleigh_illuminated_color (illuminant)
        xyz_colors.append (xyz)
        color_names.append (name)
    plots.xyz_patch_plot (xyz_colors, color_names, title, filename)
示例#4
0
def rayleigh_patch_plot(named_illuminant_list, title, filename):
    '''Make a patch plot of the Rayleigh scattering color for each illuminant.'''
    xyz_colors = []
    color_names = []
    for (illuminant, name) in named_illuminant_list:
        xyz = rayleigh_illuminated_color(illuminant)
        xyz_colors.append(xyz)
        color_names.append(name)
    plots.xyz_patch_plot(xyz_colors, color_names, title, filename)
示例#5
0
def MacBeth_ColorChecker_patch_plot():
    '''MacBeth ColorChecker Chart.
    The xyz values are from Hall p. 119.  I do not know for what lighting conditions this applies.'''
    xyz_colors = []
    xyz_colors.append(colormodels.xyz_color(0.092, 0.081, 0.058))
    xyz_colors.append(colormodels.xyz_color(0.411, 0.376, 0.303))
    xyz_colors.append(colormodels.xyz_color(0.183, 0.186, 0.373))
    xyz_colors.append(colormodels.xyz_color(0.094, 0.117, 0.067))
    xyz_colors.append(colormodels.xyz_color(0.269, 0.244, 0.503))
    xyz_colors.append(colormodels.xyz_color(0.350, 0.460, 0.531))
    xyz_colors.append(colormodels.xyz_color(0.386, 0.311, 0.066))
    xyz_colors.append(colormodels.xyz_color(0.123, 0.102, 0.359))
    xyz_colors.append(colormodels.xyz_color(0.284, 0.192, 0.151))
    xyz_colors.append(colormodels.xyz_color(0.059, 0.040, 0.102))
    xyz_colors.append(colormodels.xyz_color(0.368, 0.474, 0.127))
    xyz_colors.append(colormodels.xyz_color(0.497, 0.460, 0.094))
    xyz_colors.append(colormodels.xyz_color(0.050, 0.035, 0.183))
    xyz_colors.append(colormodels.xyz_color(0.149, 0.234, 0.106))
    xyz_colors.append(colormodels.xyz_color(0.176, 0.102, 0.048))
    xyz_colors.append(colormodels.xyz_color(0.614, 0.644, 0.112))
    xyz_colors.append(colormodels.xyz_color(0.300, 0.192, 0.332))
    xyz_colors.append(colormodels.xyz_color(0.149, 0.192, 0.421))
    xyz_colors.append(colormodels.xyz_color(0.981, 1.000, 1.184))
    xyz_colors.append(colormodels.xyz_color(0.632, 0.644, 0.763))
    xyz_colors.append(colormodels.xyz_color(0.374, 0.381, 0.451))
    xyz_colors.append(colormodels.xyz_color(0.189, 0.192, 0.227))
    xyz_colors.append(colormodels.xyz_color(0.067, 0.068, 0.080))
    xyz_colors.append(colormodels.xyz_color(0.000, 0.000, 0.000))

    color_names = []
    color_names.append('dark skin')
    color_names.append('light skin')
    color_names.append('blue sky')
    color_names.append('foliage')
    color_names.append('blue flower')
    color_names.append('bluish green')
    color_names.append('orange')
    color_names.append('purplish blue')
    color_names.append('moderate red')
    color_names.append('purple')
    color_names.append('yellow green')
    color_names.append('orange yellow')
    color_names.append('blue')
    color_names.append('green')
    color_names.append('red')
    color_names.append('yellow')
    color_names.append('magenta')
    color_names.append('cyan')
    color_names.append('white')
    color_names.append('neutral 8')
    color_names.append('neutral 6.5')
    color_names.append('neutral 5')
    color_names.append('neutral 3.5')
    color_names.append('black')

    plots.xyz_patch_plot(xyz_colors, color_names, 'MacBeth ColorChecker Chart',
                         'MacBeth')
示例#6
0
def thinfilm_patch_plot(n1, n2, n3, thickness_nm_list, illuminant, title,
                        filename):
    '''Make a patch plot of the color of the film for each thickness [nm].'''
    xyz_colors = []
    for thickness_nm in thickness_nm_list:
        film = thin_film(n1, n2, n3, thickness_nm)
        xyz = film.illuminated_color(illuminant)
        xyz_colors.append(xyz)
    plots.xyz_patch_plot(xyz_colors, None, title, filename)
示例#7
0
def spectral_colors_plus_purples_patch_plot():
    '''Colors of the pure spectral lines plus purples.'''
    xyzs = ciexyz.get_normalized_spectral_line_colors(brightness=1.0,
                                                      num_purples=200,
                                                      dwl_angstroms=10)
    plots.xyz_patch_plot(xyzs,
                         None,
                         'Colors of pure spectral lines plus purples',
                         'SpectralPlusPurples',
                         num_across=20)
示例#8
0
def blackbody_patch_plot (T_list, title, filename):
    '''Draw a patch plot of blackbody colors for the given temperature range.'''
    xyz_colors = []
    color_names = []
    for Ti in T_list:
        xyz = blackbody_color (Ti)
        xyz_colors.append (xyz)
        name = '%g K' % (Ti)
        color_names.append (name)
    plots.xyz_patch_plot (xyz_colors, color_names, title, filename)
示例#9
0
def blackbody_patch_plot(T_list, title, filename):
    '''Draw a patch plot of blackbody colors for the given temperature range.'''
    xyz_colors = []
    color_names = []
    for Ti in T_list:
        xyz = blackbody_color(Ti)
        xyz_colors.append(xyz)
        name = '%g K' % (Ti)
        color_names.append(name)
    plots.xyz_patch_plot(xyz_colors, color_names, title, filename)
示例#10
0
def thinfilm_patch_plot (n1, n2, n3, thickness_nm_list, illuminant, title, filename):
    '''Make a patch plot of the color of the film for each thickness [nm].'''
    films = create_thin_films(n1, n2, n3, thickness_nm_list)
    xyz_colors = []
    labels = []
    for film in films:
        xyz = film.illuminated_color (illuminant)
        xyz_colors.append (xyz)
        label = '%.1f nm' % (film.thickness_nm)
        labels.append(label)
    plots.xyz_patch_plot (xyz_colors, labels, title, filename)
示例#11
0
def thinfilm_patch_plot(n1, n2, n3, thickness_nm_list, illuminant, title,
                        filename):
    '''Make a patch plot of the color of the film for each thickness [nm].'''
    films = create_thin_films(n1, n2, n3, thickness_nm_list)
    xyz_colors = []
    labels = []
    for film in films:
        xyz = film.illuminated_color(illuminant)
        xyz_colors.append(xyz)
        label = '%.1f nm' % (film.thickness_nm)
        labels.append(label)
    plots.xyz_patch_plot(xyz_colors, labels, title, filename)
示例#12
0
文件: misc.py 项目: Stanpol/ColorPy
def perceptually_uniform_spectral_colors ():
    '''Patch plot of (nearly) perceptually equally spaced colors, covering the pure spectral lines plus purples.'''
    # TODO - This may or may not be quite right...
    # get pure colors
    xyzs = ciexyz.get_normalized_spectral_line_colors (brightness=1.0, num_purples=200, dwl_angstroms=1)
    (num_colors, num_columns) = xyzs.shape
    
    # pick these two functions for either Luv or Lab
    uniform_from_xyz = colormodels.luv_from_xyz
    xyz_from_uniform = colormodels.xyz_from_luv
    #uniform_from_xyz = colormodels.lab_from_xyz
    #xyz_from_uniform = colormodels.xyz_from_lab
    
    # convert colors to a nearly perceptually uniform space
    uniforms = numpy.empty ((num_colors, 3))
    for i in xrange (0, num_colors):
        uniforms [i] = uniform_from_xyz (xyzs [i])
    # determine spacing
    sum_ds = 0.0
    dss = numpy.empty ((num_colors, 1))
    for i in xrange (0, num_colors-1):
        dri = uniforms [i+1] - uniforms [i]
        dsi = math.sqrt (numpy.dot (dri, dri))
        dss [i] = dsi
        sum_ds += dsi
    # last point closes the curve
    dri = uniforms [0] - uniforms [num_colors - 1]
    dsi = math.sqrt (numpy.dot (dri, dri))
    dss [num_colors - 1] = dsi
    sum_ds += dsi
    # pick out subsamples as evenly spaced as possible
    num_samples = 160
    ds_avg = sum_ds / float (num_samples - 1)
    E_list = []
    index = 0
    count = 0
    need = 0.0
    while True:
        while need > 1.0e-10:
            need -= dss [index]
            index += 1
        E_list.append (uniforms [index])
        need += ds_avg
        count += 1
        if count >= num_samples:
            break
    # patch plot
    xyz_list = []
    for uniform in E_list:
        xyz = xyz_from_uniform (uniform)
        xyz_list.append (xyz)
    plots.xyz_patch_plot (
        xyz_list, None, 'Perceptually (almost) Equally Spaced Pure Colors', 'PerceptuallyEqualColors', num_across=20)
示例#13
0
def universe_patch_plot():
    '''The average color of the universe.
    Karl Glazebrook and Ivan Baldry
        http://www.pha.jhu.edu/~kgb/cosspec/  (accessed 17 Sep 2008)
    The color of the sum of all light in the universe.
    This caused some controversy when the (correct) xyz color was incorrectly reported as light green.
    The authors also consider several other white points, here we just use the default (normally D65).'''
    # use the published chromaticity but Y=1.0
    xyz_colors = [colormodels.xyz_color_from_xyY(0.345, 0.345, 1.0)]
    color_names = ['The Universe']
    plots.xyz_patch_plot(
        xyz_colors, color_names,
        'Average Color of the Universe\nhttp://www.pha.jhu.edu/~kgb/cosspec/',
        'Universe')
示例#14
0
def universe_patch_plot ():
    '''The average color of the universe.
    Karl Glazebrook and Ivan Baldry
        http://www.pha.jhu.edu/~kgb/cosspec/  (accessed 17 Sep 2008)
    The color of the sum of all light in the universe.
    This caused some controversy when the (correct) xyz color was incorrectly reported as light green.
    The authors also consider several other white points, here we just use the default (normally D65).'''
    # use the published chromaticity but Y=1.0
    xyz_colors  = [colormodels.xyz_color_from_xyY (0.345, 0.345, 1.0)]
    color_names = ['The Universe']
    plots.xyz_patch_plot (
        xyz_colors,
        color_names,
        'Average Color of the Universe\nhttp://www.pha.jhu.edu/~kgb/cosspec/',
        'Universe')
示例#15
0
def chemical_solutions_patch_plot():
    '''Colors of some chemical solutions.
    Darren L. Williams et. al., 'Beyond lambda-max: Transforming Visible Spectra into 24-bit Color Values'.
        Journal of Chemical Education, Vol 84, No 11, Nov 2007, p1873-1877.
    A student laboratory experiment to measure the transmission spectra of some common chemical solutions,
    and determine the rgb values.'''
    xyz_colors = []
    xyz_colors.append(colormodels.xyz_color(0.360, 0.218, 0.105))
    xyz_colors.append(colormodels.xyz_color(0.458, 0.691, 0.587))
    xyz_colors.append(colormodels.xyz_color(0.445, 0.621, 1.052))
    xyz_colors.append(colormodels.xyz_color(0.742, 0.579, 0.905))
    xyz_colors.append(colormodels.xyz_color(0.949, 1.000, 1.087))
    color_names = []
    color_names.append('1 M CoCl2')
    color_names.append('1 M NiCl2')
    color_names.append('1 M CuSO4')
    color_names.append('0.005 M KMnO4')
    color_names.append('H2O')
    plots.xyz_patch_plot(
        xyz_colors, color_names,
        'Colors of some chemical solutions\nJ. Chem. Ed., Vol 84, No 11, Nov 2007, p 1873-1877.',
        'ChemSolutions')
示例#16
0
def chemical_solutions_patch_plot ():
    '''Colors of some chemical solutions.
    Darren L. Williams et. al., 'Beyond lambda-max: Transforming Visible Spectra into 24-bit Color Values'.
        Journal of Chemical Education, Vol 84, No 11, Nov 2007, p1873-1877.
    A student laboratory experiment to measure the transmission spectra of some common chemical solutions,
    and determine the rgb values.'''
    xyz_colors = []
    xyz_colors.append (colormodels.xyz_color (0.360, 0.218, 0.105))
    xyz_colors.append (colormodels.xyz_color (0.458, 0.691, 0.587))
    xyz_colors.append (colormodels.xyz_color (0.445, 0.621, 1.052))
    xyz_colors.append (colormodels.xyz_color (0.742, 0.579, 0.905))
    xyz_colors.append (colormodels.xyz_color (0.949, 1.000, 1.087))
    color_names = []
    color_names.append ('1 M CoCl2')
    color_names.append ('1 M NiCl2')
    color_names.append ('1 M CuSO4')
    color_names.append ('0.005 M KMnO4')
    color_names.append ('H2O')
    plots.xyz_patch_plot (
        xyz_colors,
        color_names,
        'Colors of some chemical solutions\nJ. Chem. Ed., Vol 84, No 11, Nov 2007, p 1873-1877.',
        'ChemSolutions')
示例#17
0
def perceptually_uniform_spectral_colors (
    brightness = 1.0,
    plot_name  = 'PerceptuallyEqualColors',
    plot_title = 'Perceptually (almost) Equally Spaced Pure Colors',
    table_name = 'percep_equal_names.txt'):
    '''Patch plot of (nearly) perceptually equally spaced colors, covering the pure spectral lines plus purples.'''
    # TODO - This may or may not be quite right...
    # get pure colors
#    xyzs = ciexyz.get_normalized_spectral_line_colors (brightness=1.0, num_purples=200, dwl_angstroms=1)
    (xyzs, names) = ciexyz.get_normalized_spectral_line_colors_annotated (brightness=brightness, num_purples=200, dwl_angstroms=1)
    (num_colors, num_columns) = xyzs.shape

    # pick these two functions for either Luv or Lab
    uniform_from_xyz = colormodels.luv_from_xyz
    xyz_from_uniform = colormodels.xyz_from_luv
    #uniform_from_xyz = colormodels.lab_from_xyz
    #xyz_from_uniform = colormodels.xyz_from_lab

    # convert colors to a nearly perceptually uniform space
    uniforms = numpy.empty ((num_colors, 3))
    for i in range (0, num_colors):
        uniforms [i] = uniform_from_xyz (xyzs [i])
    # determine spacing
    sum_ds = 0.0
    dss = numpy.empty ((num_colors, 1))
    for i in range (0, num_colors-1):
        dri = uniforms [i+1] - uniforms [i]
        dsi = math.sqrt (numpy.dot (dri, dri))
        dss [i] = dsi
        sum_ds += dsi
    # last point closes the curve
    dri = uniforms [0] - uniforms [num_colors - 1]
    dsi = math.sqrt (numpy.dot (dri, dri))
    dss [num_colors - 1] = dsi
    sum_ds += dsi
    # pick out subsamples as evenly spaced as possible
    num_samples = 160
    ds_avg = sum_ds / float (num_samples - 1)
    E_indices = []
    index = 0
    count = 0
    need = 0.0
    while True:
        while need > 1.0e-10:
            need -= dss [index]
            index += 1
        E_indices.append (index)
        need += ds_avg
        count += 1
        if count >= num_samples:
            break
    # patch plot and save names
    xyz_list = []
    fil = open (table_name, 'wt')
    fil.write ('%s\n' % plot_title)
    fil.write ('Name iRGB\n')
    fil.write ('\n')
    for index in E_indices:
        uniform_color = uniforms [index]
        uniform_xyz   = xyz_from_uniform (uniform_color)
        uniform_irgb  = colormodels.irgb_from_xyz (uniform_xyz)
        uniform_name  = names [index]
        xyz_list.append (uniform_xyz)
        fil.write ('%s %s\n' % (uniform_name, str (uniform_irgb)))
    fil.close ()
    plots.xyz_patch_plot (
        xyz_list, None, plot_title, plot_name, num_across=20)
示例#18
0
文件: misc.py 项目: ww9980/ColorPy
def perceptually_uniform_spectral_colors(
        brightness=1.0,
        plot_name='PerceptuallyEqualColors',
        plot_title='Perceptually (almost) Equally Spaced Pure Colors',
        table_name='percep_equal_names.txt'):
    '''Patch plot of (nearly) perceptually equally spaced colors, covering the pure spectral lines plus purples.'''
    # TODO - This may or may not be quite right...
    # get pure colors
    #    xyzs = ciexyz.get_normalized_spectral_line_colors (brightness=1.0, num_purples=200, dwl_angstroms=1)
    (xyzs, names) = ciexyz.get_normalized_spectral_line_colors_annotated(
        brightness=brightness, num_purples=200, dwl_angstroms=1)
    (num_colors, num_columns) = xyzs.shape

    # pick these two functions for either Luv or Lab
    uniform_from_xyz = colormodels.luv_from_xyz
    xyz_from_uniform = colormodels.xyz_from_luv
    #uniform_from_xyz = colormodels.lab_from_xyz
    #xyz_from_uniform = colormodels.xyz_from_lab

    # convert colors to a nearly perceptually uniform space
    uniforms = numpy.empty((num_colors, 3))
    for i in range(0, num_colors):
        uniforms[i] = uniform_from_xyz(xyzs[i])
    # determine spacing
    sum_ds = 0.0
    dss = numpy.empty((num_colors, 1))
    for i in range(0, num_colors - 1):
        dri = uniforms[i + 1] - uniforms[i]
        dsi = math.sqrt(numpy.dot(dri, dri))
        dss[i] = dsi
        sum_ds += dsi
    # last point closes the curve
    dri = uniforms[0] - uniforms[num_colors - 1]
    dsi = math.sqrt(numpy.dot(dri, dri))
    dss[num_colors - 1] = dsi
    sum_ds += dsi
    # pick out subsamples as evenly spaced as possible
    num_samples = 160
    ds_avg = sum_ds / float(num_samples - 1)
    E_indices = []
    index = 0
    count = 0
    need = 0.0
    while True:
        while need > 1.0e-10:
            need -= dss[index]
            index += 1
        E_indices.append(index)
        need += ds_avg
        count += 1
        if count >= num_samples:
            break
    # patch plot and save names
    xyz_list = []
    fil = open(table_name, 'wt')
    fil.write('%s\n' % plot_title)
    fil.write('Name iRGB\n')
    fil.write('\n')
    for index in E_indices:
        uniform_color = uniforms[index]
        uniform_xyz = xyz_from_uniform(uniform_color)
        uniform_irgb = colormodels.irgb_from_xyz(uniform_xyz)
        uniform_name = names[index]
        xyz_list.append(uniform_xyz)
        fil.write('%s %s\n' % (uniform_name, str(uniform_irgb)))
    fil.close()
    plots.xyz_patch_plot(xyz_list, None, plot_title, plot_name, num_across=20)
示例#19
0
def spectral_colors_plus_purples_patch_plot ():
    '''Colors of the pure spectral lines plus purples.'''
    xyzs = ciexyz.get_normalized_spectral_line_colors (brightness=1.0, num_purples=200, dwl_angstroms=10)
    plots.xyz_patch_plot (
        xyzs, None, 'Colors of pure spectral lines plus purples', 'SpectralPlusPurples', num_across=20)