2017-07-26 599 views
0

我剛剛完成了14個變量的PCA分析,我已經選擇將其分解爲2個分量。繪製散點圖中的PCA輸出,同時根據標籤着色python matplotlib

pca = PCA(n_components=2) 
pca.fit(z) 
a = pca.fit_transform(z) 

輸出這給出了在形式:

[[ -3.84514275e+00 -1.19829226e-01] 
[ -4.78476227e+00 -1.35986090e-01] 
[ -2.26702900e+00 -1.19665853e+00] 
[ -5.01021616e+00 2.76005130e+00] 
[ -5.57580326e+00 -2.00656680e+00] 
[ -5.08184415e+00 -3.68721491e+00] 
[ -3.41505366e+00 -7.61184868e-01] 
[ -4.92439159e+00 -1.82147509e+00] 
... 
[ -3.34931300e+00 7.57884906e-01]] 

欲執行以下操作:

  1. 情節上與PC1(X)爲所述第一一散點圖每個觀測每個數組中的值和PC2(y)是第二個值。

  2. 根據來自初始PCA前數據的相應標籤類型(即A =紅色,B =藍色,C =綠色等)爲每個觀察着色。

  3. 標籤SELECTED(不是全部)與從最初的預PCA數據觀察的名稱(例如約翰,彼得,薩利等)

觀察任何幫助是極大的讚賞任何/所有這些問題。

值得注意我試圖通過做散點圖:

plt.scatter(a[1], a[2]) 
plt.show() 

但顯然這並不能作爲我的輸出沒有用逗號分隔的工作,而且只積2分。無法幫助我的頭,因此會讚賞SO的投入。

編輯:

John, A, var1, var2, var3, ..., var14 
Peter, A, var1, var2, var3, ..., var14 
Sally, B, var1, var2, var3, ..., var14 
Cath, C, var1, var2, var3, ..., var14 
Jim, A, var1, var2, var3, ..., var14 

類似這樣的東西之後我:在形式上

數據集

enter image description here

+0

我們展示具有代表性的數據集,用標籤 –

+0

你的陣列是二維的,所以你需要用兩個指數指數吧。第一列爲'a [:,0]',第二列爲'a [:,1]'。除此之外,真正的問題還不清楚。 – ImportanceOfBeingErnest

+0

謝謝歐內斯特,那解決了問題1.關於2和3的任何想法? – mystifier

回答

2

我認爲你的問題現在很明確的 - 感謝編輯!

下面介紹如何創建您所描述的情節。


首先,讓我們產生了一些示例數據:

# Params 
n_samples = 100 
m_features = 14 
selected_names = ['name_13', 'name_23', 'name_42', 'name_66'] 

# Generate 
np.random.seed(42) 
names = ['name_%i' % i for i in range(n_samples)] 
labels = [np.random.choice(['A','B','C','D']) for i in range(n_samples)] 
features = np.random.random((n_samples,m_features)) 

接下來我們要做的PCA:

pca = PCA(n_components=2) 
features_pca = pca.fit_transform(features) 

然後,我們準備長度n列表/數組轉換標籤A,B,C,...變成顏色。這些可以是手動選擇的顏色...

...或者只是一個整數範圍。

# Label to color dict (automatic) 
label_color_dict = {label:idx for idx,label in enumerate(np.unique(labels))} 

# Color vector creation 
cvec = [label_color_dict[label] for label in labels] 

最後,是時候繪製。

# Create the scatter plot 
plt.figure(figsize=(8,8)) 
plt.scatter(features_pca[:,0], features_pca[:,1], 
      c=cvec, edgecolor='', alpha=0.5) 

# Add the labels 
for name in selected_names: 

    # Get the index of the name 
    i = names.index(name) 

    # Add the text label 
    labelpad = 0.01 # Adjust this based on your dataset 
    plt.text(features_pca[i,0]+labelpad, features_pca[i,1]+labelpad, name, fontsize=9) 

    # Mark the labeled observations with a star marker 
    plt.scatter(features_pca[i,0], features_pca[i,1], 
       c=cvec[i], vmin=min(cvec), vmax=max(cvec), 
       edgecolor='', marker='*', s=100) 

# Add the axis labels 
plt.xlabel('PC 1 (%.2f%%)' % (pca.explained_variance_ratio_[0]*100)) 
plt.ylabel('PC 2 (%.2f%%)' % (pca.explained_variance_ratio_[1]*100)) 

# Done 
plt.show() 

正如你可以看到,不同的顏色可以通過c kwarg送入plt.scatter。此外,我建議edgecolor='',因爲這通常看起來更清楚。您可以使用alpha來增加/減少透明度,這會使標記的點更多/更少。

使用plt.text和適當的x和y位置將標籤簡單地放在圖上,我在這裏稍微調整一下(使用labelpad),以便標籤可以很好地放置在標記旁邊。

對於星號標記,請注意,如果您使用的是數字顏色矢量,則vminvmax非常重要,否則恆星會以錯誤的顏色結束。

這裏的結果(使用手動定義顏色):

enter image description here

相關問題