matplotlib共享x轴,但不同时显示x轴刻度标签,只有一个


80

我正在使用python + matplotlib,并且我有两个图共享一个轴。如果尝试graph1.set_xticklabels([])在共享轴时进行设置,则由于共享该轴而无效。有没有一种方法可以共享轴并可以隐藏一个绘图的x轴?

Answers:


113

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

幸运的是,有一个简单的解决方法:用于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()

替代文字


7
我遇到了相反的问题:第二个子图上的标签将不会显示。所以我用你的命令是这样的:plt.setp(ax2.get_yticklabels(), visible=True)。完美地工作。
n1000

49

根据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

1
try之所以需要它,是因为并非plt.gcf().axes保证列表中的所有元素都是subplot实例(使用label_outer方法)。
esmit

16

您可以使用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)

设置labelbottom = True在相反的情况下为我解决了该问题。谢谢。
mclzc

在相反的情况下也对我有用,而plt.setp(ax [1] .get_yticklabels(),visible = True)却没有。
卡德

3

您可以在创建子图的过程中使用plt.subplotsas共享轴

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()

在此处输入图片说明


但是,如果您尝试将刻度线移到情节的另一侧,标签就会回来:/
endolith

是的,在那种特殊情况下,您需要将它们重新设置为不可见。
ImportanceOfBeingErnest

label_outer()似乎可以工作stackoverflow.com/a/12751192/125507
endolith

是的,这里的所有答案都可以回答问题!?
ImportanceOfBeingErnest

0

不幸的是,我不允许对esmit的答案发表评论(这是我认为这是最好的解决方案,谢谢esmit),因此我必须将评论写为新答案:我将其解决方案放入了一个简单的函数中

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

您可以提前致电plt.show()。Joe Kington的回答由于某种原因对我不起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.