python matplotlib legend pca biplot

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!