在 matplotlib 中使用 SymLogNorm 标准化格式化颜色条刻度标签

2024-02-22

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)效果特别好,因为它

  1. 将 xticks 均匀分布。
  2. 使用 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()

将函数中的格式化程序更改为LogFormatterMathtext http://matplotlib.org/api/ticker_api.html#matplotlib.ticker.LogFormatterMathtext:

cb=plt.colorbar(ticks=tick_locations, format=ticker.LogFormatterMathtext())

格式化程序显然缺乏很好的(如果有的话)文档,但是这个似乎可以满足您的要求:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 matplotlib 中使用 SymLogNorm 标准化格式化颜色条刻度标签 的相关文章

随机推荐