Adicionando uma lenda ao PyPlot em Matplotlib da maneira mais simples possível

TL;DR -> Como se pode criar uma legenda para um gráfico de linhas em Matplotlib's PyPlot sem criar nenhuma variável extra?

Por favor, considere o roteiro gráfico abaixo:

if __name__ == '__main__':
    PyPlot.plot(total_lengths, sort_times_bubble, 'b-',
                total_lengths, sort_times_ins, 'r-',
                total_lengths, sort_times_merge_r, 'g+',
                total_lengths, sort_times_merge_i, 'p-', )
    PyPlot.title("Combined Statistics")
    PyPlot.xlabel("Length of list (number)")
    PyPlot.ylabel("Time taken (seconds)")
    PyPlot.show()

Como você pode ver, este é um uso muito básico do matplotlib's PyPlot. Isto idealmente gera um gráfico como o que está abaixo:

Nada de especial, eu sei. Entretanto, não está claro quais dados estão sendo plotados onde (I'estou tentando plotar os dados de alguns algoritmos de ordenação, duração contra o tempo gasto, e I'gostaria de ter certeza de que as pessoas saibam qual linha é qual). Portanto, preciso de uma legenda, porém, dando uma olhada no seguinte exemplo abaixo(do site oficial):

ax = subplot(1,1,1)
p1, = ax.plot([1,2,3], label="line 1")
p2, = ax.plot([3,2,1], label="line 2")
p3, = ax.plot([2,3,1], label="line 3")

handles, labels = ax.get_legend_handles_labels()

# reverse the order
ax.legend(handles[::-1], labels[::-1])

# or sort them by labels
import operator
hl = sorted(zip(handles, labels),
            key=operator.itemgetter(1))
handles2, labels2 = zip(*hl)

ax.legend(handles2, labels2)

Você vai ver que eu preciso criar uma variável extra "eixo". Como posso adicionar uma legenda ao meu gráfico Sem ter que criar esta variável extra e manter a simplicidade do meu script atual.

Solução

Adicione um label=`` a cada uma de suas chamadas [plot()](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot), e então chame [legend(loc='upper left')`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.legend).

Considere esta amostra (testada com o Python 3.8.0):

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 1000)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, "-b", label="sine")
plt.plot(x, y2, "-r", label="cosine")
plt.legend(loc="upper left")
plt.ylim(-1.5, 2.0)
plt.show()

Ligeiramente modificado a partir deste tutorial: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

Comentários (5)

Aqui's um exemplo para o ajudar ...

fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(111)
ax.set_title('ADR vs Rating (CS:GO)')
ax.scatter(x=data[:,0],y=data[:,1],label='Data')
plt.plot(data[:,0], m*data[:,0] + b,color='red',label='Our Fitting 
Line')
ax.set_xlabel('ADR')
ax.set_ylabel('Rating')
ax.legend(loc='best')
plt.show()

Comentários (0)

Adicione etiquetas a cada argumento na sua chamada de enredo correspondente à série que está a representar, ou seja, label = "série 1"

Então simplesmente adicione Pyplot.legend() ao fundo do seu script e a legenda exibirá estas etiquetas.

Comentários (1)