在 Matplotlib 中使用 LogFormatter 更改标记的刻度数

问题描述 投票:0回答:1

在 Matplotlib 的 documentation for

matplotlib.ticker.LogFormatter
中,指出使用参数
minor_thresholds
可以控制小刻度的标签:

如果 labelOnlyBase 为 False,这两个数字控制不为基数整数次方的刻度的标签;通常这些是小蜱虫。控制参数是轴数据范围的对数。在基数为 10 的典型情况下,它是轴跨越的十进制数,因此我们可以将其称为“numdec”。如果

numdec <= all
,所有小刻度都将被标记。如果
all < numdec <= subset
,那么 只会标记小刻度的子集,以避免拥挤。如果
numdec > subset
则不会标记任何小刻度。

我想更改

all < numdec <= subset
时自动标记的刻度数,因为有时并不能完全避免拥挤,例如这个图

Figure

是使用 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
,其中仅标记了小刻度的子集,例如三个。

有没有办法在不指定其值的情况下更改标记刻度的数量?

python matplotlib graph figure
1个回答
0
投票

这似乎是硬连线的,可以将刻度数减少 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
(相当于默认值)

enter image description here

locs=3

enter image description here

locs=4

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.