मैं matplotlib में imshow के साथ एक विशेष रंग के रूप में NaN मूल्यों की साजिश कैसे कर सकता हूं?


85

मैं डेटा को हीटमैप के रूप में प्लॉट करने के लिए matplotlib में imshow का उपयोग करने की कोशिश कर रहा हूं, लेकिन कुछ मान NaN हैं। मैं चाहूंगा कि NaNs को एक विशेष रंग के रूप में प्रदान न किया जाए जो कि कॉलोरम में नहीं पाया जाता है।

उदाहरण:

import numpy as np
import matplotlib.pyplot as plt
f = plt.figure()
ax = f.add_subplot(111)
a = np.arange(25).reshape((5,5)).astype(float)
a[3,:] = np.nan
ax.imshow(a, interpolation='nearest')
f.canvas.draw()

परिणामी छवि अप्रत्याशित रूप से सभी नीले (जेट कॉलोर्मैप में सबसे कम रंग) है। हालांकि, अगर मैं इस तरह की साजिश कर रहा हूं:

ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)

- तब मुझे कुछ बेहतर मिलता है, लेकिन NaN मानों को vmin के समान रंग दिया जाता है ... क्या कोई सुंदर तरीका है कि मैं NaN को एक विशेष रंग (जैसे: ग्रे या पारदर्शी) के साथ तैयार कर सकता हूं?


कुछ साल बाद ( matplotlib.__version__=='1.2.1'), यह एक समस्या के बिना काम करता है।
Frédéric Grosshans

जवाबों:


46

Matplotlib के नए संस्करणों के साथ, अब एक नकाबपोश सरणी का उपयोग करना आवश्यक नहीं है।

उदाहरण के लिए, आइए एक सरणी बनाएं जहां हर 7 वां मान एक NaN है:

arr = np.arange(100, dtype=float).reshape(10, 10)
arr[~(arr % 7).astype(bool)] = np.nan

हम वर्तमान कॉलमैप को संशोधित कर सकते हैं और निम्न पंक्तियों के साथ सरणी को प्लॉट कर सकते हैं:

current_cmap = matplotlib.cm.get_cmap()
current_cmap.set_bad(color='red')
plt.imshow(arr)

प्लॉट का परिणाम


क्या np.nan के बजाय 0 का उपयोग करना संभव है?
युकशिमा हक्सय

2
@yukashimahuksay: हाँ, लेकिन आपको इन मूल्यों को पूरा करने की आवश्यकता होगी। उदाहरण के लिए। arr = np.ma.array(arr, mask=(arr == 0))
आर्कटुरस बी

मुझे लगता है कि 'cmap' में 'c' पहले से ही 'current' के लिए खड़ा है, इसलिए मैं 'current_cmap' वेरिएबल को नहीं कहूंगा
T. Gwen

3
@TGwen: मुझे पूरा यकीन है कि cmap colormap के लिए खड़ा है, जो कि doc में प्रयुक्त शब्द है: matplotlib.org/api/cm_api.html#matplotlib.cm.get_cmap
Arcturus B

82

ह्म, ऐसा प्रतीत होता है कि मैं ऐसा करने के लिए एक नकाबपोश सरणी का उपयोग कर सकता हूं:

masked_array = np.ma.array (a, mask=np.isnan(a))
cmap = matplotlib.cm.jet
cmap.set_bad('white',1.)
ax.imshow(masked_array, interpolation='nearest', cmap=cmap)

यह पर्याप्त होना चाहिए, हालांकि मैं अभी भी सुझाव के लिए खुला हूं। :]


यह निश्चित रूप से चाल है। आधिकारिक डॉक्स अधिक कुछ नहीं दिखाते हैं।
अगोस

6
एक पक्ष बिंदु - मुझे लगता है कि ऐसा करने से डिफ़ॉल्ट खत्म हो जाएगा matplotlib.cm.jet, इसलिए मैं आमतौर पर एक प्रतिलिपि बनाता हूं import copy; cmap=copy.copy(matplotlib.cm.jet):। इसके अलावा, यदि आप 0-मानों को एक अलग रंग में सेट करना चाहते हैं, तो कुछ cmap._init(); cm._lut[:,0] = (1,1,1,1)काम करना चाहिए।
केफ्लेविच

3
वहाँ भी है set_overऔर set_underसीमा मूल्यों के साथ की रंग को नियंत्रित करने के। डिफ़ॉल्ट व्यवहार रंग श्रेणी के शीर्ष / तल से मेल खाता है।
ताकस्वेल

2
क्या masked_arrayआवश्यक है? यदि aNaN मान शामिल हैं (इसलिए ऐसा लगता है mask=np.isnan(a)), तो अनुकूलित नक्शे के साथ सिर्फ imshowसरणी आवश्यक रंग (सफेद) के साथ NaN- कोशिकाओं को प्रदर्शित करेगा। तो यह मेरे लिए काम करता है। क्या कोई अपवाद हैं? acmap
मैकिस्क

2
@MaciekS, डायवर्जिंग कॉलोर्मैप का उपयोग करते समय, आप नहीं चाहते कि आपके nanमूल्य और माध्य मान एक ही रंग जैसे सफेद हो।
AGS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.