【问题标题】:How can I remove the top and right axis in matplotlib?如何删除 matplotlib 中的上轴和右轴?
【发布时间】:2010-10-29 19:53:50
【问题描述】:

我希望只有左轴和下轴,而不是默认的“盒装”轴样式,即:

+------+         |
|      |         |
|      |   --->  |
|      |         |
+------+         +-------

这应该很容易,但我在文档中找不到必要的选项。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    这是官网HERE推荐的Matplotlib 3解决方案:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 2*np.pi, 100)
    y = np.sin(x)
    
    ax = plt.subplot(111)
    ax.plot(x, y)
    
    # Hide the right and top spines
    ax.spines['right'].set_visible(False)
    ax.spines['top'].set_visible(False)
    
    # Only show ticks on the left and bottom spines
    ax.yaxis.set_ticks_position('left')
    ax.xaxis.set_ticks_position('bottom')
    
    plt.show()
    

    【讨论】:

    • 这比新版本的 matplotlib 中接受的答案更好。
    • 初学者的附加问题:根据 Matplotlib API 文档,您在哪里可以找到此答案?如果我去那里:matplotlib.org/api/axes_api.html 我看不到对spine 对象的任何引用,我也不会猜到这个关键字。
    • @EricBurel 我发现 Matplotlib 文档设计不佳。我通常发现从示例中更容易理解它的 API。这就是 StackOverflow 如此重要的原因!我希望 Matplotliob 文档是用 Scipy 和 Numpy 清晰且组织良好的方法编写的。
    【解决方案2】:

    或者,这个

    def simpleaxis(ax):
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        ax.get_xaxis().tick_bottom()
        ax.get_yaxis().tick_left()
    

    似乎在不失去旋转标签支持的情况下在轴上实现相同的效果。

    (Matplotlib 1.0.1;受this启发的解决方案)。

    【讨论】:

      【解决方案3】:

      [edit] matplotlib in now (2013-10) on version 1.3.0,其中包括此

      该功能实际上是刚刚添加的,您需要 Subversion 版本。可以看示例代码here

      我只是更新说现在有一个更好的example 在线。不过仍然需要 Subversion 版本,目前还没有发布。

      [edit] Matplotlib 0.99.0 RC1 刚刚发布,包含此功能。

      【讨论】:

      • 请确保您阅读matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/…关于刻度线支持不完整的警告,然后再尝试将上述内容与旋转标签一起使用!
      • 看起来这取决于您如何构建轴。 mpl.subplots生成的坐标轴不能这样用吗?
      • 示例链接现已损坏。
      【解决方案4】:

      (除了这里的综合答案之外,这更像是一个扩展评论。)


      请注意,我们可以相互独立地隐藏这三个元素:

      • 隐藏边框(又名“脊椎”):ax.set_frame_on(False)ax.spines['top'].set_visible(False)

      • 隐藏刻度:ax.tick_params(top=False)

      • 隐藏标签:ax.tick_params(labeltop=False)

      【讨论】:

      • 很好的可能性总结。 +1
      【解决方案5】:

      如果您需要从所有绘图中删除它,您可以在样式设置(样式表或 rcParams)中删除刺。例如:

      import matplotlib as mpl
      
      mpl.rcParams['axes.spines.right'] = False
      mpl.rcParams['axes.spines.top'] = False
      

      如果要删除所有刺:

      mpl.rcParams['axes.spines.left'] = False
      mpl.rcParams['axes.spines.right'] = False
      mpl.rcParams['axes.spines.top'] = False
      mpl.rcParams['axes.spines.bottom'] = False
      

      【讨论】:

        【解决方案6】:

        Library Seaborn 内置了这个函数.despine()

        只需添加:

        import seaborn as sns
        

        现在创建您的图表。并在最后添加:

        sns.despine()
        

        如果您查看该函数的一些默认参数值,它会删除顶部和右侧脊椎并保留底部和左侧脊椎:

        sns.despine(top=True, right=True, left=False, bottom=False)
        

        在此处查看更多文档: https://seaborn.pydata.org/generated/seaborn.despine.html

        【讨论】:

          【解决方案7】:

          如果您不需要刻度等(例如用于绘制定性插图),您也可以使用以下快速解决方法:

          使轴不可见(例如使用plt.gca().axison = False),然后使用plt.arrow手动绘制它们。

          【讨论】:

          • 这似乎去除了刺,但保留了刻度线。知道如何去除蜱虫吗?
          • @Rob:你说得对,我实际上在我想的脚本中使用了不同的解决方案。我更改了答案,现在应该可以了,但总的来说,上面接受的解决方案更好。
          【解决方案8】:

          以非全局方式执行此操作的另一种方法是使用matplotlib.pyplot.rc_context 上下文管理器,如下所示:

          with plt.rc_context({
              "axes.spines.right": False,
              "axes.spines.top": False,
          }):
              fig, ax = plt.subplots()
              ...
          

          【讨论】:

            【解决方案9】:

            如果您想经常应用此功能,您还可以按照here 所述创建样式表并使用以下设置:

            axes.spines.left:   True
            axes.spines.bottom: True
            axes.spines.top:    False
            axes.spines.right:  False
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-12-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-12
              相关资源
              最近更新 更多