কীভাবে আমি ম্যাটপ্লোটিলেব-এ ইশো সহ একটি বিশেষ রঙ হিসাবে এনএএন মানগুলিকে প্লট করতে পারি?


85

আমি হিটম্যাপ হিসাবে ডেটা প্লট করতে ম্যাটপ্ল্লোলিব-এ ইমশো ব্যবহার করার চেষ্টা করছি, তবে কিছু মান হ'ল এনএনএস। আমি চাই যে ন্যানগুলি একটি বিশেষ রঙ হিসাবে রেন্ডার করা হোক যা রঙিনম্যাপে পাওয়া যায় নি।

উদাহরণ:

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)

- তারপরে আমি আরও ভাল কিছু পেয়েছি, তবে এনএএনএন মানগুলি ভিমনের মতো একই রঙে আঁকা ... এমন কোনও চমত্কার উপায় আছে যে আমি কোনও বিশেষ রঙ (যেমন: ধূসর বা স্বচ্ছ) দিয়ে ন্যানকে আঁকতে সেট করতে পারি?


কয়েক বছর পরে ( matplotlib.__version__=='1.2.1'), এটি কোনও সমস্যা ছাড়াই কাজ করে।
— ফ্রেডেরিক গ্রোহানস

উত্তর:


47

ম্যাটপ্লটলিবের নতুন সংস্করণগুলির সাথে, আর কোনও মুখোশযুক্ত অ্যারে ব্যবহার করার প্রয়োজন নেই।

উদাহরণস্বরূপ, আসুন এমন একটি অ্যারে তৈরি করি যেখানে প্রতি 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 ব্যবহার করা কি সম্ভব?
— ইউকশিমা হুকসে

4
@ ইউকাশিমাহক্সে: হ্যাঁ, তবে আপনাকে এই মানগুলিকে মুখোশ করা দরকার। যেমন arr = np.ma.array(arr, mask=(arr == 0))।
— আর্কটরাস বি

আমার মনে হয় 'cmap' এর 'সি' ইতিমধ্যে 'কারেন্ট' এর জন্য দাঁড়িয়েছে, তাই আমি ভেরিয়েবলটিকে 'কারেন্ট_ক্যাম্যাপ' বলব না
— টি

4
@ টিজওয়েন: আমি নিশ্চিত যে সিএমএপ রঙিন ম্যাপের জন্য দাঁড়িয়েছে, এটি ডকটিতে ব্যবহৃত শব্দ: matplotlib.org/api/cm_api.html#matplotlib.cm.get_cmap
— আর্কটরাস বি

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)কাজ করা উচিত।
— কেফলাভিচ

4
রয়েছে set_overএবং set_underপরিসীমা মান আউট এর রং নিয়ন্ত্রন করতে পারেন। ডিফল্ট আচরণটি হ'ল রঙের ব্যাপ্তির উপরের / নীচে মেলে।
— টাকাসওয়েল

4
masked_arrayআদৌ কি প্রয়োজনীয়? যদি aনাএন মান থাকে (সুতরাং এটি যেমন মনে হয় mask=np.isnan(a)), তবে কাস্টমাইজড মানচিত্রে imshowঅ্যারে -সারণি প্রয়োজনীয় রঙের (সাদা) ন্যান-কোষ প্রদর্শন করবে। সুতরাং এটি আমার জন্য কাজ করে। কোন ব্যতিক্রম আছে? acmap
— ম্যাকিকস

4
@ ম্যাসিকস, যখন ডাইভারজিং কালারম্যাপ ব্যবহার করার সময় আপনি চান না যে আপনার nanমান এবং মধ্যমানের মান একই রঙের জন্য তৈরি করা হবে যেমন সাদা।
— এজিএস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.