2017-07-27 27 views
0

我对以下数据(代码中提供)实现了PCA。我选择了两个组件,它们以[x1,y1],[x2,y2]等形式给出输出结果。散点图:每个观察的不同颜色和注释取决于以前未转换的数据集PCA matplotlib python

然后,我想在绘图上绘制这两台PC(a)(如下面的代码所示)但是我想根据未转换的数据(数据)中的字母对它们进行颜色编码。即观察[x1,y1]最初被指定为“A”,因此我希望它与具有相应的“B”和“C”标签的颜色不同。我认为字典是合适的,但不知道如何将原始数据集链接到新的PCA变量。

我也想用原始集合(数据)中的名称来注释这些点(来自a),即[x1,y1]将用“John”注释。

任何帮助,非常感谢。

# load packages 
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from sklearn.preprocessing import scale 
from sklearn.decomposition import PCA 

# load data 
data = np.array([["John","A",1,2,1,3,4,6], 
    ["Julie","A",3,1,2,2,2,4], 
    ["James","B",2,4,1,1,2,5], 
    ["Jemma","C",3,5,1,2,3,2], 
    ["Jet","B",1,3,2,1,1,3], 
    ["Jane","A",2,4,2,1,3,4]]) 

# feature array & scale 
y = data[:,[2,3,4,5,6,7]] 
z = scale(y) 

# PCA 
pca = PCA(n_components=6) 
pca.fit(z) 

# scree plot 
var = pca.explained_variance_ratio_ 
var1 = np.cumsum(np.round(pca.explained_variance_ratio_, decimals=4)*100) 
#print(var1) 
#plt.plot(var1) 
#plt.show() 

# PCA w/ 2 components 
pca = PCA(n_components=2) 
pca.fit(z) 
a = pca.fit_transform(z) 

# colour map **HELP** 
#colours = {"A":"red", "B":"green", "C":"blue"} 

# annotation **HELP** 

# scatter plot 
plt.scatter(a[:,0],a[:,1]) 
plt.show() 

enter image description here

编辑:

颜色问题解决

注解问题需要帮助:

0:作为编码时

names = [rows[0] for rows in data] 

plt.scatter(a[:,0], a[:,1], c=point_colours) 
plt.annotate(names, (a[:,0], a[:,1])) 

同样的问题

虽然打印名称输出我想注释的名称,但它并不显示在图上。我已经尝试在注释参数中同时使用名称和str(名称),但不断得到

TypeError: only length-1 arrays can be converted to Python scalars 

然后输出图形没有标签。

有什么想法?

回答

2

喜欢的东西:

point_colors = [colours[row[1]] for row in data] 
plt.scatter(a[:,0], a[:,1], c=point_colors) 

它会创建点的颜色列表。

对于注释:

for i, row in enumerate(data): 
    xy = (a[:,0][i], a[:,1][i]) 
    name = data[i][0] 
    plt.annotate(name, xy=xy) 

你应该将XY避免与点的文字重叠。

+0

辉煌,任何想法的注释,因为字典不合适,因为每个名称是唯一的? – mystifier

+0

我想你需要一个for循环来添加注释到点。 – axaroth

+0

看到我更新的帖子,遇到问题 – mystifier

相关问题