具有子图的MultipleLocator()的奇怪行为

时间:2014-07-14 18:35:44

标签: python matplotlib

我遇到了这段代码的问题:

import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

majorLocator   = MultipleLocator(0.1)
majorFormatter = FormatStrFormatter('%2.1f')

fig = plt.figure()
axes = []

for i in range(4):
    axes.append(fig.add_subplot(2,2,i+1))

for ax in axes:
    ax.yaxis.set_major_locator(majorLocator)
    ax.yaxis.set_major_formatter(majorFormatter)
    ax.set_ylim(0,1)

axes[-1].set_ylim(1,2) #If you comment this line all works fine.

plt.show()

在我的屏幕中出现刻度问题。

enter image description here

但是,如果我对axes[-1].set_ylim(1,2)行进行评论,则所有刻度都会正确显示。这是一个错误吗?或者我做错了?

(matplotlib'1.3.0')

1 个答案:

答案 0 :(得分:2)

这是因为您在多个y轴对象之间共享相同的定位器对象。

这不是一个错误,但它是一个微妙的问题,可能会导致很多混乱。文档可能更清楚这一点,但定位器应该属于单个axis

你实际上可以共享相同的Formatter个实例,但最好不要这样做,除非你知道这些后果(对一个的更改会影响所有)。

不是回收相同的LocatorFormatter实例,而是为每个轴创建新的实例:

import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

fig, axes = plt.subplots(2, 2)
for ax in axes.flat:
    ax.yaxis.set(major_locator=MultipleLocator(0.1),
                 major_formatter=FormatStrFormatter('%2.1f'))
    ax.set_ylim(0, 1)

axes[-1, -1].set_ylim(1, 2)

plt.show()

enter image description here