ChatGPT解决这个技术问题 Extra ChatGPT

Remove the legend on a matplotlib figure

To add a legend to a matplotlib plot, one simply runs legend().

How to remove a legend from a plot?

(The closest I came to this is to run legend([]) in order to empty the legend from data. But that leaves an ugly white rectangle in the upper right corner.)


n
naitsirhc

As of matplotlib v1.4.0rc4, a remove method has been added to the legend object.

Usage:

ax.get_legend().remove()

or

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

See here for the commit where this was introduced.


For some reason, the ax.get_legend().remove() solution did not work in my case, while the second solution (legend = ax.legend() ... legend.remove()) worked. maybe because ax was an AxesSubplot in my case?
c
cast42

If you want to plot a Pandas dataframe and want to remove the legend, add legend=None as parameter to the plot command.

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

You could use the legend's set_visible method:

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

This is based on a answer provided to me in response to a similar question I had some time ago here

(Thanks for that answer Jouni - I'm sorry I was unable to mark the question as answered... perhaps someone who has the authority can do so for me?)


this only hides the legend and it doesn't in fact remove the object, right?
M
Miss Chanandler Bong

if you call pyplot as plt

frameon=False is to remove the border around the legend

and '' is passing the information that no variable should be in the legend

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

f
fceruti

you have to add the following lines of code:

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

gca() returns the current axes handle, and has that property legend_


Thank you, that seems to work. (But what a horrible interface...) I suggest to replace draw() by show(). Or is there a particular advantage in using draw?
show() would be OK if the graph update were the last command of a program. draw() is fine, as it is the general graph update command. You might for instance want to prompt the user for some input in a terminal after updating the graph, which cannot be done with the blocking show().
Right. Thanks for the answer. Now I agree that draw is more appropriate (but I've always used show to update my graphs...).
P
Pelonomi Moiloa

If you are not using fig and ax plot objects you can do it like so:

import matplotlib.pyplot as plt

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

Leaves the legend as an empty box
A
Andrew Li

According to the information from @naitsirhc, I wanted to find the official API documentation. Here are my finding and some sample code.

I created a matplotlib.Axes object by seaborn.scatterplot(). The ax.get_legend() will return a matplotlib.legned.Legend instance. Finally, you call .remove() function to remove the legend from your plot.

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

If you check the matplotlib.legned.Legend API document, you won't see the .remove() function.

The reason is that the matplotlib.legned.Legend inherited the matplotlib.artist.Artist. Therefore, when you call ax.get_legend().remove() that basically call matplotlib.artist.Artist.remove().

In the end, you could even simplify the code into two lines.

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

b
boudewijn21

I made a legend by adding it to the figure, not to an axis (matplotlib 2.2.2). To remove it, I set the legends attribute of the figure to an empty list:

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

If you are using seaborn you can use the parameter legend. Even if you are ploting more than once in the same figure. Example with some 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)

This does not work for the seaborn .boxplot() method
because boxplot doesn't have that parameter. But the rest they do
O
Onyr

Here is a more complex example of legend removal and manipulation with matplotlib and seaborn dealing with subplots:

From seaborn, get the Axes object created by sns.<some_plot>() and do ax.get_legend().remove() as indicated by @naitsirhc. The following example also shows how to put the legend aside, and how to deal in a context of subplots.

# 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