2013-02-06 27 views
35

साजिश कार्यों को पारित करने के लिए यादृच्छिक रंग कैसे उत्पन्न करें, इसका संक्षिप्त उदाहरण क्या है?matplotlib में यादृच्छिक रंग कैसे उत्पन्न करें?

मैं एक लूप के अंदर स्कैटर को बुला रहा हूं और प्रत्येक प्लॉट को एक अलग रंग चाहता हूं।

for X,Y in data: 
    scatter(X, Y, c=??) 

c: एक रंग। सी एक रंगीन प्रारूप स्ट्रिंग हो सकता है, या लम्बाई के रंग विनिर्देशों का अनुक्रम हो सकता है, या एनए संख्याओं का अनुक्रम को केपर्ग के माध्यम से निर्दिष्ट cmap और मानक का उपयोग करके रंगों में मैप किया जा सकता है (नीचे देखें)। ध्यान दें कि सी एक संख्यात्मक आरजीबी या आरजीबीए अनुक्रम नहीं होना चाहिए क्योंकि यह रंगों की एक सरणी से रंगीन होने के लिए अलग नहीं है। सी 2-डी सरणी हो सकती है जिसमें पंक्तियां आरजीबी या आरजीबीए हैं, हालांकि।

+0

बेतरतीब ढंग से चुना क्या? यदि आप सभी उपलब्ध रंगों से यादृच्छिक रूप से चुनते हैं, तो आप कुछ अलग-अलग रंगों का अजीब मिश्रण प्राप्त कर सकते हैं और कुछ अलग-अलग होने के समान ही समान हो सकते हैं। – BrenBarn

उत्तर

36
for X,Y in data: 
    scatter(X, Y, c=numpy.random.rand(3,1)) 
+7

मुझे 'c = numpy.random.rand (3,) 'का उपयोग करना पड़ा अन्यथा मुझे एक त्रुटि मिली ... – heltonbiker

+1

क्या होगा यदि साजिश के लिए तीन मूल्य हैं? –

9

जब कम से कम 9 डेटासेट:

colors = "bgrcmykw" 
color_index = 0 

for X,Y in data: 
    scatter(X,Y, c=colors[color_index]) 
    color_index += 1 
75

मैं एक पाश के अंदर बिखराव फोन कर रहा हूँ और एक अलग रंग में प्रत्येक भूखंड चाहते हैं।

उस आधार पर, और अपने जवाब पर: मुझे ऐसा लगता है कि आप वास्तव में अपने डेटासेट के लिए nअलग रंग चाहते हैं; आप अलग आरजीबी रंगों के लिए पूर्णांक सूचकांक 0, 1, ..., n-1 मानचित्र करना चाहते हैं। कुछ की तरह:

cmap = get_cmap(len(data)) 
for i, (X, Y) in enumerate(data): 
    scatter(X, Y, c=cmap(i)) 

: प्रश्न में अपने छद्म -code स्निपेट में

import matplotlib.pyplot as plt 

def get_cmap(n, name='hsv'): 
    '''Returns a function that maps each index in 0, 1, ..., n-1 to a distinct 
    RGB color; the keyword argument name must be a standard mpl colormap name.''' 
    return plt.cm.get_cmap(name, n) 

उपयोग:

mapping index to color

यहाँ यह करने के लिए समारोह है

मैंने वें उत्पन्न किया निम्न कोड के साथ मेरा उत्तर में ई आंकड़ा:

import matplotlib.pyplot as plt 

def get_cmap(n, name='hsv'): 
    '''Returns a function that maps each index in 0, 1, ..., n-1 to a distinct 
    RGB color; the keyword argument name must be a standard mpl colormap name.''' 
    return plt.cm.get_cmap(name, n) 

def main(): 
    N = 30 
    fig=plt.figure() 
    ax=fig.add_subplot(111) 
    plt.axis('scaled') 
    ax.set_xlim([ 0, N]) 
    ax.set_ylim([-0.5, 0.5]) 
    cmap = get_cmap(N) 
    for i in range(N): 
     rect = plt.Rectangle((i, -0.5), 1, 1, facecolor=cmap(i)) 
     ax.add_artist(rect) 
    ax.set_yticks([]) 
    plt.show() 

