2013-06-11 64 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调用是否需要改变? –