R 如何解决重叠问题

R 如何解决重叠问题,r,R,我尝试了一切,用cex缩小字体大小,改变位置,改变ylim,xlim以适应大小,我还尝试了改变边距,这对我没有什么帮助,所以我摆脱了它们。在这一点上,我不知道如何使用BaseR工具来实现这一点。我确实知道ggplot方法,这更简单。但是我想知道我是否可以用基本的plot(),text()代码执行相同的任务。要找到太近的邻居,可以对数据运行kmeans()聚类分析。不过,这真是一个骇客 首先,将数据子集化 plot(USArrests$Murder, USArrests$UrbanPop,


我尝试了一切,用cex缩小字体大小,改变位置,改变ylim,xlim以适应大小,我还尝试了改变边距,这对我没有什么帮助,所以我摆脱了它们。在这一点上,我不知道如何使用BaseR工具来实现这一点。我确实知道
ggplot
方法,这更简单。但是我想知道我是否可以用基本的
plot()
text()
代码执行相同的任务。

要找到太近的邻居,可以对数据运行
kmeans()
聚类分析。不过,这真是一个骇客

首先,将数据子集化

plot(USArrests$Murder, USArrests$UrbanPop, 
     xlab="murder", ylab="% urban population", pch=20, col="grey",
     ylim=c(20, 100), xlim=c(0, 20))
text(USArrests$Murder, USArrests$UrbanPop, labels=rownames(USArrests), 
     cex=0.7, pos=3)
使用
kmeans()
分析集群,选项
centers
分配集群的数量,并使用该选项

set.seed(42)
集合

l <- split(dat, dat$cl)
l <- lapply(l, function(x) within(x, {
  if (nrow(x) == 1)
    pos <- 2  # for those with just one observation in cluster
  else
    pos <- as.numeric(as.character(factor((1:nrow(x)) %% 2, labels=c(2, 4))))
}))
这给了我:


我相信你可以进一步优化它。

一个非常相关的答案是@MarcoSandri给出的,不幸的是他又把它取了下来。我赞同他的建议,将
ggplot
ggrepel
一起使用。据我所知,在base R
plot
中很难实现/自动实现您的要求。
dat$cl <- kmeans(dat, centers=10, nstart=5)$cluster
l <- split(dat, dat$cl)
l <- lapply(l, function(x) within(x, {
  if (nrow(x) == 1)
    pos <- 2  # for those with just one observation in cluster
  else
    pos <- as.numeric(as.character(factor((1:nrow(x)) %% 2, labels=c(2, 4))))
}))
dat <- do.call(rbind, unname(l))
png("plot.png", 800, 800, "px")
plot(dat$Murder, dat$UrbanPop, xlab="murder", ylab="% urban population", 
     pch=20, col="grey",  ylim=c(20, 100), xlim=c(0, 20))
# the sapply assigns the text position according to `pos` column
sapply(c(4, 2), function(x) 
  with(dat[dat$pos == x, ], 
       text(Murder, UrbanPop, labels=rownames(dat[dat$pos == x, ]),
            cex=0.7, pos=x)))
dev.off()