TL;DR
你怎么...
强制LogFormatter
对每个标签都使用科学记数法?现在它使用它的值小于0
或大于1000
。似乎并没有暴露任何set_powerlimit
我也能找到的方法。有什么方法可以做到正确或者您应该使用不同的格式化程序吗?哪一个?
获取以指数作为上标的科学记数法,就像所附的第一个图中一样,而不是像这样的东西-1e+02
? The plt.xscale('symlog')
call 也能得到正确的 x 轴,所以它看起来不像是缩放本身的限制......
当然,如果有一种更简单的方法可以通过符号日志缩放在颜色图上获得格式良好的 xticks 和标签,那就太好了。但老实说,看看颜色条文档 http://matplotlib.org/1.5.1/users/colormapnorms.html本身就展示了,我没有太大希望......:-/
从头开始...
Matplotlib 提供了一些可用于以下用途的标准化colorbar
。这在文档 http://matplotlib.org/1.5.1/users/colormapnorms.html.
其中,对数(mpl.colors.LogNorm
)效果特别好,因为它
- 将 xticks 均匀分布。
- 使用 a 格式化刻度标签好看科学计数法**。
通过它自己。一个最小的例子:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors, ticker
data = np.arange(4).reshape(-1,1)+np.arange(4).reshape(1,-1)
data = 10**(data/2.)
plt.figure(figsize=(4,3))
plt.imshow(data, interpolation="None", cmap="gray", norm=colors.LogNorm())
plt.colorbar()
plt.show()
另一方面,对称对数(matplotlib.colors.SymLogNorm
)两者都不做。这个答案 https://stackoverflow.com/a/23118662为 imshow 定义了一个包装函数,它对达到预期结果有很大帮助,但还没有完全实现。
一个对该函数进行改编的最小示例:
def imshow_symlog(arr, vmin=None, vmax=None, logthresh=5, logstep=1,
linscale=1, **kwargs):
# Adapted from https://stackoverflow.com/a/23118662
vmin = arr.min() if vmin is None else vmin
vmax = arr.max() if vmax is None else vmax
img=plt.imshow(arr,
vmin=float(vmin), vmax=float(vmax),
norm=colors.SymLogNorm(10**-logthresh, linscale=linscale),
**kwargs)
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(-logthresh, minlog+1, logstep)][::-1]
+[0.0]
+[(10**x) for x in xrange(-logthresh,maxlog+1, logstep)] )
cb=plt.colorbar(ticks=tick_locations, format=ticker.LogFormatter())
return img,cb
data2 = data - data[::-1,::-1]
plt.figure(figsize=(4,3))
img, cb = imshow_symlog(data2, interpolation="None", cmap="gray", logthresh=0)
plt.show()