【问题标题】:matplotlib share x axis but don't show x axis tick labels for both, just onematplotlib 共享 x 轴,但不显示两者的 x 轴刻度标签,只有一个
【发布时间】:2010-11-17 21:45:32
【问题描述】:

我正在使用 python + matplotlib,我有两个图共享一个轴。如果您在共享轴时尝试设置graph1.set_xticklabels([]),则它没有效果,因为它是共享的。有没有办法共享轴并能够隐藏一个绘图的 x 轴?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    这是使用共享轴时的常见问题。

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

    【讨论】:

    • 我遇到了相反的问题:第二个子图上的标签不会显示。所以我像这样使用你的命令:plt.setp(ax2.get_yticklabels(), visible=True)。完美运行。
    【解决方案2】:

    每个matplotlib-users 上的线程,你可以使用

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

    【讨论】:

    • 我希望我能更多地支持这个,因为它比接受的答案更有帮助。您想要修改可见性而不是仅仅消除它们的唯一情况是在子图上;在这种情况下,您的答案要聪明得多。谢谢!
    • 为什么需要try?没有它似乎很好。
    • try 是必需的,因为并非plt.gcf().axes 列表的所有元素都保证是subplot 实例(使用label_outer 方法)。
    【解决方案3】:

    你可以使用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 在相反的情况下为我解决了这个问题。谢谢。
    • 在相反的情况下也为我工作,而 plt.setp(ax[1].get_yticklabels(), visible=True) 没有。
    • 谢谢,苦苦挣扎了一阵子
    【解决方案4】:

    您可以在创建子图期间与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()
    

    【讨论】:

    • 但如果您尝试将刻度移动到绘图的另一侧,标签会回来:/
    • 是的,在这种特殊情况下,您需要再次将它们设置为不可见。
    • label_outer() 似乎工作stackoverflow.com/a/12751192/125507
    • 是的,这里的所有答案都回答了这个问题!?
    【解决方案5】:

    很遗憾,我不允许对 esmit 的答案发表评论(这是我认为最好的解决方案,感谢 esmit),所以我必须将我的评论写成新的答案:我将他的解决方案放入一个简单的函数中

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

    您可以在plt.show() 之前致电。由于某种原因,乔·金顿的回答对我不起作用。

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 2012-03-14
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2016-10-03
      • 2013-03-24
      • 1970-01-01
      相关资源
      最近更新 更多