Matplotlib颜色栏:某些记号显示时没有标签

2024-06-02 05:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用plr.scatter和logariphmic scale,我正在尝试向颜色栏添加一些特定的刻度值,但它似乎工作得非常随意。请参见示例:

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的整数幂,而其他数字不是,但是

enter image description here

…如果我将日志基数更改为2,我们可以看到1和2处的刻度标签,它们是2的幂,但我们也可以看到5、10和20处的标签,它们不是。15次也没有出现,但如果我尝试添加17次,效果会很好(图片上没有显示,但确实显示了)

formatter = LogFormatter(2, labelOnlyBase=False)

enter image description here

这是什么魔法?我如何让matplotlib添加我想要的标签?我可以使用

cbar.ax.set_yticklabels(['1', '2', '5', '10', '15', '20'])

但这似乎是多余的。有更好的办法吗


1条回答
网友
1楼 · 发布于 2024-06-02 05:28:51

您可以使用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

Output

相关问题 更多 >