कुछ समय के लिए मैं वास्तव में इस तथ्य से नाराज था कि मैटप्लोटलिब यादृच्छिक रंगों के साथ कॉलर्मैप्स उत्पन्न नहीं करता है, क्योंकि यह विभाजन और क्लस्टरिंग कार्यों के लिए एक सामान्य आवश्यकता है।
बस यादृच्छिक रंग उत्पन्न करके हम कुछ के साथ समाप्त हो सकते हैं जो बहुत उज्ज्वल या बहुत अंधेरा हैं, जिससे दृश्य मुश्किल हो जाता है। इसके अलावा, आमतौर पर हमें पहले या आखिरी रंग की आवश्यकता होती है जो काला हो, पृष्ठभूमि या आउटलेर का प्रतिनिधित्व करता है। इसलिए मैंने अपने रोजमर्रा के काम के लिए एक छोटा सा कार्य लिखा है
यहाँ इसका व्यवहार है:
new_cmap = rand_cmap(100, type='bright', first_color_black=True, last_color_black=False, verbose=True)
बस आप matplotlib पर अपने colormap के रूप में new_cmap का उपयोग करें:
ax.scatter(X,Y, c=label, cmap=new_cmap, vmin=0, vmax=num_labels)
कोड यहाँ है:
def rand_cmap(nlabels, type='bright', first_color_black=True, last_color_black=False, verbose=True):
"""
Creates a random colormap to be used together with matplotlib. Useful for segmentation tasks
:param nlabels: Number of labels (size of colormap)
:param type: 'bright' for strong colors, 'soft' for pastel colors
:param first_color_black: Option to use first color as black, True or False
:param last_color_black: Option to use last color as black, True or False
:param verbose: Prints the number of labels and shows the colormap. True or False
:return: colormap for matplotlib
"""
from matplotlib.colors import LinearSegmentedColormap
import colorsys
import numpy as np
if type not in ('bright', 'soft'):
print ('Please choose "bright" or "soft" for type')
return
if verbose:
print('Number of labels: ' + str(nlabels))
if type == 'bright':
randHSVcolors = [(np.random.uniform(low=0.0, high=1),
np.random.uniform(low=0.2, high=1),
np.random.uniform(low=0.9, high=1)) for i in xrange(nlabels)]
randRGBcolors = []
for HSVcolor in randHSVcolors:
randRGBcolors.append(colorsys.hsv_to_rgb(HSVcolor[0], HSVcolor[1], HSVcolor[2]))
if first_color_black:
randRGBcolors[0] = [0, 0, 0]
if last_color_black:
randRGBcolors[-1] = [0, 0, 0]
random_colormap = LinearSegmentedColormap.from_list('new_map', randRGBcolors, N=nlabels)
if type == 'soft':
low = 0.6
high = 0.95
randRGBcolors = [(np.random.uniform(low=low, high=high),
np.random.uniform(low=low, high=high),
np.random.uniform(low=low, high=high)) for i in xrange(nlabels)]
if first_color_black:
randRGBcolors[0] = [0, 0, 0]
if last_color_black:
randRGBcolors[-1] = [0, 0, 0]
random_colormap = LinearSegmentedColormap.from_list('new_map', randRGBcolors, N=nlabels)
if verbose:
from matplotlib import colors, colorbar
from matplotlib import pyplot as plt
fig, ax = plt.subplots(1, 1, figsize=(15, 0.5))
bounds = np.linspace(0, nlabels, nlabels + 1)
norm = colors.BoundaryNorm(bounds, nlabels)
cb = colorbar.ColorbarBase(ax, cmap=random_colormap, norm=norm, spacing='proportional', ticks=None,
boundaries=bounds, format='%1i', orientation=u'horizontal')
return random_colormap
यह भी github पर है:
https://github.com/delestro/rand_cmap