Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy imshow的色条,以0为中心,具有符号刻度_Numpy_Matplotlib - Fatal编程技术网

Numpy imshow的色条,以0为中心,具有符号刻度

Numpy imshow的色条,以0为中心,具有符号刻度,numpy,matplotlib,Numpy,Matplotlib,我想生成一个网格图,由几个数组组成,具有正值和负值,具有对数比例,共享相同的色条 我已经实现了colorbar的共享部分(使用ImageGrid和公共的最大值和最小值),并且我知道我可以在imshow调用中使用LogNorm()在只有正值的情况下获得对数刻度。但考虑到负值的存在,我需要一个对称对数刻度的色条 我已经找到了解决方案,但运行Yann提供的示例代码会得到非常不同的结果,显然是错误的: 查看代码时,我无法理解发生了什么 除此之外,我还发现在Matplotlib 1.2上,scale.Sy

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

我已经实现了colorbar的共享部分(使用ImageGrid和公共的最大值和最小值),并且我知道我可以在imshow调用中使用LogNorm()在只有正值的情况下获得对数刻度。但考虑到负值的存在,我需要一个对称对数刻度的色条

我已经找到了解决方案,但运行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

因为1.3 matplotlib有一个符号规范