【问题标题】:Remove first and last ticks label of each y-axis subplot删除每个 y 轴子图的第一个和最后一个刻度标签
【发布时间】:2020-11-14 12:03:54
【问题描述】:

创建我使用的 5 个子图:

`ax = plt.subplots(5, sharex=True)`

然后,我想删除每个 y 轴子图的第一个和最后一个标签刻度(因为它们相互重叠),我使用了:

`plt.setp([a.get_yticklabels()[0::-1] for a in ax[0:5]], visible=False)`

但这只是去除了一些滴答声,我不明白背后的逻辑。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您应该小心第一次调用的结果。你可能想这样称呼它

    fig, ax = plt.subplots(5, sharex=True, squeeze=True)
    

    如果你这样做,你就可以遍历所有的轴:

    for a in ax:
        # get all the labels of this axis
        labels = a.get_yticklabels()
        # remove the first and the last labels
        labels[0] = labels[-1] = ""
        # set these new labels
        a.set_yticklabels(labels)
    

    如果你想保持你隐藏标签的风格,你可以使用

    for a in ax:
        plt.setp(a.get_yticklabels()[0], visible=False)    
        plt.setp(a.get_yticklabels()[-1], visible=False)
    

    注意:在访问刻度标签之前,您可能需要调用 draw()(请参阅:https://stackoverflow.com/a/41131528/8144672)。例如,当打印到 PDF 时,您必须在 get_xticklabels() 之前调用 plt.gcf().canvas.draw()

    【讨论】:

    • 不完全一样吗?但是请记住“a”是一个 numpy.ndarray,所以它不支持这些选项...
    • 感谢 Py-ser 注意到 plt.subplots 的结果是一个元组,通常是一个二维数组。我在回复中添加了注释。我的代码仍然与上面的不一样,因为使用[0::-1] 与使用[0] 相同。因此,您只选择第一个标签。
    • labels = ax.get_yticklabels() 可以在循环之外,还是ax 是错字,应该是a?或者ax.get_yticklabels() 是否在您循环访问ax 时发生变化?
    【解决方案2】:

    使用MaxNLocator:

    from matplotlib.ticker import MaxNLocator
    ax.yaxis.set_major_locator(MaxNLocator(prune='both'))
    

    【讨论】:

      【解决方案3】:

      这不会返回您所期望的:

      >>> some_list = [1, 2, 3, 4]
      >>> some_list[0::-1]
      [1]  # and not [1, 4] !
      

      使用切片表示法返回一个列表,其中包含some_list 项,在示例中从位置 0 开始并递减。这在第一步之后就停止了……

      我认为你必须这样做两个步骤,如@DavidZwicker 所示。

      【讨论】:

        【解决方案4】:

        另一种选择是使用x_ticks[0].label1.set_visible,如下所示

        import matplotlib
        matplotlib.use('Agg')
        import pylab
        from  matplotlib import rc
        rc('font', **{'family': 'sans-serif', 'sans-serif': ['Times-Roman']})
        rc('text', usetex = True)
        matplotlib.rcParams['text.latex.preamble'] = [r"\usepackage{amsmath}"]
        
        figure, axs = matplotlib.pyplot.subplots(5, sharex = True, squeeze = True)
        x_ticks = axs[4].xaxis.get_major_ticks()
        x_ticks[0].label1.set_visible(False) ## set first x tick label invisible
        x_ticks[-1].label1.set_visible(False) ## set last x tick label invisible
        pylab.tight_layout()
        pylab.savefig('./test.png', dpi = 200)
        

        你会得到

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-22
          • 1970-01-01
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多