如何在matplotlib的colorbar中添加对数刻度小刻度标记?

8

我在设置带有对数刻度小刻度标记的colorbar的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')

这种解决方案的问题在于小刻度在对数空间中均匀分布:
enter image description here
我想设置图表,使得小刻度在线性空间中均匀分布,这应该会在该图上呈现出不均匀的距离。
我知道可以使用FixedFormatter手动设置小刻度标签,但如果可能的话,我将不愿意这样做,因为我将自动生成大量图表。

我猜你可以只使用“MultipleLocator”来设置次要刻度... - tacaswell
@tcaswell 为什么不使用http://matplotlib.org/api/ticker_api.html#matplotlib.ticker.LogLocator的`subs`关键字呢? - esmit
@esmit 我试过了,但是它会严重破坏色条。添加这行代码 cb.ax.set_yscale('log', xsubs=[2,3,4,5,6,7,8,9]) 会产生这个图表:http://i.imgur.com/amCHR5j.png - ngoldbaum
@tcaswell,我试图添加 cb.ax.yaxis.set_minor_locator(matplotlib.ticker.MultipleLocator(base=0.1)),但是也不起作用:http://i.imgur.com/wzlTIMx.png。看起来色标的y轴确实是线性的,范围从0到1。(我猜LogNorm()会这样做?) - ngoldbaum
我可能有时间在这个周末详细研究一下。 - tacaswell
2个回答

3

我认为自定义颜色条刻度的最佳方法是使用fig.colorbar方法的"ticks"参数,而不是尝试修改包含颜色条的轴的属性。

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

enter image description here


这将所有刻度设置为主要刻度,这意味着1)它们长度相等,2)如果您尝试更改格式化程序(cbar.formatter),则该格式化程序将导致为所有刻度绘制标签,而不仅仅是基线。 - cmeeren

1

为了记录:
来自这个回答: @JoeKington https://dev59.com/gnnZa4cB1Zd3GeqPolO4#20079644:

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

这很烦人,因为你必须手动创建刻度位置,但它似乎有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接