[英]Matplotlib colorbar: some ticks appear without labels
我正在使用 plr.scatter 和对数刻度,并且我正在尝试向颜色条添加一些特定的刻度值,但它似乎真的很随意。 请参阅示例:
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,而我需要在颜色栏中看到所有数字。 起初我虽然是因为 1 和 10 是 integer 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'])
但这似乎是多余的。 有没有更好的办法?
您可以使用formatter
any axis
刻度。 下面是示例。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib
from matplotlib.colors import LogNorm
x, y = np.meshgrid(np.linspace(0, 1, 30), np.linspace(0, 1, 30))
z = x**2 + 15*y**3 + 1.5
f, ax = plt.subplots(figsize=(9, 4.5))
p = plt.scatter(x, y, c=z, cmap=cm.jet, norm=LogNorm(vmin=1, vmax=20) )
v1 = np.linspace(z.min(), z.max(), 8, endpoint=True)
cbar=plt.colorbar(ticks=v1)
cbar.ax.set_yticklabels(["{:4.2f}".format(i) for i in v1]) # add the labels
LogFormatter及其子类使用minor_thresholds
参数来决定何时隐藏非十年刻度标签以防止过度拥挤。 默认情况下,这将隐藏几乎所有非十年标签,但您可以增加它以允许出现更多标签。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LogFormatter
from matplotlib.colors import LogNorm
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))
cnorm = LogNorm(vmin=1, vmax=20)
plt.scatter(x, y, c=z, cmap=cm.jet, norm=cnorm)
# define minor_thresholds to be >= the range of the color scale
decades = np.ceil(np.log10(cnorm.vmax / cnorm.vmin))
formatter = LogFormatter(10, minor_thresholds=(decades, decades))
cbar = plt.colorbar(ticks=[1, 2, 5, 10, 15, 20], format=formatter)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.