مشاكل مع الأصفار في matplotlib.colors.LogNorm
-
13-11-2019 - |
سؤال
أنا أرسم رسمًا بيانيًا باستخدام
plt.imshow(hist2d, norm = LogNorm(), cmap = gray)
أين hist2d
هي مصفوفة من قيم الرسم البياني.هذا يعمل بشكل جيد باستثناء العناصر الموجودة في hist2d
التي هي صفر.على وجه الخصوص، أحصل على الصورة التالية
ولكن أود أن تكون البقع البيضاء سوداء.
شكرًا لك!
المحلول
إليك طريقة بديلة لا تتطلب منك العبث ببياناتك عن طريق تعيين قيمة rgb لوحدات البكسل السيئة.
import copy
data = np.arange(25).reshape((5,5))
my_cmap = copy.copy(matplotlib.cm.get_cmap('gray')) # copy the default cmap
my_cmap.set_bad((0,0,0))
plt.imshow(data,
norm=matplotlib.colors.LogNorm(),
interpolation='nearest',
cmap=my_cmap)
المشكلة هي أن الصناديق مع 0
لا يمكن تسجيل الدخول بشكل صحيح، لذلك يتم وضع علامة عليها على أنها "سيئة"، والتي يتم تعيينها بشكل مختلف.السلوك الافتراضي هو عدم رسم أي شيء على تلك البكسلات.يمكنك أيضًا تحديد اللون الذي تريد رسم وحدات البكسل الموجودة فوق أو تحت حدود خريطة الألوان (اللون الافتراضي هو رسمها باللون الأعلى/الأدنى).
نصائح أخرى
إذا كنت راضيًا عن مقياس اللون كما هو، وتريد ببساطة أن تكون القيم 0 سوداء، فسأقوم ببساطة بتغيير مصفوفة الإدخال بحيث يتم استبدال الأصفار بالقيمة الأصغر التالية:
import matplotlib.pyplot as plt
import matplotlib.cm, matplotlib.colors
import numpy
hist2d = numpy.arange(9).reshape(3,3)
plt.imshow(numpy.maximum(hist2d, sorted(hist2d.flat)[1]),
interpolation='nearest',
norm = matplotlib.colors.LogNorm(),
cmap = matplotlib.cm.gray)
ينتج عنه
mimimum picture">
هل تم إنشاء هذا باستخدام وظيفة matplotlib hist2d؟
كل ما عليك فعله هو المرور عبر المصفوفة وتعيين قيمة أرضية اعتباطية، ثم التأكد من رسمها بحدود ثابتة
for f in hist2d:
f += 1e-3
ثم عند إظهار الشكل، ستكون كل المسافات البيضاء الآن عند قيمة الأرضية، وستظهر على المخطط اللوغاريتمي الطبيعي.ومع ذلك، إذا كنت تسمح لـ hist2d باختيار المقياس تلقائيًا، فسوف يحتاج إلى استخدام قيمة الحد الأدنى 1e-3 كحد أدنى.لتجنب ذلك، تحتاج إلى تعيين قيم vmin وvmax في hist2d
hist2d(x,y,bins=40, norm=LogNorm(), vmin=1, vmax=1e4)