在 Matplotlib 的 documentation for
matplotlib.ticker.LogFormatter
中,指出使用参数 minor_thresholds
可以控制小刻度的标签:
如果 labelOnlyBase 为 False,这两个数字控制不为基数整数次方的刻度的标签;通常这些是小蜱虫。控制参数是轴数据范围的对数。在基数为 10 的典型情况下,它是轴跨越的十进制数,因此我们可以将其称为“numdec”。如果
,所有小刻度都将被标记。如果numdec <= all
,那么 只会标记小刻度的子集,以避免拥挤。如果all < numdec <= subset
则不会标记任何小刻度。numdec > subset
我想更改
all < numdec <= subset
时自动标记的刻度数,因为有时并不能完全避免拥挤,例如这个图
是使用 LogFormatterSciNotation 生成的,它以 LogFormatter 作为基础:
import matplotlib.ticker as ticker
ax.set_minor_formatter(ticker.LogFormatterSciNotation(base=10, minor_thresholds=(1, 0.4)))
在这种情况下,
numdec = 0.7
,我们处于这种情况all < numdec <= subset
,其中仅标记了小刻度的子集,例如三个。
有没有办法在不指定其值的情况下更改标记刻度的数量?
这似乎是硬连线的,可以将刻度数减少 2 倍,这里。
注意,这个方法(
.set_locs()
)本质上是设置Formatter实例的._sublabels
属性。该方法是自动调用的,因此我们不能自己设置 ._sublabels
来覆盖它们,但我们可以重写 .set_locs
方法来修改其行为。
在这个最小的示例中,我假设您只会在
all < numdec <= subset
为 True 时执行此操作,因此我没有考虑其他情况。为了获得更完整的解决方案,您可能需要更彻底地执行此操作。
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
# Set up a simple plot to demonstrate the behaviour
fig, ax = plt.subplots()
ax.set_xscale('log')
ax.set_xlim(.1, .8)
fmt = ticker.LogFormatterSciNotation(base=10, minor_thresholds=(1, 0.4))
def my_locs(self, locs=None):
'''
Redefine the set_locs method of the formatter
Here I've used the "locs" parameter to control the number
of tick labels; in the existing method, locs is not used.
'''
b = self._base
c = np.geomspace(1, b, int(b)//int(locs) + 1)
self._sublabels = set(np.round(c))
## Tune the number of labels you want with the locs value.
## Higher numbers = fewer labels
locs = 3
fmt.set_locs = lambda x: my_locs(fmt, locs)
ax.xaxis.set_minor_formatter(fmt)
locs=2
(相当于默认值)locs=3
locs=4