ggplot2:如何将小点与小提琴图分组?

时间:2019-08-10 19:22:16

标签: r ggplot2 violin-plot

我想绘制x轴为exon的小提琴图,但是我想对这些图进行分组。如果它只是小提琴,这是可行的,但是当我出于某种原因添加抖动时,它没有响应正确的aes并自行绘制吗?这是一个可复制的代码,其中包含错误的屏幕快照。谢谢!

set.seed(1)
df <- data.frame(
  exons = c(rep("e1", 200), rep("e2", 200)),
  values = rnorm(400, 200, 40),
  group = c(
    rep("g1", 75), rep("g2", 75), rep("g3", 50),
    rep("g1", 75), rep("g2", 75), rep("g3", 50)
  )
)

ggplot(df, aes(y = values, x = exons, fill = group)) +
  geom_violin() +
  geom_jitter(shape = 16, position = position_jitter(0.07))

因此,如果该图有效,则应该在每个外显子的每个组内绘制点,但是这里显然不是。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可能同时需要position_dodge()position_jitterdodge()

library(ggplot2)
ggplot(df, aes(y = values, x = exons, fill = group)) +
  geom_violin(position = position_dodge(width = 0.9)) +
  geom_point(position = position_jitterdodge(seed = 1, dodge.width = 0.9))

另一个值得一提的选择是ggbeeswarm软件包中的geom_quasirandom()函数

library(ggbeeswarm)
ggplot(df, aes(y = values, x = exons, fill = group)) +
  geom_violin(position = position_dodge(width = 0.9)) +
  geom_quasirandom(dodge.width = 0.9, varwidth = TRUE)

reprex package(v0.3.0)于2019-08-10创建

答案 1 :(得分:0)

您的意思是这样吗?

set.seed ( 1)
df = data.frame ( 
  exons = c(rep("e1", 200), rep("e2", 200))
  ,values = rnorm(400,200,40)
  ,group = c(rep("g1", 75), rep("g2", 75), rep("g3",50),
             rep("g1", 75), rep("g2", 75), rep("g3",50) )
)

ggplot(df, aes(y= values  , x= exons , fill = group )) +
  geom_violin()+ 
  geom_jitter(shape=16, position=position_jitter(width = NULL, height = NULL))

您可以定义x和y方向上的抖动程度。