Matplotlib.Colors.LogNorm在保存到eps时在2D图中使用零来解决问题

时间:2014-05-27 13:51:46

标签: python svg matplotlib eps

在我的python程序中,我用imshow绘制了一些2D图形:

img=imshow(data,
           interpolation='none',
           vmin=0.0001,
           vmax=0.01,
           cmap=custom_map,
           norm=LogNorm()
           )

当我将图形保存为* .eps或* .pdf时,我在图片中得到一些奇怪的线条,其中data的值非常接近vmin

当我将图表保存为* .png或* .svg或* .jpg时,此错误不会发生。

如何避免python绘制这些奇怪的行?

enter image description here

修改 这是一个应该重现问题的最小代码。至少我一直都会得到错误......

from matplotlib.colors import LogNorm
import numpy as np
import matplotlib.pyplot as pl

A=np.array([[0.000000,0.000426],[0.000000,0.000524]], dtype=np.float)
pl.imshow(A, interpolation='none', norm=LogNorm())

pl.savefig('test.eps')
pl.savefig('test.png')

即使您不使用LogNorm()但使用np.log(A),输出中也会出现问题。

编辑2

A=np.array([[np.log(0),np.log(0),np.log(0.1),np.log(0.000426)],
        [np.log(0),np.log(0),np.log(0),np.log(0.000524)]], dtype=np.float)

问题仅发生在从np.log(0)到某些实际值的边界处,如下图所示

enter image description here

1 个答案:

答案 0 :(得分:0)

似乎这是LogNorm()的问题和数组中的零...所以坏像素应该有一个特殊的颜色值,可以手动设置。对于正在寻找答案的人:这里有一个描述:How can I plot NaN values as a special color with imshow in matplotlib?

现在更改开场帖中的代码:

cmap = matplotlib.cm.jet
cmap.set_bad('w',1.)
pl.imshow(A, interpolation='none', cmap=cmap, norm=LogNorm())

这样,eps输出是正确的 - 或者更好:正如所希望的那样。

如果还有其他想法,请将其添加到评论或答案中。

enter image description here