Этого следует ожидать, потому что значения, меньшие или равные нулю, маскируются, а затем нормализуются положительные значения. Это может означать, что LogNorm
не самый лучший вариант для вас, но если вы настаиваете на его использовании, вы можете попробовать добавить минимальное положительное значение к гистограмме. В вашем случае это будет 1, но давайте сделаем это более общим для, скажем, нормированных гистограмм.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
x = np.random.randn(1000)
y = np.random.randn(1000)
h, _, _ = np.histogram2d(x, y)
im = plt.imshow(h, norm=LogNorm(), cmap=plt.cm.Greys,
interpolation='bilinear')
plt.colorbar(im)
im = plt.imshow(h + np.min(h[h > 0]), norm=LogNorm(), cmap=plt.cm.Greys,
interpolation='bilinear')
plt.colorbar(im)
Обратите внимание, что это изменение не повлияет билинейной интерполяции, но может влиять на другие алгоритмы интерполяции. Чтобы гарантировать, что интерполяция не будет затронута, вам придется создать собственный подкласс Normalize
.
Вышеуказанные рисунки были сделаны с использованием matplotlib 2.0.0rc1, который applies color mapping after interpolation. Если вы используете предыдущую версию, вы увидите еще больше артефактов на первом рисунке.
Хм. То, что у вас на первом снимке, было бы неплохо, но это не то, что у меня есть. Невозможно загрузить изображения с работы, но на границе между замаскированными и незамасленными ячейками есть темно-серая линия, что делает весь график неясным, особенно с небольшими ящиками. –
@ DanielForsman Я обновил ответ, чтобы объяснить, почему то, что вы видите, еще хуже. – Goyo