如何使PCA双标图更易读

16

我有一组包含23个变量的观测数据。

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

  1. 实际的图表只占据了一半的框架(x < 0),但是图表在0点处居中,所以浪费了一半的空间

  2. 两个变量显然主导了结果,所以所有其他箭头被挤在一起,无法阅读

ad 1. 我尝试设置xlim和/或ylim,但显然我做错了什么,因为我这样做时图表出了问题

ad 2. 我可以通过某种方式让箭头标签分开放置以便于阅读吗?或者我可以仅绘制除了最长的两条之外的箭头(类似于缩小)?

My PCA plot

补充说明:是否可以让biplot将标签绘制成不同颜色而不是箭头?

此外:如果x轴和y轴的比例不成比例(图形在x轴和y轴上的间隔长度不同),是否会存在问题? 我认为这将使箭头之间的角度偏斜,并且这种调整不是相似变换。 是否可以强制biplot保持1:1的纵横比,或将绘图作为矩形而不是正方形进行绘制?

1个回答

26

我认为您可以使用 xlimylim。此外,请查看 ?biplot 中的 expand 参数。不幸的是,您没有提供任何数据,因此让我们使用一些示例数据:

a <- princomp(USArrests)

以下是仅调用biplot的结果:

biplot(a)

enter image description here

现在,使用xlimylim可以“放大”以更仔细地查看“谋杀”和“强奸”,还可以使用?biplot中的缩放参数expand

biplot(a, expand=10, xlim=c(-0.30, 0.0), ylim=c(-0.1, 0.1))

请注意由于expand因子不同,顶部和右侧轴的比例尺不同。
这有助于使您的图表更易读吗?
编辑:
您还问是否可以为标签和箭头使用不同的颜色。biplot不支持此操作,但您可以复制stats:::biplot.default代码,并根据需要进行更改(在使用plotaxistext时更改col参数)。
或者,您可以使用ggplot绘制双图。在这里的帖子中,实现了一个简单的双图函数。您可以按以下方式更改代码:
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"))

输入图像描述

如果您稍微尝试一下这个函数,我相信您可以弄清如何设置xlimylim值等。


谢谢,之前我在控制台收到了很多警告,但现在它已经正常工作了。 也许你还可以回答一下关于颜色的问题。 - Jakub Bochenski
@Colors - 这正是我所期望的,感谢您提供现成的代码。 顺便问一下,在 R 中“复制源代码并进行修改”是什么意思?我不是在质疑您的答案的有效性,但从软件工程的角度来看,这是一种相当可疑的做法。 - Jakub Bochenski
最后一点,我不认为能够在双图中拥有一个矩形图。我需要更改你的示例中的geom_hline和geom_vline调用吗? - Jakub Bochenski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接