R - 如何使PCA双标签更具可读性

时间:2013-06-11 23:07:15

标签: r plot pca

我有一组包含23个变量的观察结果。

当我使用prcomp和biplot绘制结果时,我遇到了几个问题:

  1. 实际绘图仅占据帧的一半(x <0),但绘图以0为中心,因此浪费了一半的空间

  2. 两个变量明显支配结果,所以所有其他箭头都聚集在一起,我看不懂东西

  3. ad 1.我尝试设置xlim和/或ylim,但我显然做错了,因为当我这么做时情节搞砸了

    ad 2.我可以以某种方式将箭头标签放置得更加分开,以便我可以阅读它们吗?或者我可以只绘制没有两个最长的箭头(放大类型)?

    My PCA plot

    附录:是否可以让双标签以不同于箭头的颜色绘制标签?

    另外:如果x和y轴不成比例,它是否有问题(它们的图表显示x和y上不同长度的间隔)。 我认为这会使箭头之间的天使产生偏差,而这种调整大小并不是一种相似性的转变。 是否可以强制双色图保持1:1的宽高比,或者将图形绘制为矩形而不是正方形?

1 个答案:

答案 0 :(得分:23)

我认为您可以使用xlimylim。另外,请查看expand的{​​{1}}参数。不幸的是,您没有提供任何数据,所以我们来看一些示例数据:

?biplot

在调用a <- princomp(USArrests)

的结果下方
biplot

enter image description here

现在可以“放大”以使用biplot(a) xlim仔细查看“谋杀”和“强奸”,并使用ylim中的缩放参数expand 1}}:

?biplot

enter image description here

请注意由于biplot(a, expand=10, xlim=c(-0.30, 0.0), ylim=c(-0.1, 0.1)) 因素导致顶部和右轴的缩放比例不同。

这有助于使你的情节可读吗?

修改

您还询问是否可以为标签和箭头设置不同的颜色。 expand不支持此功能,您可以做的是复制biplot的代码,然后根据您的需要进行更改(stats:::biplot.default时更改col参数,{{使用1}}和plot)。

或者,您可以将axis用于双色标记。在帖子here中,实现了一个简单的双标图功能。您可以按如下方式更改代码:

text

情节如下:

ggplot

enter image description 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")) 值等。