如何移动点以使它们在绘图时不重叠

Říd*_*ící 2 plot visualization r

我有 100 个值,我想以某种方式将它们可视化。

sorted <- sort(rnorm(100000))
dots <- c(rep(0, 100))
for (i in (1:100)){
  dots[i] <- sorted[i*1000-500]
}
plot(data.frame(dots, 1))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然而,这有许多相互重叠的小圆圈。因此,我想上下移动圆圈(而不是横向移动),使它们不再重叠。事实上,我希望这些圆圈甚至不互相接触。(因此,需要某种最小距离。)此外,我希望所有内容都尽可能接近原始内容。(我不是在寻找一些随机抖动。)

看起来像这样的东西(尽管这个例子没有完美优化):

在此输入图像描述

这需要某种优化,我怀疑某些现有库可能已经提供了这种优化。

问题:哪个图书馆可以有这样的例程?

jar*_*rot 5

感谢您添加预期的输出;在我看来,这就像一个蜂群情节,例如

# install.packages("beeswarm")
library(beeswarm)

sorted <- sort(rnorm(100000))
dots <- c(rep(0, 100))
for (i in (1:100)){
  dots[i] <- sorted[i*1000-500]
}

beeswarm(data.frame(dots), 
         horizontal = TRUE)
Run Code Online (Sandbox Code Playgroud)

创建于 2024-02-05,使用reprex v2.1.0

与红色的“原始”点进行比较:

beeswarm(data.frame(dots), 
         horizontal = TRUE)

# add the original points
points(data.frame(dots, 1.1), col = "red")
Run Code Online (Sandbox Code Playgroud)

创建于 2024-02-05,使用reprex v2.1.0

如果您查看 beeswarm 软件包 ( https://rdrr.io/cran/beeswarm/man/beeswarm.html ),您可以使用不同的方法 ( method = c("swarm", "compactswarm", "center", "hex", "square")) 和不同的优先级 ( priority = c("ascending", "descending", "density", "random", "none"))。您还可以更改间距,使点不接触,但请注意间距可以更改 x 位置和 y 位置。无论如何,你应该能够调整你的情节以获得你想要的结果。