我有一组23个变量的观察结果.
当我使用prcomp和biplot绘制结果时,我遇到了几个问题:
实际绘图仅占据帧的一半(x <0),但绘图以0为中心,因此浪费了一半的空间
两个变量明显地支配着结果,因此所有其他箭头都聚集在一起,我无法读取一个东西
ad 1.我试过设置xlim和/或ylim,但我显然做错了,因为当我做的时候情节都搞砸了
ad 2.我可以以某种方式使箭头标签更加分开,以便我可以阅读它们吗?或者也许我可以只绘制没有两个最长的箭头(放大类型)?

附录:是否有可能让双标签以不同于箭头的颜色绘制标签?
另外:如果x和y轴不成比例,它是否有问题(它们的图表显示x和y上不同长度的间隔).我认为这会使箭头之间的天使产生偏差,而这种调整大小并不是一种相似性的转变.是否可以强制双色图保持1:1的宽高比,或者将图形绘制为矩形而不是正方形?
use*_*275 23
我想你可以使用xlim和ylim.另外,看一下expand参数?biplot.不幸的是,你没有提供任何数据,所以我们来看一些样本数据:
a <- princomp(USArrests)
Run Code Online (Sandbox Code Playgroud)
下面只是调用的结果biplot:
biplot(a)
Run Code Online (Sandbox Code Playgroud)

现在,人们可以"放大"成在"谋杀"和"强奸"仔细一看使用xlim和ylim,还可以使用缩放参数expand来自?biplot:
biplot(a, expand=10, xlim=c(-0.30, 0.0), ylim=c(-0.1, 0.1))
Run Code Online (Sandbox Code Playgroud)

请注意由于该expand因素导致的顶轴和右轴的不同缩放比例.
这有助于使你的情节可读吗?
编辑
您还询问是否可以为标签和箭头设置不同的颜色.biplot不支持此功能,你可以做的是复制的代码stats:::biplot.default,然后根据需要进行更改(改变col参数时plot,axis和text使用).
或者,您可以使用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
}
Run Code Online (Sandbox Code Playgroud)
情节如下:
fit <- prcomp(USArrests, scale=T)
PCbiplot(fit, colors=c("black", "black", "red", "yellow"))
Run Code Online (Sandbox Code Playgroud)

如果你使用这个功能玩一下,我相信你可以弄清楚如何设置xlim和ylim值等.