对于您需要的次要刻度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')