Matplotlib में एक रंगीन मानचित्र से अलग-अलग रंग प्राप्त करना


136

यदि आपके पास एक Colormap है cmap, उदाहरण के लिए:

cmap = matplotlib.cm.get_cmap('Spectral')

आप 0 और 1 के बीच से एक विशेष रंग कैसे प्राप्त कर सकते हैं, जहां 0 मानचित्र में पहला रंग है और 1 मानचित्र में अंतिम रंग है?

आदर्श रूप में, मैं ऐसा करने से मानचित्र में मध्य रंग प्राप्त करने में सक्षम होऊंगा:

>>> do_some_magic(cmap, 0.5) # Return an RGBA tuple
(0.1, 0.2, 0.3, 1.0)

जवाबों:


219

आप नीचे दिए गए कोड के साथ ऐसा कर सकते हैं, और आपके प्रश्न में कोड वास्तव में आपकी ज़रूरत के बहुत करीब था, आपको बस इतना करना होगा कि आपके पास मौजूद cmapवस्तु है।

import matplotlib

cmap = matplotlib.cm.get_cmap('Spectral')

rgba = cmap(0.5)
print(rgba) # (0.99807766255210428, 0.99923106502084169, 0.74602077638401709, 1.0)

सीमा के बाहर के मूल्यों के लिए [0.0, 1.0] यह (क्रमशः) रंग के नीचे और वापस लौटाएगा। यह, डिफ़ॉल्ट रूप से, सीमा के भीतर न्यूनतम (और अधिकतम रंग) है (इसलिए 0.0 और 1.0)। इस डिफ़ॉल्ट को cmap.set_under()और के साथ बदला जा सकता है cmap.set_over()

"विशेष" संख्या जैसे कि np.nanऔर np.infडिफ़ॉल्ट के लिए 0.0 मान का उपयोग करना है, इसे cmap.set_bad()ऊपर और नीचे के समान उपयोग करके बदला जा सकता है।

अंत में आपके लिए अपने डेटा को सामान्य करने के लिए यह आवश्यक हो सकता है कि यह सीमा के अनुरूप हो [0.0, 1.0]। यह matplotlib.colors.Normalizeनीचे दिए गए छोटे उदाहरणों में दिखाया गया है, जहां तर्कों का उपयोग किया जा सकता है vminऔर vmaxवर्णन किया जा सकता है कि क्रमशः संख्या को 0.0 और 1.0 पर मैप किया जाना चाहिए।

import matplotlib

norm = matplotlib.colors.Normalize(vmin=10.0, vmax=20.0)

print(norm(15.0)) # 0.5

एक लॉगरिदमिक नॉर्मलाइज़र ( matplotlib.colors.LogNorm ) डेटा रेंज के लिए मूल्यों की एक बड़ी रेंज के साथ भी उपलब्ध है।

( उत्तर सुधारने के तरीके के बारे में सुझाव के लिए जो किंगटन और tcaswell दोनों का धन्यवाद ।)


3
दरअसल, 0 या 1 से कम मानों के लिए यह "ओवर" या "अंडर" कलर लौटाएगा। डिफ़ॉल्ट रूप से यह colormap के निचले / शीर्ष पर रंग है, लेकिन यह परिवर्तनशील है। उदाहरण के लिए: cmap.set_under('red'); print cmap(0.0), cmap(-0.01)
जो किंगटन

हाय @ जो, सुधार के लिए धन्यवाद, मैंने अपना उत्तर संशोधित किया है :)
Ffisegydd 15

वहाँ भी है set_badजो परिभाषित करता है कि किसके लिए np.nanऔर np.infiirc में क्या है । आपको Normalizeयहां के तरीकों का भी उल्लेख करना चाहिए ।
ताकसवेल

12
बहुत उपयोगी जानकारी और पृथ्वी पर क्यों इस दस्तावेज में इसे खोजना असंभव है !?
जाप एल्डरिंग

10
इस तो किसी के लिए काम नहीं कर रहा है, और जैसा कि आप देख module 'matplotlib' has no attribute 'cm', साथ पहले दो लाइनों की जगह की कोशिशimport matplotlib.pyplot as plt; cmap = plt.cm.get_cmap('Spectral')
बेनामी

9

फ्लोट मूल्य के बजाय आरजीबीए पूर्णांक मूल्य प्राप्त करने के लिए, हम कर सकते हैं

rgba = cmap(0.5,bytes=True)

तो Ffisegydd से जवाब के आधार पर कोड को सरल बनाने के लिए, कोड इस तरह होगा:

#import colormap
from matplotlib import cm

#normalize item number values to colormap
norm = matplotlib.colors.Normalize(vmin=0, vmax=1000)

#colormap possible values = viridis, jet, spectral
rgba_color = cm.jet(norm(400),bytes=True) 

#400 is one of value between 0 and 1000

0

Ffisegydd और amaliammr के समाधानों का निर्माण करने के लिए , यहाँ एक उदाहरण है जहाँ हम कस्टम कॉलगैप के लिए CSV प्रतिनिधित्व करते हैं:

#! /usr/bin/env python3
import matplotlib
import numpy as np 

vmin = 0.1
vmax = 1000

norm = matplotlib.colors.Normalize(np.log10(vmin), np.log10(vmax))
lognum = norm(np.log10([.5, 2., 10, 40, 150,1000]))

