ChatGPT解决这个技术问题 Extra ChatGPT

删除 matplotlib 图上的图例

要将图例添加到 matplotlib 图,只需运行 legend()

如何从情节中删除图例?

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


n
naitsirhc

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

用法:

ax.get_legend().remove()

或者

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

请参阅 here 以了解引入此内容的提交。


由于某种原因,ax.get_legend().remove() 解决方案在我的情况下不起作用,而第二个解决方案 (legend = ax.legend() ... legend.remove()) 起作用。也许是因为在我的情况下 axAxesSubplot
c
cast42

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

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()

C
Community

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

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

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

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


这只会隐藏图例,实际上并没有删除对象,对吧?
M
Miss Chanandler Bong

如果您将 pyplot 称为 plt

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

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

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

f
fceruti

您必须添加以下代码行:

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

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


谢谢,这似乎有效。 (但多么糟糕的界面...)我建议将 draw() 替换为 show()。或者使用 draw 有什么特别的优势吗?
如果图形更新是程序的最后一个命令,show() 就可以了。 draw() 很好,因为它是通用的图形更新命令。例如,您可能希望在更新图形后提示用户在终端中输入一些内容,而阻塞 show() 无法做到这一点。
正确的。感谢你的回答。现在我同意 draw 更合适(但我一直使用 show 来更新我的图表...)。
P
Pelonomi Moiloa

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

import matplotlib.pyplot as plt

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

将图例保留为空框
A
Andrew Li

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

我通过 seaborn.scatterplot() 创建了一个 matplotlib.Axes 对象。 ax.get_legend() 将返回一个 matplotlib.legned.Legend 实例。最后,调用 .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()

b
boudewijn21

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

G
Gonzalo Garcia

如果您使用的是 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 没有那个参数。但其余的他们做
O
Onyr

以下是使用 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)

https://i.stack.imgur.com/83bgv.png