如何在具有对数刻度和添加自定义网格线的同时以二进制显示轴

问题描述

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

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 轴并添加自定义 ticks代码完美运行,除了 ticks 以十进制显示。如下图所示。我希望它们也是二进制的。我试图修复它,但我真的不知道如何。我尝试设置 ax.set_ticks([lambda x: f"{int(x):12b}"],minor=True) 但这没有用。如果有人可以帮助我,我将不胜感激。

see picture

解决方法

对于次要刻度,您需要 Set "count=-1"。您会注意到主要和次要刻度不相同。这是由于刻度长度,可以通过 ax.yaxis.set_minor_formatter(...) 强制相等。

ax.tick_params(...,length=...)

example plot

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

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()

或者您可以更改主要和次要刻度的角色,使用 ticks = [2.001,3.001,4.001,13.001] 作为次要刻度:

LogLocator

more gridlines