调整matplotlib中xticklabel的位置对x方向没有影响

时间:2018-05-17 22:15:14

标签: python matplotlib

在Python 3.6.5中使用matplotlib 2.2.2和gridspec,我为一篇包含多个子图的研究论文创建了一个巨大的图。轴对象存储在名为axes的字典中。这个词典被传递给函数adjust_xticklabels(),它应该将每个子图中的第一个xticklabel略微右对齐,最后一个xticklabel略微向左对齐,这样邻近图的xticklabel就不会妨碍彼此。该函数定义为:

def adjust_xticklabels(axes, rate = 0.1):

    for ax in axes.values():
        left, right = ax.get_xlim()                  # get boundaries
        dist = right-left                            # get distance
        xtl = ax.get_xticklabels()
        if len(xtl) > 1:
            xtl[0].set_position((left + rate*dist, 0.))   # (x, y), shift right
            xtl[-1].set_position((right - rate*dist, 0.)) # shift left

调用它无效。当然,我也用可笑的高价值尝试了它。但是,在y方向上有效,例如在设置xtl[0].set_position((0.3, 0.3))的情况下。

简单的复制:

ax = plt.subplot(111)
ax.plot(np.arange(10))
xtl = ax.get_xticklabels()
xtl[4].set_position((0.3, 0.3)) # wlog, 4 corresponds to 6

No effect in x-direction, despite specifying position as xy = (0.3, 0.3)

我花了很长时间试图弄清楚这是一个功能还是一个bug。我错过了什么或这是一个错误吗?有没有其他方法可以做同样的事情?

1 个答案:

答案 0 :(得分:2)

这是一个功能,没有错误。根据使用的自动收报机,勾选标签在抽奖时定位,以便坐在正确的位置。这可确保标签始终位于相应刻度线所在的位置。如果更改限制,移动或缩放图表,标签将始终遵循这些更改。

您通常不打算更改此位置,但您可以通过向其添加自定义转换来实现。这在中描述 Moving matplotlib xticklabels by pixel value。一般的想法是在标签上设置翻译转换。例如。将第二个标签向右翻译20个像素,

import matplotlib.transforms as mtrans
# ...
trans = mtrans.Affine2D().translate(20, 0)
label = ax.get_xticklabels()[1]
label.set_transform(label.get_transform()+trans)