cdict = {
    'red':
    (
        (0., 0, 0),
        (lognum[0], 0, 0),
        (lognum[1], 0, 0),
        (lognum[2], 1, 1),
        (lognum[3], 0.8, 0.8),
        (lognum[4], .7, .7),
    (lognum[5], .7, .7)
    ),
    'green':
    (
        (0., .6, .6),
        (lognum[0], 0.8, 0.8),
        (lognum[1], 1, 1),
        (lognum[2], 1, 1),
        (lognum[3], 0, 0),
        (lognum[4], 0, 0),
    (lognum[5], 0, 0)
    ),
    'blue':
    (
        (0., 0, 0),
        (lognum[0], 0, 0),
        (lognum[1], 0, 0),
        (lognum[2], 0, 0),
        (lognum[3], 0, 0),
        (lognum[4], 0, 0),
    (lognum[5], 1, 1)
    )
}


mycmap = matplotlib.colors.LinearSegmentedColormap('my_colormap', cdict, 256)   
norm = matplotlib.colors.LogNorm(vmin, vmax)
colors = {}
count = 0
step_size = 0.001
for value in np.arange(vmin, vmax+step_size, step_size):
    count += 1
    print("%d/%d %f%%" % (count, vmax*(1./step_size), 100.*count/(vmax*(1./step_size))))
    rgba = mycmap(norm(value), bytes=True)
    color = (rgba[0], rgba[1], rgba[2])
    if color not in colors.values():
        colors[value] = color

print ("value, red, green, blue")
for value in sorted(colors.keys()):
    rgb = colors[value]
    print("%s, %s, %s, %s" % (value, rgb[0], rgb[1], rgb[2]))

0

पूर्णता के लिए ये सीमैप विकल्प हैं जिनका मैंने अब तक सामना किया है:

Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2_r, Dark2_r, GnBu_r, GreensBr, Greens_r,। Greens_r .rreens ,r .rays,। PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRr_r, PuR.d.dd.dd.dd.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.r.d.r.d.r._d.r.d.r._d.r.d.r.dr.r.dr.dr.dr.dr.dr.dr.dr.dr.dr.dr.dr.dr.r आवेज़नों के प्रकार RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral_r, Wistia, Wistia_r, YlGn, YlGn, YYGGn, YYGGn_r। afmhot_r, पतझड़, पतझड़, बाइनरी, बाइनरी_र, बोन, बोन_आर, ब्रैग, brg_r, बॉर, bwr_r, cividis_r, कूल, cool_r, coolwarm_r, कॉपर_r, कॉपर_r, क्यूबेलिक्स, cubehelix_r, फ़्लैगरर, फ़्लैगर, है।gist_gray, gist_gray_r, gist_heat, gist_heat_r, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern_r, gist_yarern_r, gist_yarern_r .rup.rr.rr। jet_r, magma, magma_r, nipy_spectral, nipy_spectral_r, महासागर, oc_r, गुलाबी, गुलाबी_r, प्लाज्मा, प्लाज्मा_r, प्रिज्म, prism_r, इंद्रधनुष, इंद्रधनुष, भूकंपी, भूकंपीय, भूकंपीय, वसंत, ग्रीष्म, ग्रीष्म, ग्रीष्म, ग्रीष्म, ग्रीष्म, ग्रीष्म ऋतु। tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, twilight, twilight_r, twilight_shifted, twilight_shifted_r, viridis, viridis_r, सर्दी, सर्दियों_रग्रे_आर, हॉट, हॉट_आर, एचएसवी, एचएसवी_आर, इन्फर्नो, इनर्नो_आर, जेट, जेट_आर, मैग्मा, मैग्मा_आर, निपी_स्पेक्ट्रल, निपी_स्पेक्ट्रल_र, महासागर, सागर_र, गुलाबी, गुलाबी_र, प्लाज्मा, प्लाज्मा_स्म, प्रिज्म, जिस्म, बारिश, बारिश स्प्रिंग, स्प्रिंग_र, समर, समर_र, समर_र, tab10_r, tab20_r, tab20b, tab20b_r, tab20c_r, tab20c_r, इलाके, इलाक़ा_र, गोधूलि, गोधूलि_र, गोधूलि_शिक्षित, गोधूलि_शिफ्टेड_र, विरूद्ध, विरूद्ध।ग्रे_आर, हॉट, हॉट_आर, एचएसवी, एचएसवी_आर, इन्फर्नो, इनर्नो_आर, जेट, जेट_आर, मैग्मा, मैग्मा_आर, निपी_स्पेक्ट्रल, निपी_स्पेक्ट्रल_र, महासागर, सागर_र, गुलाबी, गुलाबी_र, प्लाज्मा, प्लाज्मा_स्म, प्रिज्म, जिस्म, बारिश, बारिश स्प्रिंग, स्प्रिंग_र, समर, समर_र, समर_र, tab10_r, tab20_r, tab20b, tab20b_r, tab20c_r, tab20c_r, इलाके, इलाक़ा_र, गोधूलि, गोधूलि_र, गोधूलि_शिक्षित, गोधूलि_शिफ्टेड_र, विरूद्ध, विरूद्ध।viridis, viridis_r, सर्दी, सर्दी_आरviridis, viridis_r, सर्दी, सर्दी_आर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.