用于imshow的Colorbar,以0为中心并具有symlog标度

时间:2012-06-21 12:59:10

标签: numpy matplotlib

我想生成一个包含多个数组的图表网格,其正值和负值,以及对数比例,共享相同的颜色条。

我已经实现了colorbar的共享部分(使用ImageGrid和常见的max和min值),我知道在仅有正值的情况下,我可以在imshow调用上使用LogNorm()获得对数比例。但鉴于存在负值,我需要对称对数刻度的颜色条。

我已经找到了https://stackoverflow.com/a/7741317/1101750上的解决方案,但运行Yann提供的示例代码给了我非常不同的结果,清楚错误: Result of Yann example 检查代码,我无法理解正在发生的事情。

除此之外,我发现在Matplotlib 1.2上,scale.SymmetricalLogScale.SymmetricalLogTransform要求在文档中没有解释的新参数(linscale,它查看其他变换的代码,我假设将其保留为1是一个安全的价值)。

最简单的解决方案是将LogNorm子类化吗?

2 个答案:

答案 0 :(得分:3)

我过去使用了一个非常简单的方法来做到这一点,而不需要做任何子类化。 matplotlib.colors.SymLogNorm提供了您需要的大部分功能,除了我发现有必要手动生成刻度标记。请注意,此解决方案使用matplotlib 1.3.0,我可能正在使用1.2中没有的功能。

def imshow_symlog(my_matrix, vmin, vmax, logthresh=5):
    img=imshow( my_matrix ,
                vmin=float(vmin), vmax=float(vmax),
                norm=matplotlib.colors.SymLogNorm(10**-logthresh) )

    maxlog=int(np.ceil( np.log10(vmax) ))
    minlog=int(np.ceil( np.log10(-vmin) ))

    #generate logarithmic ticks 
    tick_locations=([-(10**x) for x in xrange(minlog,-logthresh-1,-1)]
                    +[0.0]
                    +[(10**x) for x in xrange(-logthresh,maxlog+1)] )

    cb=colorbar(ticks=tick_locations)
    return img,cb

答案 1 :(得分:-1)