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

10

我希望绘制小提琴图,其中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个回答

9

你可能需要同时使用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包(v0.3.0)于2019年8月10日创建


建议使用雨云图代替 https://dev59.com/JK7la4cB1Zd3GeqPj9cR - Tung

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方向上的抖动程度。


这很聪明,但并不完全正确,因为它没有正确地分组。我没有一个可工作的例子,但基本上点应该在小提琴内部抖动。就像这样:http://www.sthda.com/sthda/RDoc/figure/ggplot2/ggplot2-violin-plot-dot-plot-data-visualization-2.png - Ahdee

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