因此,我正在修改其他人的库以设置带有日志(值)的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:
另一个情节中log = False:
起初,我以为'e'被右边的标签截断了...但是在某些情节中,情况似乎并非如此。我通常得到1-2'e'...但是在只有3个色标的情况下,我看不到!
最佳答案
一个最小的例子是
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上工作。