在Matplotlib图表上删除图例

317

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

如何从图中删除图例?

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

11个回答

434

matplotlib v1.4.0rc4 开始,图例对象添加了一个 remove 方法。

用法:

ax.get_legend().remove()

或者
legend = ax.legend(...)
...
legend.remove()

点击这里查看引入此项功能的提交记录。


6
由于某种原因,在我的情况下,ax.get_legend().remove() 解决方案无效,而第二个解决方案 (legend = ax.legend() ... legend.remove()) 有效。也许是因为在我的情况下 ax 是一个 AxesSubplot - Eike P.
不适用于matplotlib 3.7.1。 - irene
@irene 很抱歉听到它对你不起作用。截至3.7.1版本,它仍在单元测试中使用,并且当我刚刚尝试时它是有效的:https://github.com/matplotlib/matplotlib/blob/v3.7.1/lib/matplotlib/tests/test_legend.py#L286-L294请问哪段具体代码对你不起作用? - naitsirhc
.remove() 部分。我会再次尝试运行它并查看结果。 - irene

157

如果您想绘制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()

1
legend参数是一个布尔值,因此使用legend=False可能更好。 - NotThatGuy

111

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

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

这是基于我之前提出的一个类似问题所获得答案的基础上 在这里

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


4
这只是隐藏了图例,实际上并没有移除该对象,对吗? - vlsd
由于某种原因,我在这里得到的是“找不到带有标签的艺术家以放入图例中。请注意,在没有参数的情况下调用legend()时,以下划线开头的标签将被忽略。” - sdbbs

27
如果您将pyplot称为pltframeon=False是用于删除图例周围的边框,
''表示传递的信息是图例中不应该有任何变量。
import matplotlib.pyplot as plt
plt.legend('',frameon=False)

19

您需要添加以下代码行:

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

gca()函数返回当前坐标系的句柄,并具有legend_属性。


1
谢谢,看起来好像可以工作了。(但是这个界面真是太糟糕了……)我建议用show()替换draw()。或者使用draw有特别的优势吗? - Olivier Verdier
如果图形更新是程序的最后一个命令,那么使用show()就可以了。而draw()则是通用的图形更新命令。例如,在更新图形后,您可能想在终端提示用户输入一些内容,这是无法使用阻塞式的show()完成的。 - Eric O. Lebigot
好的。感谢您的回答。现在我同意 draw 更为合适(但我一直使用 show 来更新图表...)。 - Olivier Verdier

10
根据 @naitsirhc 提供的信息,我想找到官方 API 文档。以下是我的发现和一些示例代码。
  1. 我使用 seaborn.scatterplot() 创建了一个 matplotlib.Axes 对象。
  2. ax.get_legend() 将返回一个 matplotlib.legend.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()

7
如果您没有使用 fig 和 ax 绘图对象,可以按如下方式进行操作:
import matplotlib.pyplot as plt

# do plot specifics
plt.legend('')
plt.show() 

4
将图例留为空白框。 - chasmani

5

这里是一个更复杂的示例,演示如何使用 matplotlibseaborn 处理子图并删除和操作图例:

从 seaborn 获取通过 sns.<some_plot>() 创建的 Axes 对象,然后按照 @naitsirhc 的建议执行 ax.get_legend().remove()。下面的示例还展示了如何将图例放在一旁,并且如何在子图环境中处理。

# imports
import seaborn as sns
import matplotlib.pyplot as plt

# get data
sns.set()
sns.set_theme(style="darkgrid")
tips = sns.load_dataset("tips")

# subplots
fig, axes = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(12,6)) 
fig.suptitle('Example of legend manipulations on subplots with seaborn')

g0 = sns.pointplot(ax=axes[0], data=tips, x="day", y="total_bill", hue="size")
g0.set(title="Pointplot with no legend")
g0.get_legend().remove() # <<< REMOVE LEGEND HERE 

g1 = sns.swarmplot(ax=axes[1], data=tips, x="day", y="total_bill", hue="size")
g1.set(title="Swarmplot with legend aside")
# change legend position: https://www.statology.org/seaborn-legend-position/
g1.legend(bbox_to_anchor=(1.02, 1), loc='upper left', borderaxespad=0)

Example of legend manipulations on subplots with seaborn


4

我通过将图例添加到图形而不是坐标轴中(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()

1
这应该是针对标题中问题的被接受答案,它涉及到一个matplotlib的图形。其他回答告诉你如何从matplotlib的中移除图例,这不是同一件事情。 - Finncent Price

1
如果您正在使用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() 方法中不起作用。 - safay
1
因为箱线图没有那个参数。但是其他的有。 - Gonzalo Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接