在matplotlib颜色条上如何添加对数刻度的小刻度线?

8 投票
2 回答
5299 浏览
提问于 2025-04-18 18:13

我在设置一个带有颜色条的pcolormesh图时遇到了一些麻烦,想让颜色条上有对数间隔的小刻度。

我目前做到的最接近的效果是这样的:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

xbins = np.linspace(0, 1, 50)
ybins = np.linspace(0, 1, 50)

data = np.random.random((49,49))

fig, ax = plt.subplots()

im = ax.pcolormesh(xbins, ybins, data, norm=matplotlib.colors.LogNorm())

cb = fig.colorbar(im)

cb.ax.minorticks_on()

plt.savefig('test.png')

这个方案的问题在于,小刻度在对数空间中是均匀分布的:

在这里输入图片描述

我想把图设置成小刻度在线性空间中均匀分布,这样在这个图上看起来就会是不均匀的分布。

我知道可以用FixedFormatter手动设置小刻度的标签,但如果可以的话,我更希望不这样做,因为我会自动生成很多图。

2 个回答

3

我觉得自定义颜色条的刻度最好的方法是使用fig.colorbar方法中的“ticks”参数,而不是试图去修改包含颜色条的坐标轴的属性。

from matplotlib.ticker import LogLocator
"..."
cb = fig.colorbar(im, ticks = LogLocator(subs=range(10)))       

在这里输入图片描述

1

为了后人着想:
来自这个回答:@JoeKington https://stackoverflow.com/a/20079644/230468

minorticks = p.norm(np.arange(1, 10, 2))
cb.ax.xaxis.set_ticks(minorticks, minor=True)

这挺烦人的,因为你必须手动设置刻度的位置,不过看起来是有效的。

撰写回答