matplotlib locator_params 或 set_major_locator 不起作用

dur*_*hit 6 python matplotlib

我正在尝试减少子图中的轴刻度数(每个轴都有不同的值,因此我无法手动设置刻度),但是诸如之类的其他答案不起作用。我创建图形的语法是标准的,如下所示:

fig = plt.figure(figsize=(7,9))
ax = fig.add_subplot(8,2,i+1) # I am plotting in a much larger loop, but I don't think there is anything wrong with the loop, because everything else (axis limits, labels, plotting itself...) works fine.
Run Code Online (Sandbox Code Playgroud)

为了减少 yticks 的数量,我尝试过

ax = plt.locator_params(nbins=4, axis='y')
Run Code Online (Sandbox Code Playgroud)

这引发了错误TypeError: set_params() got an unexpected keyword argument 'nbins'

我尝试过

ax.yaxis.set_major_locator(plt.MaxNLocator(4))
Run Code Online (Sandbox Code Playgroud)

这给出了错误AttributeError: 'NoneType' object has no attribute 'yaxis'

我不明白为什么我的子图被认为是 NoneType。我怀疑这是问题的核心,但我看到的所有示例都具有相同的结构,即

fig = plt.figure()
ax = fig.add_subplot(111)
ax.yaxis.set_major_locator(plt.MaxNLocator(4))
Run Code Online (Sandbox Code Playgroud)

它应该有效。那么为什么我的斧头是 NoneType 呢?

tmd*_*son 3

问题是这一行:

ax = plt.locator_params(nbins=4, axis='y')
Run Code Online (Sandbox Code Playgroud)

locator_params不返回Axes实例(实际上它不返回任何内容),因此在这一行中您将重新分配ax为 be None

我想你想把它改成:

ax.locator_params(nbins=4, axis='y')
Run Code Online (Sandbox Code Playgroud)

然后一切应该都可以正常工作。

  • `MaxNLocator` 不应该在对数刻度上工作,正确的。但它也不应该抛出错误,它只是不显示任何刻度线。您可以使用 LogLocator(base=10.0, subs=[1.0], numdecs=4, numticks=15)` 代替。 (3认同)