numpy – 用于imshow的Colorbar,以0为中心,带有symlog标度

我想生成一个多个数组的图形网格,具有正值和负值,具有对数比例,共享相同的颜色条.

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

我已经找到了https://stackoverflow.com/a/7741317/1101750上的解决方案,但运行Yann提供的示例代码给了我非常不同的结果,清楚错误:

检查代码,我无法理解正在发生的事情.

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

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

最佳答案 我过去使用了一个非常简单的方法来做到这一点,而不需要做任何子类化. 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
点赞