Fix ValueError at matplotlib.pyplot.set_cmap() with custom LinearSegmentedColormap

Question:

I’m looking for a way to use custom color map with matplotlib.pyplot. I wrote this code:

import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import matplotlib as mpl
import matplotlib.pyplot as plt

%matplotlib inline   

# color_map = mpl.cm.get_cmap('Spectral') # get builtin colormap
color_map = LinearSegmentedColormap.from_list('custom', 
                                       [(0, '#ff0000'),
                                        (1,   '#00ff00')], N=10)

x = np.array(range(10))
y = np.sin(x) 

plt.set_cmap(color_map)
plt.plot(x, y)

Here I create colormap and pass it into plt.set_cmap(color_map). After that I try to exec plt.plot(x, y). And here I get ValueError like this:

ValueError: 'custom' is not a valid value for name; supported values are 'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'turbo', 'turbo_r', 'twilight', 'twilight_r', 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'winter', 'winter_r'

There is no error with using # color_map = mpl.cm.get_cmap('Spectral') # get builtin colormap. Any ideas what’s going on?

python 3.9.12

Asked By: Denis Kislitsyn

||

Answers:

Apparently, to use the set_map method, you have got to pick a cmap identifying name, or cmap object with an identifying name, which has already been included in the list of cmap names. You include name of the custom colour map you have built, into the list using:

matplotlib.pyplot.register_cmap(cmap=cmap_object_to_register)

Hence, the correct code, which is working for me, is:

import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import matplotlib as mpl
import matplotlib.pyplot as plt

%matplotlib inline   

#color_map = mpl.cm.get_cmap('Spectral') # get builtin colormap
color_map2 = LinearSegmentedColormap.from_list('custom',
                                       [(0, '#ff0000'),
                                        (1,   '#00ff00')], N=10)

plt.register_cmap(cmap=color_map2) # register new colormap

x = np.array(range(10))
y = np.sin(x) 

plt.set_cmap(color_map2) # set colormap
plt.plot(x, y)

Equally, you can also use set_map with the colour map identifying name, like for your example, after registering and all, do:

plt.set_cmap('custom')
Answered By: Muhammed Omer
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.