Matplotlib:右侧刻度隐藏特定y刻度标签无效

1 投票
2 回答
1541 浏览
提问于 2025-04-18 07:24

我正在创建一个包含2列和若干行的子图。为了把右列的刻度标签和坐标轴标签移动到右边(但仍然保持刻度线在两边),我使用了以下代码:

fig, ax = plt.subplots(4, 2, sharex=False, sharey=False)
fig.subplots_adjust(wspace=0, hspace=0)
for a in ax[:,1]:
  a.yaxis.tick_right()
  a.yaxis.set_ticks_position('both')
  a.yaxis.set_label_position('right')

然后,由于这些子图之间很紧凑(这是我想要的,我不想在图之间留任何空隙),所以上下的y轴刻度标签在图之间重叠了。我尝试使用这里描述的方法来解决这个问题(这个方法只选择视图区间内的刻度 - 更多信息请查看链接)

import matplotlib.transforms as mtransforms 
def get_major_ticks_within_view_interval(axis):
    interval = axis.get_view_interval()
    ticks_in_view_interval = []
    for tick, loc in zip(axis.get_major_ticks(), axis.get_major_locator()()):
        if mtransforms.interval_contains(interval, loc):
            ticks_in_view_interval.append(tick)
    return ticks_in_view_interval 

for i,a in enumerate(ax.ravel()):
    nplots = len(ax.ravel())
    yticks = get_major_ticks_within_view_interval(a.yaxis)
    if i != 0 and i != 1:
        yticks[-1].label.set_visible(False)
    if i != nplots-2 and i != nplots-1:
        yticks[0].label.set_visible(False)

这个方法在左列似乎效果很好,但在右列重叠的刻度仍然可见。有没有人知道为什么会这样,以及如何解决这个问题?我就是搞不明白。

2 个回答

-1

我发现,matplotlib中出现重叠问题时,通常可以通过使用以下方法来解决:

plt.tight_layout()

你试过这个方法吗?

2

我终于找到了解决办法,所以我决定把它记录下来,以防以后有人遇到同样的问题(或者我自己忘了怎么做,哈哈)。我是在偶然发现了这个页面后才明白的:http://matplotlib.org/1.3.1/users/artists.html

我之前没意识到,y轴左边和右边的标签是可以分别修改的。当我使用 yticks[0].label.set_visible(False) 时,label 只指的是左边的标签,所以右边的标签不会改变。为了修复这个问题,我把

yticks[0].label.set_visible(False)

替换成了

yticks[0].label1.set_visible(False)
yticks[0].label2.set_visible(False)

(对 yticks[-1] 也一样)。现在一切都正常了!

撰写回答