Matplotlib颜色条:某些刻度显示时不带标签

snz8szmq  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(173)

我使用了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'])

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

f8rj6qna

f8rj6qna1#

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

vs3odd8k

vs3odd8k2#

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

cnorm = LogNorm(vmin=1, vmax=20)
plt.figure(figsize=(9, 4.5))
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)

相关问题