2015-09-11 4 views
10

मैं अजगर में अपने स्वयं के कस्टम रंग नक्शा बनाने के लिए चाहते हैं, मैं ऑनलाइन के कुछ उदाहरण में देखा है और उपरोक्त आदेश मैं एक रंग नक्शा मिल के साथकस्टम रंग मैप अजगर

from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.colors import LinearSegmentedColormap 

cdict1 = {'red': ((0.0, 0.0, 0.0), 
        (0.5, 0.0, 0.1), 
        (1.0, 1.0, 1.0)), 

     'green': ((0.0, 0.0, 0.0), 
        (1.0, 0.0, 0.0)), 

     'blue': ((0.0, 0.0, 1.0), 
        (0.5, 0.1, 0.0), 
        (1.0, 0.0, 0.0)) 
     } 

blue_red1 = LinearSegmentedColormap('BlueRed1', cdict1) 
plt.imshow(big,interpolation='nearest', cmap=blue_red1, aspect='auto') 
plt.colorbar() 
plt.show() 

आदेशों में पता चला जो है (लाल - काला - नीला), जहां लाल अधिकतम और नीला न्यूनतम होता है। मैं एक रंगीन नक्शा बनाना चाहता हूं जो (काला - सफेद - काला) है। क्या कोई मुझे बता सकता है कि क्या किया जाना चाहिए या कोई अन्य विधि?

उत्तर

4

आप सभी तीन घटकों को 0 और 1 दोनों पर 0 होना चाहते हैं, और सभी तीन 0.5 पर 1 होना चाहिए। तो, तुम हो:

cdict1 = {'red': ((0.0, 0.0, 0.0), # <- at 0.0, the red component is 0 
        (0.5, 1.0, 1.0), # <- at 0.5, the red component is 1 
        (1.0, 0.0, 0.0)), # <- at 1.0, the red component is 0 

     'green': ((0.0, 0.0, 0.0), # <- etc. 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)), 

     'blue': ((0.0, 0.0, 0.0), 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)) 
     } 

enter image description here

2

मैं भी रंग मैप निर्माण भ्रामक पाया है। LinearSegmentedColormap अच्छा है क्योंकि यह बहुत लचीला है, लेकिन cdict कुछ लोगों के लिए उपयोग किया जाता है।

पहला - और शायद सबसे महत्वपूर्ण बात यह है कि इस तरह से रंगमंच बनाने की बात यह है कि आप RGB colors समझते हैं। असल में, प्रत्येक रंग में 0 से 1 तक तीव्रता मान होता है, और उच्च मान उस रंग को अधिक देते हैं। आरजीबी रंगस्थान में, सफेद तीनों रंगों द्वारा 1 का प्रतिनिधित्व किया जाता है, और काला सभी तीन रंग 0 है।

दूसरी बात यह है कि इस तरह से रंगमंच बनाने के लिए सीखना महत्वपूर्ण है: हमेशा जब तक आप सरल रैखिक colormaps बनाने में सहज महसूस नहीं करते हैं, तब तक प्रत्येक टुपल के दूसरे और तीसरे मान बनाते हैं। आखिरकार आप उन मानों को रंगरूप में विचलन करने के लिए बदल सकते हैं, लेकिन यह आपको केवल तब ही भ्रमित कर देगा जब आप शुरू करेंगे।

ठीक है, इसलिए प्रत्येक ट्यूपल में पहला मान रंगमंच का 'अंश' है और इन्हें 0 से 1 तक जाना चाहिए, दूसरा और तीसरा मान उस रंग (निचले और ऊपरी सीमाओं) की तीव्रता है। तो, एक रंग मैप वह यह है कि 'काली-सफेद-काला' बनाने के लिए, आप क्या करेंगे:

cdict1 = { 
    'red': ((0.0, 0.0, 0.0), 
       (0.5, 1.0, 1.0), 
       (1.0, 0.0, 0.0)), 

    'green': ((0.0, 0.0, 0.0), 
       (0.5, 1.0, 1.0), 
       (1.0, 0.0, 0.0)), 

    'blue': ((0.0, 0.0, 0.0), 
       (0.5, 1.0, 1.0), 
       (1.0, 0.0, 0.0)), 
     } 

black_white_black = LinearSegmentedColormap('BlackWhiteBlack', cdict1) 

उदाहरण के लिए,

plt.imshow(np.arange(100).reshape(10,10), cmap=black_white_black, aspect='auto') 
plt.colorbar() 

Example Image

गुड लक!

1

cdict1 = {'red': ((0.0, 0.0, 0.0), 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)), 

     'green': ((0.0, 0.0, 0.0), 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)), 

     'blue': ((0.0, 0.0, 0.0), 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)) 
     } 

के cdict1 प्रयास करें इस शब्दकोश बताता है कि कैसे रंग अंतर्वेशित कर रहे हैं, प्रत्येक लाल-हरे-नीले घटक पर व्यक्तिगत रूप से देख। प्रत्येक घटक के लिए आप इसे 3-टुपल्स (एक्स, वाई 0, वाई 1) की एक सूची देते हैं जो निर्दिष्ट करता है कि उस घटक को कैसे विभाजित करना है, और प्रत्येक मूल्य जो आप चाहते हैं वह सूची में दो बिंदुओं के बीच अंतरित है।

इस मामले में हम काले रंग [आरजीबी = (0,0,0)] से शुरू करना चाहते हैं, डेटा रेंज के आधा रास्ते पर सफेद [आरजीबी = 1,1,1] तक बढ़ाना चाहते हैं, और फिर वापस घटना अंत में काला करने के लिए।

रंग को असाइन करने के लिए प्रत्येक मान के लिए, नक्शा पहले उस मान को इनपुट रेंज के एक अंश में परिवर्तित कर देगा ताकि उसके पास सीमा [0, 1] में कुछ हो। लाल घटक का स्तर प्राप्त करने के लिए, मानचित्र 'लाल' सूची में प्रत्येक 3-टुपल में पहले तत्व को स्कैन करेगा और आपके अंश से अधिक नहीं होने वाला सबसे बड़ा पकड़ लेगा। एक्स मान में अंतर के आधार पर आवंटित लाल स्तर को 3-टुपल के वाई 1 तत्व और अगले 3-टुपल के y0 तत्व के बीच इंटरपोल किया जाएगा।

और इसी तरह नीले और हरे रंग के घटकों के लिए।

7

इसके लायक होने के लिए, एक आसान तरीका भी है।

LinearSegmentedColormap का पूरा रूप आपको एक ही रंगरूप में "कठोर" स्टॉप और ग्रेडियेंट रखने की क्षमता देता है, इसलिए यह आवश्यक है। हालांकि, आपके द्वारा वर्णित सरल मामलों के लिए एक सुविधा निर्माता है।

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

cmap = LinearSegmentedColormap.from_list('mycmap', ['black', 'white', 'black']) 

fig, ax = plt.subplots() 
im = ax.imshow(np.random.random((10, 10)), cmap=cmap, interpolation='nearest') 
fig.colorbar(im) 
plt.show() 

enter image description here

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