我使用了plr.scatter和logariphmic scale,并尝试在colorbar中添加一些特定的tick值,但它似乎工作得非常随意。请参见示例:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib
from matplotlib.ticker import LogFormatter
x, y = np.meshgrid(np.linspace(0, 1, 30), np.linspace(0, 1, 30))
z = x**2 + 15*y**3 + 1.5
plt.figure(figsize=(9, 4.5))
plt.scatter(x, y, c=z, cmap=cm.jet, norm=matplotlib.colors.LogNorm(), vmin=1, vmax=20)
formatter = LogFormatter(10, labelOnlyBase=False)
cbar = plt.colorbar(ticks=[1, 2, 5, 10, 15, 20], format=formatter)
这段代码生成了所有必需的主要刻度,加上一些次要刻度,但只标记了1和10,而我需要在colorbar中看到所有数字。一开始我以为是因为1和10是10的整数次幂,其他数字不是,但是...
......如果我将对数基数改为2,我们可以看到1和2处的刻度标签,这是2的幂,但我们也可以看到5,10和20处的标签,这不是。15这次也没有出现,但如果我尝试添加17,它就起作用了(图片上没有显示,但确实如此)
formatter = LogFormatter(2, labelOnlyBase=False)
这是什么魔法,我如何让matplotlib添加 * 正是 * 我想要的标签到滴答声?我可以手动地使用
cbar.ax.set_yticklabels(['1', '2', '5', '10', '15', '20'])
但似乎是多余的有更好的办法吗?
2条答案
按热度按时间f8rj6qna1#
您可以使用
formatter
化any axis
刻度。下面是一个例子。vs3odd8k2#
LogFormatter及其子类使用
minor_thresholds
参数来决定何时隐藏非十进制刻度标签以防止过度拥挤。默认情况下,这将隐藏几乎所有非十年标签,但您可以增加它以允许显示更多标签。