问题描述
经过大量查找后,我似乎无法找到问题的确切答案,所以我想我会问。
我想使用 ggplot2 制作具有两个条件(“Control RNAi”和“mex-6 RNAi”)的时间课程的分组小提琴图。每个数据点都来自 3 个不同的重复(数据帧中的“蠕虫”因子),因此我拥有的数据帧格式如下(“mean_mex6”是绘制的 Y 值):
mean_mex6 | RNAi | 时间 | 蠕虫 |
---|---|---|---|
2.4102356 | 控制RNAi | 2 小时 | worm1 |
0.8332575 | 控制RNAi | 2 小时 | worm1 |
2.5093177 | 控制RNAi | 2 小时 | worm1 |
0.8792359 | 控制RNAi | 2 小时 | worm1 |
1.2570116 | 控制RNAi | 2 小时 | worm1 |
1.0671826 | 控制RNAi | 2 小时 | worm1 |
数据框中还有更多行,但我上面向您展示的数据只是来自“2hr”时间点的“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,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,colour = Worm)," nuclear signal (A.U.)")))
[情节 2] https://i.stack.imgur.com/aVJwG.png
所以基本上,我想要第二个图,但是所有这些点都合并到了小提琴图中,如第一张图所示。感谢您的帮助!
解决方法
问题在于第二个图中的 geom_violin
和 geom_quasirandom
应用了不同的分组。因此,点和小提琴以不同的方式“躲避”并且彼此不对齐。
要获得所需的结果,您必须使用 group
美学,即使用 Time
和 RNAi
进行分组,例如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"),Worm = sample(c("worm1","worm2","worm3"),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","24hr")) + ##This chooses which data to plot and orders them
geom_quasirandom(aes(x=Time,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 年 1 月 4 日创建