كيف يمكنني رسم القيم النانوية كون خاص مع Imshow في Matplotlib؟
-
24-09-2019 - |
سؤال
أحاول استخدام imshow في matplotlib لرسم البيانات كخريطة حرارية ، ولكن بعض القيم غير قاتلة. أود أن يتم تقديم NANS كون خاص غير موجود في Colormap.
مثال:
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()
الصورة الناتجة هي كلها بشكل غير متوقع (أدنى لون في طائرة Colormap). ومع ذلك ، إذا قمت بالتخطيط مثل هذا:
ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)
-ثم أحصل على شيء أفضل ، لكن قيم NAN يتم رسمها بنفس اللون مثل VMin ... هل هناك طريقة رشيقة يمكنني ضبطها على أن يتم رسمها بلون خاص (على سبيل المثال: رمادي أم شفاف)؟
المحلول
HRM ، يبدو أنه يمكنني استخدام صفيف مقنع للقيام بذلك:
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)
هذا يجب أن يكون كافيا ، على الرغم من أنني ما زلت منفتحا على الاقتراحات. :
نصائح أخرى
مع إصدارات أحدث من Matplotlib ، ليس من الضروري استخدام صفيف مقنع بعد الآن.
على سبيل المثال ، دعنا ننشئ صفيفًا حيث تكون كل قيمة سبع نان:
arr = np.arange(100, dtype=float).reshape(10, 10)
arr[~(arr % 7).astype(bool)] = np.nan
يمكننا تعديل colormap الحالي ورسم المصفوفة مع الأسطر التالية:
current_cmap = matplotlib.cm.get_cmap()
current_cmap.set_bad(color='red')
plt.imshow(arr)