Saltar al contenido

Diagrama de dispersión de Matplotlib con leyenda

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)

Salida del primer bloque de código

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)

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

resultado1

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)

resultados2

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *