可以将position_jitter与position_dodge结合使用吗?

时间:2013-09-26 02:56:31

标签: r ggplot2

我已经非常喜欢箱形图,其中抖动点覆盖在箱线图上以表示实际数据,如下所示:

set.seed(7)
l1 <- gl(3, 1, length=102, labels=letters[1:3])
l2 <- gl(2, 51, length=102, labels=LETTERS[1:2]) # Will use this later
y <- runif(102)
d <- data.frame(l1, l2, y)

ggplot(d, aes(x=l1, y=y)) + 
  geom_point(position=position_jitter(width=0.2), alpha=0.5) +
  geom_boxplot(fill=NA) 

enter image description here

(当每个框中的数据点数量非常不同时,这些特别有用。)

当我(隐含地)使用position_dodge将箱形图分开第二个变量时,我想使用这种技术,例如。

ggplot(d, aes(x=l1, y=y, colour=l2)) + 
  geom_point(position=position_jitter(width=0.2), alpha=0.5) +
  geom_boxplot(fill=NA)

enter image description here

但是,我无法弄清楚如何通过colour变量(此处为l2)来躲避点数,并且还会抖动它们。

5 个答案:

答案 0 :(得分:7)

这是一种手动执行抖动和躲避的方法。

# a plot with no dodging or jittering of the points 
dp <- ggplot(d, aes(x=l1, y=y, colour=l2)) + 
  geom_point(alpha=0.5) +
  geom_boxplot(fill=NA)

# build the plot for rendering
foo <- ggplot_build(dp)
# now replace the 'x' values in the data for layer 1 (unjittered and un-dodged points)
# with the appropriately dodged and jittered points
foo$data[[1]][['x']] <- jitter(foo$data[[2]][['x']][foo$data[[1]][['group']]],amount = 0.2)
# now draw the plot (need to explicitly load grid package)
library(grid)
grid.draw(ggplot_gtable(foo))
# note the following works without explicitly loading grid
plot(ggplot_gtable(foo))

enter image description here

答案 1 :(得分:4)

我不认为你会喜欢它,但我从来没有找到解决方法,除了为点生成你自己的x值。在这种情况下:

d$l1.num <- as.numeric(d$l1)
d$l2.num <- (as.numeric(d$l2)/3)-(1/3 + 1/6)
d$x <- d$l1.num + d$l2.num

ggplot(d, aes(l1, y, colour = l2)) + geom_boxplot(fill = NA) +
  geom_point(aes(x = x), position = position_jitter(width = 0.15), alpha = 0.5) + theme_bw()

enter image description here

它与理想相比还有很长的路要走,但很快就会成为常规。如果有人有替代解决方案,我会非常高兴!

答案 2 :(得分:3)

新的position_jitterdodge()适用于此。但是,它需要填充美学来告诉它如何对点进行分组,因此您必须指定手动填充以获得未着色的框:

ggplot(d, aes(x=l1, y=y, colour=l2, fill=l2)) + 
  geom_point(position=position_jitterdodge(width=0.2), alpha=0.5) +
  geom_boxplot() + scale_fill_manual(values=rep('white', length(unique(l2))))

答案 3 :(得分:1)

我正在使用更新版本的ggplot2(ggplot2_2.2.1.9000),我正在努力寻找一个适用于我自己的类似情节的答案。 @John Didon的回答给我带来了一个错误; Error in position_jitterdodge(width = 0.2) : unused argument (width = 0.2)。我之前使用的geom_jitter代码在下载较新版本的ggplot2后停止工作。这就是我在下面解决它的方法 - minimal-fuss code ...

ggplot(d, aes(x=l1, y=y, colour=l2, fill=l2)) + 
  geom_point(position = position_jitterdodge(dodge.width = 1, 
                                             jitter.width = 0.5), alpha=0.5) +
  geom_boxplot(position = position_dodge(width = 1), fill = NA)

enter image description here

答案 4 :(得分:0)

另一种选择是使用方面:

set.seed(7)
   l1 <- gl(3, 1, length=102, labels=letters[1:3])
   l2 <- gl(2, 51, length=102, labels=LETTERS[1:2]) # Will use this later
   y <- runif(102)
   d <- data.frame(l1, l2, y)

   ggplot(d, aes(x=l1, y=y, colour=l2)) + 
     geom_point(position=position_jitter(width=0.2), alpha=0.5) +
     geom_boxplot(fill=NA) +
     facet_grid(.~l2) +
     theme_bw()

抱歉,没有足够的积分来发布结果图。