【问题标题】:Graphing individual points on a grouped violin plot在分组小提琴图上绘制各个点
【发布时间】:2021-04-10 13:09:07
【问题描述】:

经过大量查找,我似乎无法找到我的问题的确切答案,所以我想我会问。

我想使用 ggplot2 制作具有两个条件(“控制 RNAi”和“mex-6 RNAi”)的时间进程的分组小提琴图。每个数据点都来自 3 个不同的副本(数据帧中的“蠕虫”因子),所以我的数据帧格式如下所示(“mean_mex6”是绘制的 Y 值):

mean_mex6 RNAi Time Worm
2.4102356 Control RNAi 2hr worm1
0.8332575 Control RNAi 2hr worm1
2.5093177 Control RNAi 2hr worm1
0.8792359 Control RNAi 2hr worm1
1.2570116 Control RNAi 2hr worm1
1.0671826 Control RNAi 2hr worm1

数据框中还有很多行,但我在上面向您展示的数据只是在“2小时”时间点来自“Control RNAi”上的“worm1”的一些数据点。

我希望在小提琴图的每个 RNAi 组中绘制所有单独的点,但我希望将它们绘制成每个“蠕虫”样本的每个数据点与其他蠕虫的颜色不同。我已经能够创建一个分组小提琴图,其中绘制了所有单独的点,但没有为每个单独的蠕虫样本进行颜色编码:

library(ggplot2)

ggplot(compiled_allhours, aes(x=Time, y=mean_mex6, colour=RNAi)) + 
  geom_violin(trim=FALSE) +
  scale_x_discrete(limits=c("2hr", "4hr","6hr", "8hr","24hr")) + ##This chooses which data to plot and orders them
  geom_quasirandom(aes(x=Time, y=mean_mex6, colour = RNAi), dodge.width = 0.9, varwidth = TRUE) +
  ggtitle(expression(paste(italic("mex-6"), " nuclear signal", " - WT"))) +
  theme(plot.title = element_text(hjust = 0.5)) + ##Centers the title of the plot
  xlab("Time") +
  ylab(expression(paste("normalized ", italic("mex-6"), " nuclear signal (A.U.)")))

我附上了这张图的图片。[图 1]https://i.stack.imgur.com/yvfYW.png

如果我尝试通过蠕虫为各个点着色,会发生以下情况:

library(ggplot2)

ggplot(compiled_allhours, aes(x=Time, y=mean_mex6, colour=RNAi)) + 
  geom_violin(trim=FALSE) +
  scale_x_discrete(limits=c("2hr", "4hr","6hr", "8hr","24hr")) + ##This chooses which data to plot and orders them
  geom_quasirandom(aes(x=Time, y=mean_mex6, colour = Worm), dodge.width = 0.9, varwidth = TRUE) +
  ggtitle(expression(paste(italic("mex-6"), " nuclear signal", " - WT"))) +
  theme(plot.title = element_text(hjust = 0.5)) + ##Centers the title of the plot
  xlab("Time") +
  ylab(expression(paste("normalized ", italic("mex-6"), " nuclear signal (A.U.)")))

[情节2]https://i.stack.imgur.com/aVJwG.png

所以基本上,我想要第二个图,但所有这些点都合并到小提琴图中,如第一张图所示。感谢您的帮助!

【问题讨论】:

    标签: r ggplot2 violin-plot


    【解决方案1】:

    问题是在您的第二个图中,geom_violingeom_quasirandom 应用了不同的分组。因此,这些点和小提琴的“躲避”方式不同,并且彼此不对齐。

    要获得您想要的结果,您必须使用 group 美学,即使用 TimeRNAi 进行分组,例如interaction.

    此外,我没有将Worm 映射到颜色上,而是将其映射到fill(对我来说更有意义,因为 Worm 和 RNai 是不同的变量)并使用填充点(shape=21),它给出了不同的图例。但请随时切换回color 来更改它。

    使用更真实的随机数据集,包括不同变量的“所有”选项,试试这个:

    set.seed(42)
    compiled_allhours <- data.frame(
      mean_mex6 = runif(200),
      RNAi = sample(c("Control RNAi", "mex-6 RNAi"), 200, replace = TRUE),
      Time = sample(c("2hr", "4hr", "6hr", "8hr", "24hr"), 200, replace = TRUE),
      Worm = sample(c("worm1", "worm2", "worm3"), 200, replace = TRUE)
    )
    library(ggplot2)
    library(ggbeeswarm)
    
    ggplot(compiled_allhours, aes(x=Time, y=mean_mex6, group=interaction(RNAi, Time))) + 
      geom_violin(aes(color = RNAi), trim=FALSE) +
      scale_x_discrete(limits=c("2hr", "4hr","6hr", "8hr","24hr")) + ##This chooses which data to plot and orders them
      geom_quasirandom(aes(x=Time, y=mean_mex6, fill = Worm), shape = 21, color = "transparent", dodge.width = 0.9, varwidth = TRUE) +
      ggtitle(expression(paste(italic("mex-6"), " nuclear signal", " - WT"))) +
      theme(plot.title = element_text(hjust = 0.5)) + ##Centers the title of the plot
      xlab("Time") +
      ylab(expression(paste("normalized ", italic("mex-6"), " nuclear signal (A.U.)")))
    

    reprex package (v0.3.0) 于 2021-01-04 创建

    【讨论】:

    • 太棒了,谢谢!这看起来真的很好!如果你不介意,我还有一个问题!当我在我的数据上运行它时,我得到了我所要求的,但是这些点以蠕虫的顺序相互重叠(即,如果蠕虫 1 是蓝色而蠕虫 2 是洋红色,它将首先绘制所有蓝色点,那么它将用洋红色点覆盖蓝色点)。有没有办法让 geom_quasirandom 绘制它,以便点随机堆叠在彼此之上(即,它不是蓝色之上的所有洋红色,而是两者的混合)?在 geom_quasirandom 中找不到此信息。谢谢!
    • 不客气。关于过度绘图的问题。这些点按照它们在数据集中出现的顺序绘制。因此,您可以尝试重新调整数据集,例如sample_n(compiled_allhours, nrow(compiled_allhours)) 将随机重新排序您的 df。此外,处理过度绘图的一种策略是添加一些不透明度,即您可以添加例如alpha=.5 到 geom_quasirandom。
    猜你喜欢
    • 2023-01-03
    • 2021-06-01
    • 2023-03-06
    • 2017-08-30
    • 2018-04-15
    • 2019-12-18
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多