1

我从这里收集了不同的代码。我的代码如下所示:

fig, ax = plt.subplots()
ax.set_yscale('log', base=2)
ax.yaxis.set_major_formatter(lambda x, pos: f"{int(x):12b}")
data = np.arange(100)
ticks = [2, 3, 4, 13]
plt.plot(data,data)
ax.set_yticks(ticks, minor=True)
ax.yaxis.grid(True, which='minor')
plt.show()

因此,目标是以对数刻度绘制,以二进制显示 y 轴并添加 custom ticks。该代码完美运行,除了ticks以十进制显示。如下图所示。我希望它们也是二进制的。我试图修复它,但我真的不知道如何修复它。我尝试设置ax.set_ticks([lambda x: f"{int(x):12b}"], minor=True),但没有奏效。如果有人可以帮助我,我将不胜感激。 看图片

4

1 回答 1

1

对于您需要的次要刻度ax.yaxis.set_minor_formatter(...)。您会注意到主要和次要刻度的对齐方式并不相同。这是由于刻度长度,可以通过 强制相等ax.tick_params(..., length=...)

from matplotlib import pyplot as plt
import numpy as np

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(15, 4))
for ax in (ax1, ax2):
    ax.set_yscale('log', base=2)
    ax.yaxis.set_major_formatter(lambda x, pos: f"{int(x):12b}")
    ax.yaxis.set_minor_formatter(lambda x, pos: f"{int(x):12b}")
    data = np.arange(100)
    ticks = [2, 3, 4, 13]
    ax.plot(data,data)
    ax.set_yticks(ticks, minor=True)
    ax.yaxis.grid(True, which='minor')
ax1.set_title('default tick lengths')
ax2.set_title('equal tick lengths')
ax2.tick_params(axis='y', which='both', length=2)
plt.show()

示例图

PS:请注意,当它们的位置非常接近主要刻度时,次要刻度会被抑制。因此,对于 2 和 4,没有可见的网格线。您可以通过稍微移动它们来解决这个问题。例如

ticks = [2.001, 3.001, 4.001, 13.001]

或者您可以更改主要和次要刻度的角色,使用LogLocator用于次要刻度:

from matplotlib.ticker import LogLocator

ax.yaxis.set_minor_locator(LogLocator(base=2))
ax.set_yticks(ticks)
ax.yaxis.grid(True, which='major')

更多网格线

于 2021-03-08T11:12:36.330 回答