当Z = 0时,plt.imshow(Z,norm = logNorm())给出灰色轮廓

时间:2016-12-08 12:33:49

标签: matplotlib histogram imshow

很抱歉没有图片,但此代码重现了问题:

x=np.random.randn(1000)
y=np.random.randn(1000)
h,_,_=np.histogram2d(x,y)
plt.imshow(h, norm=LogNorm(), cmap=plt.cm.Greys)

我希望从非常小的值到0值的平滑白色过渡,但似乎有一个模糊的边界我想摆脱。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

这是预期的,因为掩盖了小于或等于零的值,然后归一化正值。这可能意味着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)

histogram1

im = plt.imshow(h + np.min(h[h > 0]), norm=LogNorm(), cmap=plt.cm.Greys,
                interpolation='bilinear')
plt.colorbar(im)

enter image description here

请注意,此更改不会影响双线性插值,但可能会影响其他插值算法。为确保插值不受影响,您必须创建Normalize的自定义子类。

以上数据是使用matplotlib 2.0.0rc1 applies color mapping after interpolation制作的。如果您使用以前的版本,您将在第一个图中看到更多的工件。