我想生成一个包含多个数组的图表网格,其正值和负值,以及对数比例,共享相同的颜色条。
我已经实现了colorbar的共享部分(使用ImageGrid和常见的max和min值),我知道在仅有正值的情况下,我可以在imshow调用上使用LogNorm()获得对数比例。但鉴于存在负值,我需要对称对数刻度的颜色条。
我已经找到了https://stackoverflow.com/a/7741317/1101750上的解决方案,但运行Yann提供的示例代码给了我非常不同的结果,清楚错误: 检查代码,我无法理解正在发生的事情。
除此之外,我发现在Matplotlib 1.2上,scale.SymmetricalLogScale.SymmetricalLogTransform要求在文档中没有解释的新参数(linscale,它查看其他变换的代码,我假设将其保留为1是一个安全的价值)。
最简单的解决方案是将LogNorm子类化吗?
答案 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)
因为1.3 matplotlib有一个SymLogNorm。 http://matplotlib.org/api/colors_api.html#matplotlib.colors.SymLogNorm