这是一个小数据集:
myd <- data.frame(PC1 = rnorm(5, 5, 2),
PC2 = rnorm (5, 5, 3), label = c("A", "B", "C", "D", "E"))
plot(myd$PC1, myd$PC2)
text( myd$PC1-0.1, myd$PC2, lab = myd$label)
我想连接直线(欧几里德)距离线之间的所有可能组合,以产生这样的图形(最好是基本图形或ggplot2)
答案 0 :(得分:6)
以下是基础图解决方案:
plot(myd$PC1, myd$PC2)
apply(combn(seq_len(nrow(myd)), 2), 2,
function(x) lines(myd[x, ]$PC1, myd[x, ]$PC2))
这是ggplot2解决方案:
ps <- data.frame(t(apply(combn(seq_len(nrow(myd)), 2), 2,
function(x) c(myd[x, ]$PC1, myd[x, ]$PC2))))
qplot(myd$PC1, myd$PC2) +
geom_segment(data = ps, mapping = aes(x = X1, xend = X2, y = X3,yend = X4))
答案 1 :(得分:2)
在ggplot中,您可以使用geom_segment
绘制连接线。
但首先,您必须使用每条连接线的坐标构建数据框。使用combn()
查找所有组合:
comb <- combn(nrow(myd), 2)
connections <- data.frame(
from = myd[comb[1, ], 1:2],
to = myd[comb[2, ], 1:3]
)
names(connections) <- c("x1", "y1", "x2", "y2", "label")
然后绘制:
library(ggplot2)
ggplot(myd, aes(PC1, PC2)) +
geom_point(col="red", size=5) +
geom_segment(data=connections, aes(x=x1, y=y1, xend=x2, yend=y2), col="blue")