因此,我正在修改其他人的库以设置带有日志(值)的cbar。我以为我可以使用LogFormatterExponent()...但它似乎随机添加了' e'它用于cbar的指数。发生了什么事?我该如何压制/解决这个问题?
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:
起初,我认为这些标签被正确的标签切断了......但是在几个地块上,情况似乎并非如此。我通常会得到1-2个......但是在一个只有3个彩条的情节中,我看不到!
答案 0 :(得分:1)
最小的例子是
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)