Remova a legenda em uma figura do matplotlib


169

Para adicionar uma legenda a um gráfico matplotlib, basta executar legend().

Como remover uma legenda de uma trama?

(O mais próximo que cheguei disso foi executar legend([])para esvaziar a legenda dos dados. Mas isso deixa um retângulo branco feio no canto superior direito.)

Respostas:


229

No matplotlibv1.4.0rc4 , um removemétodo foi adicionado ao objeto de legenda.

Uso:

ax.get_legend().remove()

ou

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

Veja aqui o commit onde isso foi introduzido.


2
Por alguma razão, a ax.get_legend().remove()solução não funcionou no meu caso, enquanto a segunda solução ( legend = ax.legend() ... legend.remove()) funcionou. talvez porque axfoi um AxesSubplotno meu caso?
Jhin

@naitsirhc, obrigado por compartilhar.
Andrew Li

91

Se você deseja plotar um dataframe do Pandas e remover a legenda, adicione legend = None como parâmetro ao comando 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()

86

Você pode usar o set_visiblemétodo da legenda :

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

Isso se baseia em uma resposta que me foi fornecida em resposta a uma pergunta semelhante que tive há algum tempo aqui

(Obrigado por essa resposta, Jouni - desculpe, não consegui marcar a pergunta como respondida ... talvez alguém que tenha autoridade possa fazer isso por mim?)


4
isso apenas oculta a lenda e na verdade não remove o objeto, certo?
VLSD

16

você precisa adicionar as seguintes linhas de código:

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

gca () retorna a alça atual dos eixos e possui essa propriedade legend_


Obrigado, isso parece funcionar. (Mas que interface horrível ...) Sugiro substituir draw()por show(). Ou existe uma vantagem particular no uso draw?
precisa saber é o seguinte

show()seria bom se a atualização do gráfico fosse o último comando de um programa. draw()está bom, pois é o comando geral de atualização de gráfico. Você pode, por exemplo, solicitar ao usuário alguma entrada em um terminal após atualizar o gráfico, o que não pode ser feito com o bloqueio show().
Eric O Lebigot

Certo. Obrigado pela resposta. Agora eu concordo que drawé mais apropriado (mas eu sempre usei showpara atualizar meus gráficos ...).
precisa

6

Se você não estiver usando objetos de plotagem fig e ax, poderá fazer o seguinte:

import matplotlib.pyplot as plt

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

3

se você ligar pyplotcomoplt

frameon=False é remover a borda ao redor da legenda

e '' está passando a informação de que nenhuma variável deve estar na legenda

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

1

Criei uma lenda adicionando-a à figura, não a um eixo (matplotlib 2.2.2). Para removê-lo, defino o legendsatributo da figura como uma lista vazia:

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

0

De acordo com as informações do @naitsirhc, eu queria encontrar a documentação oficial da API. Aqui estão minhas descobertas e alguns exemplos de código.

  1. Eu criei um matplotlib.Axesobjeto por seaborn.scatterplot().
  2. O ax.get_legend()retornará uma matplotlib.legned.Legendinstância.
  3. Por fim, você chama a .remove()função para remover a legenda do seu gráfico.
ax = sns.scatterplot(......)
_lg = ax.get_legend()
_lg.remove()

Se você verificar o matplotlib.legned.Legenddocumento da API, não verá a .remove()função.

A razão é que o matplotlib.legned.Legendherdou o matplotlib.artist.Artist. Portanto, quando você chama ax.get_legend().remove()isso, basicamente chama matplotlib.artist.Artist.remove().

No final, você pode até simplificar o código em duas linhas.

ax = sns.scatterplot(......)
ax.get_legend().remove()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.