【问题标题】:Remove the legend on a matplotlib figure删除 matplotlib 图上的图例
【发布时间】:2011-08-09 18:19:29
【问题描述】:

要在 matplotlib 图中添加图例,只需运行 legend()

如何删除情节中的图例?

(我最接近的方法是运行legend([]) 以从数据中清空图例。但这会在右上角留下一个难看的白色矩形。)

【问题讨论】:

    标签: matplotlib legend


    【解决方案1】:

    matplotlib v1.4.0rc4 开始,remove 方法已添加到图例对象中。

    用法:

    ax.get_legend().remove()
    

    legend = ax.legend(...)
    ...
    legend.remove()
    

    请参阅 here 以了解引入此功能的提交。

    【讨论】:

    • 由于某种原因,ax.get_legend().remove() 解决方案在我的情况下不起作用,而第二个解决方案 (legend = ax.legend() ... legend.remove()) 起作用。可能是因为 ax 在我的情况下是 AxesSubplot
    • @naitsirhc,感谢您的分享。
    【解决方案2】:

    如果要绘制 Pandas 数据框并删除图例,请将 legend=None 作为参数添加到绘图命令。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    df2 = pd.DataFrame(np.random.randn(10, 5))
    df2.plot(legend=None)
    plt.show()
    

    【讨论】:

      【解决方案3】:

      您可以使用图例的set_visible 方法:

      ax.legend().set_visible(False)
      draw()
      

      这是基于对我前段时间here的类似问题的回答提供给我的

      (感谢 Jouni 的回答 - 很抱歉我无法将问题标记为已回答......也许有权限的人可以为我这样做?)

      【讨论】:

      • 这只是隐藏了图例,实际上并没有删除对象,对吧?
      【解决方案4】:

      您必须添加以下代码行:

      ax = gca()
      ax.legend_ = None
      draw()
      

      gca() 返回当前坐标区句柄,并具有该属性 legend_

      【讨论】:

      • 谢谢,这似乎有效。 (但多么可怕的界面……)我建议用show() 替换draw()。或者使用draw有什么特别的优势吗?
      • 如果图形更新是程序的最后一个命令,show() 就可以了。 draw() 很好,因为它是通用的图形更新命令。例如,您可能希望在更新图表后提示用户在终端中进行一些输入,而阻塞 show() 无法做到这一点。
      • 对。感谢您的回答。现在我同意draw 更合适(但我一直使用show 来更新我的图表...)。
      【解决方案5】:

      如果您将pyplot 称为plt

      frameon=False是去掉图例周围的边框

      '' 传递的信息是图例中不应包含任何变量

      import matplotlib.pyplot as plt
      plt.legend('',frameon=False)
      

      【讨论】:

        【解决方案6】:

        如果你不使用 fig 和 ax 绘图对象,你可以这样做:

        import matplotlib.pyplot as plt
        
        # do plot specifics
        plt.legend('')
        plt.show()
        

        【讨论】:

        • 将图例保留为空框
        【解决方案7】:

        根据@naitsirhc 提供的信息,我想查找官方API 文档。这是我的发现和一些示例代码。

        1. 我通过seaborn.scatterplot() 创建了一个matplotlib.Axes 对象。
        2. ax.get_legend() 将返回一个 matplotlib.legned.Legend 实例。
        3. 最后,您调用 .remove() 函数从绘图中删除图例。
        ax = sns.scatterplot(......)
        _lg = ax.get_legend()
        _lg.remove()
        

        如果您查看matplotlib.legned.Legend API 文档,您将看不到.remove() 函数。

        原因是matplotlib.legned.Legend继承了matplotlib.artist.Artist。因此,当您调用ax.get_legend().remove() 时,基本上会调用matplotlib.artist.Artist.remove()

        最后,您甚至可以将代码简化为两行。

        ax = sns.scatterplot(......)
        ax.get_legend().remove()
        

        【讨论】:

        • 这就像一个魅力。谢谢!
        【解决方案8】:

        我通过将它添加到图形而不是轴(matplotlib 2.2.2)来制作图例。要删除它,我将图形的legends 属性设置为一个空列表:

        import matplotlib.pyplot as plt
        
        fig = plt.figure()
        ax1 = fig.add_subplot(111)
        ax2 = ax1.twinx()
        
        ax1.plot(range(10), range(10, 20), label='line 1')
        ax2.plot(range(10), range(30, 20, -1), label='line 2')
        
        fig.legend()
        
        fig.legends = []
        
        plt.show()
        

        【讨论】:

          【解决方案9】:

          如果您使用的是 seaborn,您可以使用参数legend。即使您在同一个图中多次绘制。一些df的例子

          import seaborn as sns
          
          # Will display legend
          ax1 = sns.lineplot(x='cars', y='miles', hue='brand', data=df)
          
          # No legend displayed
          ax2 = sns.lineplot(x='cars', y='miles', hue='brand', data=df, legend=None)
          

          【讨论】:

          • 这不适用于 seaborn .boxplot() 方法
          • 因为 boxplot 没有那个参数。但其余的他们做
          猜你喜欢
          • 2020-04-08
          • 2012-03-06
          • 2020-05-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多