Matplotlib:右侧刻度隐藏特定y刻度标签无效
我正在创建一个包含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]
也一样)。现在一切都正常了!