因此,我正在修改其他人的库以设置带有日志(值)的cbar。我以为我可以使用LogFormatterExponent()...但它似乎是在cbar的指数中随机添加和'e'的。这是怎么回事?如何抑制/修复此问题?


    if show_cbar:
        if log:
            l_f = LogFormatterExponent()
        else:
            l_f = ScalarFormatter()
        if qtytitle is not None:
            plt.colorbar(ims,format=l_f).set_label(qtytitle)
        else:
            plt.colorbar(ims,format=l_f).set_label(units)



这是我看到的log = True:

python - matplotlib LogFormatterExponent — cbar的指数标签中的“e”-LMLPHP

另一个情节中log = False:

python - matplotlib LogFormatterExponent — cbar的指数标签中的“e”-LMLPHP

起初,我以为'e'被右边的标签截断了...但是在某些情节中,情况似乎并非如此。我通常得到1-2'e'...但是在只有3个色标的情况下,我看不到!

python - matplotlib LogFormatterExponent — cbar的指数标签中的“e”-LMLPHP

最佳答案

一个最小的例子是

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as cm
import matplotlib.ticker as ct

data = np.exp(np.random.rand(20, 20) * 100)


fig, ax = plt.subplots()
log_norm = cm.LogNorm()

im = ax.imshow(data, interpolation='nearest', cmap='viridis', norm=log_norm)
fig.colorbar(im, format=ct.LogFormatterExponent())


这看起来像是mpl中的错误。如果您已经拥有一个大型库,那么我将只包括固定版本的格式化程序。

class LogFormatterExponentFixed(LogFormatter):
    """
    Format values for log axis; using ``exponent = log_base(value)``
    """

    def __call__(self, x, pos=None):
        """Return the format for tick val *x* at position *pos*"""

        vmin, vmax = self.axis.get_view_interval()
        vmin, vmax = mtransforms.nonsingular(vmin, vmax, expander=0.05)
        d = abs(vmax - vmin)
        b = self._base
        if x == 0:
            return '0'
        sign = np.sign(x)
        # only label the decades
        fx = math.log(abs(x)) / math.log(b)
        isDecade = is_close_to_int(fx)
        if not isDecade and self.labelOnlyBase:
            s = ''
        elif abs(fx) > 10000:
            s = '%1.0g' % fx
        elif abs(fx) < 1:
            s = '%1.0g' % fx
        else:
            # this is the added line
            fd = math.log(abs(d)) / math.log(b)
            s = self.pprint_val(fx, fd)
        if sign == -1:
            s = '-%s' % s

        return self.fix_minus(s)


fix for upstream上工作。

10-04 15:28