Matplotlib共享X轴,但不显示两个轴的刻度标签,只显示一个。

107

我正在使用Python + Matplotlib,我有两个图表需要共享一个轴。如果你尝试在共享轴的情况下设置graph1.set_xticklabels([]),它将没有效果,因为它是被共享的。是否有一种方法可以共享轴并且能够隐藏一个图表的 x 轴?

5个回答

139

当使用共享轴时,这是一个常见的陷阱。

幸运的是,有一个简单的解决方法:使用 plt.setp(ax.get_xticklabels(), visible=False) 使标签在一个轴上不可见。

这等同于 [label.set_visible(False) for label in ax.get_xticklabels()],无论如何都可以使用。 setp 将自动操作 matplotlib 对象的可迭代集合,以及单个对象。

例如:

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(range(10), 'b-')

ax2 = fig.add_subplot(2,1,2, sharex=ax1)
ax2.plot(range(10), 'r-')

plt.setp(ax1.get_xticklabels(), visible=False)

plt.show()

alt text


11
我遇到了相反的问题:第二个子图上的标签没有显示。因此我像这样使用了你的命令:plt.setp(ax2.get_yticklabels(), visible=True)。结果完美无瑕。 - n1000

62

根据 matplotlib-users 的一个帖子,你可以使用以下方法:

import matplotlib.pyplot as plt
for ax in plt.gcf().axes:
    try:
        ax.label_outer()
    except:
        pass

1
我希望我能够给这个更多的赞,因为它比被采纳的答案更有帮助。唯一需要修改可见性而不是仅仅消除它们的情况是在子图上;而你的答案在这种情况下更加聪明。谢谢! - Channing Moore
为什么需要使用 try?好像没有它也可以。 - EL_DON
2
需要使用 try 是因为 plt.gcf().axes 列表的所有元素都不能保证是 subplot 实例(具有 label_outer 方法)。 - esmit

34

您可以使用Axes.tick_params()

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, sharex=ax1)

ax1.tick_params(labelbottom=False)

4
对我来说,在相反的情况下,将labelbottom设置为True解决了问题。谢谢。 - Manuel
在相反的情况下,对我也起作用了,而plt.setp(ax [1] .get_yticklabels(),visible = True)则没有。 - deckard
谢谢,我已经苦恼了一段时间。 - timanix

6
您可以在子图创建时使用plt.subplots共享坐标轴。
fig, axes = plt.subplots(nrows=2, sharex=True)

这将自动关闭内部轴的刻度标签。

完整示例:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, sharex=True)

axes[0].plot([1,2,3])
axes[1].plot([3,2,1])

plt.show()

enter image description here


但是,如果您尝试将刻度移动到绘图的另一侧,则标签会重新出现 :/ - endolith
是的,确实,在那种特殊情况下,您需要将它们再次设置为不可见。 - ImportanceOfBeingErnest
label_outer() 似乎有效 https://dev59.com/bG855IYBdhLWcg3wq2XL#12751192 - endolith
是的,这里所有的答案都回答了这个问题! - ImportanceOfBeingErnest

1

很遗憾,我没有权限对esmit的答案进行评论(在我看来是最好的解决方案,谢谢esmit),因此我必须将我的评论作为一个新答案写出来:我将他的解决方案放入了一个简单的函数中。

def remove_inner_ticklabels(fig):
    for ax in fig.axes:
        try:
            ax.label_outer()
        except:
            pass

plt.show()之前,您可以调用此函数。由于某种原因,Joe Kington的答案对我不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接