python - Añadir leyenda al diagrama de dispersión(PCA)
matplotlib legend (1)
Hace poco propuse una manera fácil de agregar una leyenda a un scatter, vea GitHub PR . Esto todavía se está discutiendo.
Mientras tanto, debe crear manualmente su leyenda a partir de las etiquetas únicas en
y
.
Para cada uno de ellos, crearía un objeto
Line2D
con el mismo marcador que se usa en el diagrama de dispersión y los proporcionará como argumento a
plt.legend
.
scatter = plt.scatter(xs * scalex,ys * scaley, c = y)
labels = np.unique(y)
handles = [plt.Line2D([],[],marker="o", ls="",
color=scatter.cmap(scatter.norm(yi))) for yi in labels]
plt.legend(handles, labels)
Soy un novato con python y encontré esta excelente sugerencia de biplot de PCA (graficar las
cargas de PCA y cargarlas en biplot en sklearn (como Rlpoplot)
).
Ahora intenté agregar una leyenda a la trama para los diferentes objetivos.
Pero el comando
plt.legend()
no funciona.
¿Hay una manera fácil de hacerlo? Como ejemplo, los datos del iris con el código biplot del enlace anterior.
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
import pandas as pd
from sklearn.preprocessing import StandardScaler
iris = datasets.load_iris()
X = iris.data
y = iris.target
#In general a good idea is to scale the data
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)
pca = PCA()
x_new = pca.fit_transform(X)
def myplot(score,coeff,labels=None):
xs = score[:,0]
ys = score[:,1]
n = coeff.shape[0]
scalex = 1.0/(xs.max() - xs.min())
scaley = 1.0/(ys.max() - ys.min())
plt.scatter(xs * scalex,ys * scaley, c = y)
for i in range(n):
plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = ''r'',alpha = 0.5)
if labels is None:
plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = ''g'', ha = ''center'', va = ''center'')
else:
plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = ''g'', ha = ''center'', va = ''center'')
plt.xlim(-1,1)
plt.ylim(-1,1)
plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()
#Call the function. Use only the 2 PCs.
myplot(x_new[:,0:2],np.transpose(pca.components_[0:2, :]))
plt.show()
Cualquier sugerencia para PCA biplots son bienvenidos! También otros códigos, si la adición de la leyenda es más fácil de otra manera!