2013-06-11 66 views
8

我有一組觀察23個變量。R - 如何使PCA雙曲線更具可讀性

當我使用prcomp和雙標圖繪製我跑的結果爲幾個問題:

  1. 實際情節只佔幀(X < 0)的一半,但情節是圍繞0,這樣的空間一半被浪費了

  2. 兩個變量clearily稱霸的結果,因此所有其他箭頭聚集在一起,我看不懂的事情

廣告1.我嘗試設置xlim和/或ylim,但是我顯然做錯了,因爲當我做這件事情時,情節全部搞砸了。

ad 2.我能不知怎麼讓箭頭標籤放得更加分開我可以讀它們嗎?或者,也許我可以繪製箭頭沒有兩個最長的(放大類型)?

My PCA plot

附錄:是有可能有雙標圖繪製的標籤以不同的顏色比箭?

另外:如果x軸和y軸不成比例(它們的圖表顯示x和y上的不同長度的間隔)是否有問題。 我認爲這會歪曲天使之間的箭頭,這種調整大小不是一個相似性轉換。 是否有可能強制雙線圖保持1:1的寬高比,或者將繪圖繪製爲矩形而不是正方形?

回答

19

我認爲你可以使用xlimylim。另外,請查看?biplotexpand參數。不幸的是,你沒有提供任何數據,因此我們需要一些樣本數據:

a <- princomp(USArrests) 

下面的只是打電話biplot結果:

biplot(a) 

enter image description here

而現在人們可以「放大「使用xlimylim以及使用從?biplot

012的縮放參數 expand來更仔細地查看」謀殺「和」強姦「
biplot(a, expand=10, xlim=c(-0.30, 0.0), ylim=c(-0.1, 0.1)) 

enter image description here

請注意,頂部和右側軸不同的縮放由於expand因素。

這是否有助於讓您的情節母馬可讀?

編輯

你還問是否可以有標籤和箭頭不同的顏色。biplot不支持這一點,你可以做的是複製stats:::biplot.default的代碼,然後根據您的需求進行更改(當使用plotaxistext時,更改col參數)。

或者,您可以使用ggplot作爲雙標圖。在帖子here中,實現了簡單的雙插槽功能。你可以按如下方式更改代碼:

PCbiplot <- function(PC, x="PC1", y="PC2", colors=c('black', 'black', 'red', 'red')) { 
    # PC being a prcomp object 
    data <- data.frame(obsnames=row.names(PC$x), PC$x) 
    plot <- ggplot(data, aes_string(x=x, y=y)) + geom_text(alpha=.4, size=3, aes(label=obsnames), color=colors[1]) 
    plot <- plot + geom_hline(aes(0), size=.2) + geom_vline(aes(0), size=.2, color=colors[2]) 
    datapc <- data.frame(varnames=rownames(PC$rotation), PC$rotation) 
    mult <- min(
     (max(data[,y]) - min(data[,y])/(max(datapc[,y])-min(datapc[,y]))), 
     (max(data[,x]) - min(data[,x])/(max(datapc[,x])-min(datapc[,x]))) 
     ) 
    datapc <- transform(datapc, 
      v1 = .7 * mult * (get(x)), 
      v2 = .7 * mult * (get(y)) 
      ) 
    plot <- plot + coord_equal() + geom_text(data=datapc, aes(x=v1, y=v2, label=varnames), size = 5, vjust=1, color=colors[3]) 
    plot <- plot + geom_segment(data=datapc, aes(x=0, y=0, xend=v1, yend=v2), arrow=arrow(length=unit(0.2,"cm")), alpha=0.75, color=colors[4]) 
    plot 
} 

劇情如下:

fit <- prcomp(USArrests, scale=T) 
PCbiplot(fit, colors=c("black", "black", "red", "yellow")) 

enter image description here

如果你身邊有這個功能有點玩,我相信你能弄清楚如何設置xlimylim值等。

+0

謝謝,之前我在控制檯中收到很多警告,但現在它的工作。 也許你也可以解釋關於顏色的附加問題。 –

+0

@Colors - 這就是我的預期,感謝您的現成代碼 順便說一句,「複製源代碼並修改它」在R?我並沒有質疑你的anwser的有效性,但從軟件工程的角度來看這是一個相當可疑的做法。 –

+0

在最後一個筆記中,我不指望有可能有一個矩形與雙標圖。 在你的例子中,geom_hline和geom_vline調用是否需要改變? –