如何在 Matplotlib 中为对数刻度轴线性 space 网格?

How to space grids linearly for log scale axis in Matplotlibs?

在 matplot lib 中,我想 space 以线性 spaced 顺序输出网格,而轴刻度是对数的。

我想要的是:

而不是:

到目前为止的代码是这样的:

ax.grid(True,  which="major", ls="-")
ax.set_yscale('log')
ax.yaxis.set_major_formatter(StrMethodFormatter('{x:.8f}'))
ax.yaxis.set_minor_formatter(StrMethodFormatter('{x:.8f}'))

您可以在所需位置明确设置主刻度。可以是简单的 ticks=[2**i for i in range(30] 或示例中更详细的刻度(这些将接近 evenly-spaced,但不完全)。可选地,数字可以用 thousands-separator 显示。对数刻度自动添加的小刻度看起来很混乱,可以去掉。

from matplotlib import pyplot as plt
import numpy as np
from matplotlib.ticker import FixedLocator, StrMethodFormatter, NullFormatter, NullLocator

fig, ax = plt.subplots()
ax.plot(np.exp(10+np.random.normal(0.01, 0.6, 1000).cumsum()))
ax.grid(True,  which="major", ls="-")
ax.set_yscale('log')
ticks = [j * k for j in (1, 1000, 1000000) for k in [3, 6, 12] + [25*2**i for i in range(7)]   ]
ax.yaxis.set_major_locator(FixedLocator(ticks))
ax.yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))
ax.yaxis.set_minor_locator(NullLocator())
#ax.yaxis.set_minor_formatter(NullFormatter())
ax.set_ylim(ymin=2)
plt.tight_layout()
plt.show()