如何在x轴上分散(抖动)点?

21

我在R中有以下代码片段:

dat <- data.frame(cond = factor(rep("A",10)), 
                  rating = c(1,2,3,4,6,6,7,8,9,10))
ggplot(dat, aes(x=cond, y=rating)) +
  geom_boxplot() + 
  guides(fill=FALSE) +
  geom_point(aes(y=3)) +
  geom_point(aes(y=3)) +
  geom_point(aes(y=5))

此代码片段生成一个箱线图,在该图中一个点3覆盖了另一个点3的位置。

我应如何移动点3,使该点在y轴上仍保持相同位置,但其在x轴上稍微向左或向右移动?

3个回答

31

通过使用position_jitter函数可以实现此目的:

geom_point(aes(y=3), position = position_jitter(w = 0.1, h = 0))

更新: 要仅绘制这三个提供的点,您可以构造一个新数据集并绘制:

points_dat <- data.frame(cond = factor(rep("A", 3)), rating = c(3, 3, 5))                  
ggplot(dat, aes(x=cond, y=rating)) +
  geom_boxplot() + 
  guides(fill=FALSE) +
  geom_point(aes(x=cond, y=rating), data = points_dat, position = position_jitter(w = 0.05, h = 0)) 

非常感谢您的快速回复。是的,我也尝试过这种方法。问题在于当我使用jitter函数时,它会绘制许多点。因此,在我的示例中,我有三个点,其中两个位于位置3,但是当我添加position_jitter时,它会绘制超过10个点。您有任何想法为什么会这样吗? - chao
正是我所需要的!谢谢! - chao

7

ggplot2现在包括position_dodge()。从说明中可以得知:“Dodging保留一个geom的垂直位置,同时调整水平位置。

因此,您既可以使用geom_point(position = position_dodge(0.5)),也可以像以下这样使用,如果要躲避由线连接的点并需要将躲避相同的值应用于两个图形,则可以使用:

dat <- data.frame(cond = rep(c("A", "B"), each=10), x=rep(1:10, 2), y=rnorm(20))
dodge <- position_dodge(.3) # how much jitter on the x-axis?
ggplot(dat, aes(x, y, group=cond, color=cond)) + 
  geom_line(position = dodge) + 
  geom_point(position = dodge)

1

ggplot2现在有一个单独的geom,称为geom_jitter,因此您不需要使用position = dodgeposition = position_dodge())参数。这里应用于OP的示例:

dat <- data.frame(cond = factor(rep("A",10)), 
                  rating = c(1,2,3,4,6,6,7,8,9,10))
ggplot(dat, aes(x=cond, y=rating)) +
  geom_boxplot() + 
  guides(fill=FALSE) +
  geom_jitter(aes(y=c(3, 3, 5)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接