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


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.