if __name__=='__main__': 
    main() 

दोनों अजगर 2.7 & matplotlib 1.5 के साथ परीक्षण किया गया, और अजगर 3.5 के साथ & matplotlib 2.0। यह उम्मीद के रूप में काम करता है।

+0

उत्तर के साथ क्या गलत है? डाउनवोट क्यों? – Ali

+1

@ user1941407 धन्यवाद! :) काश मैं जानता था कि किसी ने गुमनाम रूप से जवाब क्यों कम किया। – Ali

+3

शायद यह जटिल है – ingrid

16

@ जॉन-mee के जवाब व्याख्या, अगर आप मनमाने ढंग से लंबे समय से डेटा है, लेकिन सख्ती से अद्वितीय रंग की जरूरत नहीं है: अजगर 2 के लिए

:

:

from itertools import cycle 
cycol = cycle('bgrcmk') 

for X,Y in data: 
    scatter(X, Y, c=cycol.next()) 
अजगर 3 के लिए

from itertools import cycle 
cycol = cycle('bgrcmk') 

for X,Y in data: 
    scatter(X, Y, c=next(cycol)) 

इसका लाभ यह है कि रंगों को नियंत्रित करना आसान है और यह छोटा है।

10

कुछ समय के लिए मैं वास्तव में इस तथ्य से नाराज था कि matplotlib यादृच्छिक रंगों के साथ रंगमंच उत्पन्न नहीं करता है, क्योंकि यह विभाजन और क्लस्टरिंग कार्यों के लिए एक आम आवश्यकता है।

केवल यादृच्छिक रंग उत्पन्न करके हम कुछ ऐसे उज्ज्वल या बहुत अंधेरे से समाप्त हो सकते हैं, जिससे विज़ुअलाइज़ेशन मुश्किल हो जाता है। इसके अलावा, आमतौर पर हमें काले या काले रंग के होने वाले पहले या आखिरी रंग की आवश्यकता होती है, जो पृष्ठभूमि या आउटलेटर्स का प्रतिनिधित्व करती है। तो मैं अपने रोजमर्रा के काम

के लिए एक छोटे से समारोह लिखा गया है यहाँ यह के व्यवहार है:

:

new_cmap = rand_cmap(100, type='bright', first_color_black=True, last_color_black=False, verbose=True) Generated colormap

से तुम सिर्फ matplotlib पर अपने रंग मैप के रूप में 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)) # Generate color map for bright colors, based on hsv 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)] # Convert HSV list to RGB 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) # Generate soft pastel colors, by limiting the RGB spectrum 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) # Display colorbar 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

+0

धन्यवाद। यह बहुत उपयोगी था। – Ash

+0

आप इसे एनाकोंडा में कैसे जोड़ते हैं? – mjwrazor

4

यहाँ अली के जवाब साजिश प्रति एक अलग रंग देने का अधिक संक्षिप्त संस्करण है:

import matplotlib.pyplot as plt 

N = len(data) 
cmap = plt.cm.get_cmap("hsv", N+1) 
for i in range(N): 
    X,Y = data[i] 
    plt.scatter(X, Y, c=cmap(i)) 
1

python3 साथ काम करने के जवाब https://stackoverflow.com/a/14720445/6654512 में सुधार। कोड का वह टुकड़ा कभी-कभी 1 से अधिक संख्या उत्पन्न करता है और matplotlib एक त्रुटि फेंक देगा।

for X,Y in data: 
    scatter(X, Y, c=numpy.random.random(3)) 
0

अली की और Champitoad के जवाब के आधार पर:

आप उसी के लिए विभिन्न पट्टियाँ की कोशिश करना चाहते हैं, तो आप कुछ लाइनों में ऐसा कर सकते हैं:

cmap=plt.cm.get_cmap(plt.cm.viridis,143)

^143 से किया जा रहा

मैंने 143 को चुना है क्योंकि रंगमंच पर रंगों की पूरी श्रृंखला यहां खेलती है। आप क्या कर सकते हैं रंगमंच प्रभाव प्राप्त करने के लिए हर पुनरावृत्ति एनएच रंग नमूना है।

n=20 for i,(x,y) in enumerate(points): plt.scatter(x,y,c=cmap(n*i))

संबंधित मुद्दे