كيف يمكنني رسم القيم النانوية كون خاص مع Imshow في Matplotlib؟

StackOverflow https://stackoverflow.com/questions/2578752

  •  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)

plot result

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top