Solución:
Primero, tengo la sensación de que pretendías usar apóstrofos, no comillas inversas al declarar colores.
Para una leyenda, necesita algunas formas, así como las clases. Por ejemplo, lo siguiente crea una lista de rectángulos llamada recs
para cada color en class_colours
.
import matplotlib.patches as mpatches
classes = ['A','B','C']
class_colours = ['r','b','g']
recs = []
for i in range(0,len(class_colours)):
recs.append(mpatches.Rectangle((0,0),1,1,fc=class_colours[i]))
plt.legend(recs,classes,loc=4)
Hay una segunda forma de crear una leyenda, en la que se especifica la “Etiqueta” para un conjunto de puntos utilizando un comando de dispersión independiente para cada conjunto. A continuación se ofrece un ejemplo de esto.
classes = ['A','A','B','C','C','C']
colours = ['r','r','b','g','g','g']
for (i,cla) in enumerate(set(classes)):
xc = [p for (j,p) in enumerate(x) if classes[j]==cla]
yc = [p for (j,p) in enumerate(y) if classes[j]==cla]
cols = [c for (j,c) in enumerate(colours) if classes[j]==cla]
plt.scatter(xc,yc,c=cols,label=cla)
plt.legend(loc=4)
El primer método es el que he usado personalmente, el segundo que acabo de encontrar mirando la documentación de matplotlib. Dado que las leyendas cubrían puntos de datos, las moví, y las ubicaciones de las leyendas se pueden encontrar aquí. Si hay otra forma de hacer una leyenda, no pude encontrarla después de algunas búsquedas rápidas en los documentos.
Hay dos maneras de hacerlo. Uno de ellos le brinda entradas de leyenda para cada cosa que traza, y el otro le permite poner lo que quiera en la leyenda, robando mucho de esta respuesta.
Esta es la primera forma:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
ax.plot(x,x, color="red", ls="-", label="$P_1(x)$")
ax.plot(x,0.5 * (3*x**2-1), color="green", ls="--", label="$P_2(x)$")
ax.plot(x,0.5 * (5*x**3-3*x), color="blue", ls=":", label="$P_3(x)$")
ax.legend()
plt.show()
los ax.legend()
función tiene más de un uso, el primero simplemente crea la leyenda basada en las líneas en axes
objeto, el segundo le permite controlar las entradas manualmente, y se describe aquí.
Básicamente, debe darle a la leyenda los identificadores de línea y las etiquetas asociadas.
La otra forma le permite poner lo que quiera en la leyenda, creando el Artist
objetos y etiquetas, y pasarlos a la ax.legend()
función. Puede usar esto para poner solo algunas de sus líneas en la leyenda, o puede usarlo para poner lo que quiera en la leyenda.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
p1, = ax.plot(x,x, color="red", ls="-", label="$P_1(x)$")
p2, = ax.plot(x,0.5 * (3*x**2-1), color="green", ls="--", label="$P_2(x)$")
p3, = ax.plot(x,0.5 * (5*x**3-3*x), color="blue", ls=":", label="$P_3(x)$")
#Create legend from custom artist/label lists
ax.legend([p1,p2], ["$P_1(x)$", "$P_2(x)$"])
plt.show()
O aquí, creamos nuevos Line2D
objetos y dárselos a la leyenda.
import matplotlib.pyplot as pltit|delete|flag
import numpy as np
import matplotlib.patches as mpatches
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
p1, = ax.plot(x,x, color="red", ls="-", label="$P_1(x)$")
p2, = ax.plot(x,0.5 * (3*x**2-1), color="green", ls="--", label="$P_2(x)$")
p3, = ax.plot(x,0.5 * (5*x**3-3*x), color="blue", ls=":", label="$P_3(x)$")
fakeLine1 = plt.Line2D([0,0],[0,1], color="Orange", marker="o", linestyle="-")
fakeLine2 = plt.Line2D([0,0],[0,1], color="Purple", marker="^", linestyle="")
fakeLine3 = plt.Line2D([0,0],[0,1], color="LightBlue", marker="*", linestyle=":")
#Create legend from custom artist/label lists
ax.legend([fakeLine1,fakeLine2,fakeLine3], ["label 1", "label 2", "label 3"])
plt.show()
También intenté obtener el método usando patches
para funcionar, como en la página de la guía de leyenda de matplotlib, pero no parecía funcionar, así que me di por vencido.
Si está utilizando matplotlib versión 3.1.1 o superior, puede probar:
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'A', 'B', 'C', 'C', 'C']
values = [0, 0, 1, 2, 2, 2]
colours = ListedColormap(['r','b','g'])
scatter = plt.scatter(x, y,c=values, cmap=colours)
plt.legend(*scatter.legend_elements())
Además, para reemplazar etiquetas con nombres de clases, solo necesitamos identificadores de scatter.legend_elements:
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'B', 'C']
values = [0, 0, 1, 2, 2, 2]
colours = ListedColormap(['r','b','g'])
scatter = plt.scatter(x, y,c=values, cmap=colours)
plt.legend(handles=scatter.legend_elements()[0], labels=classes)