在R中的ggplot2 geom_dotplot中使用填充美学时重叠点

时间:2016-07-20 09:38:05

标签: r ggplot2

当我使用aes(fill=...)表示geom_dotplot中的因子级别时,不同因子级别的点会相互重叠。特别是对于大型数据集,这会变得很麻烦。

下面我列出了一个最小的例子和图,其中我首先绘制一个没有着色因子水平的数据集,然后我添加fill来指示因子水平,这导致点相互重叠。我怎么能避免这个?

我知道类似的问题here;但是,给出的答案并没有解决这个问题。

library("ggplot2")

n <- 200
x <- data.frame(x = sample(x = letters[1:3], size = n, replace = TRUE),
                y = rnorm(n = n, mean = 0, sd = 1),
                a = sample(x = letters[4:5], size = n, replace = TRUE))

p1 <- ggplot(x, aes(x = x, y = y))
p1 <- p1 + geom_dotplot(binaxis = "y", stackdir = "center")
p2 <- ggplot(x, aes(x = x, y = y, fill = a))
p2 <- p2 + geom_dotplot(binaxis = "y", stackdir = "center")

minimal_example_dotplot

1 个答案:

答案 0 :(得分:3)

以某种方式这种参数组合,stackgroups = T与binpositions =“all”相结合,给出了一个很好的结果,但只集中在x变量的中心级别。

ggplot(x, aes(x = x, y = y, fill=a)) + 
  geom_dotplot(binaxis = "y", 
               stackdir = "centerwhole", 
               method="dotdensity",
               stackgroups = T,
               binpositions="all")

enter image description here

一点点复杂的构造可以产生类似于你想要的结果:它使用grid.arrange和一个特殊的函数来共享一个共同的图例(grid_arrange_shared_legend的代码见here}功能)

for (i in 1:3){
  assign(paste0("g", i), ggplot(x %>% filter(x==levels(x$x)[i]), aes(x = x, y = y, fill=a)) + coord_cartesian(ylim=c(-3.5, 3.5))+
  geom_dotplot(binaxis = "y", stackdir = "center", method="dotdensity", stackgroups = T, binpositions="all"))
}
grid_arrange_shared_legend(g1, g2, g3)

enter image description here