如何把你的箱线图变成plus版? 箱线图到直方图加散点图再加误差线的美化之路
- 前言
- 数据准备
- 箱线图美化
-
- 01 一个平平无奇的箱线图
- 02 给箱线图加上误差线
- 03 加上散点的信息
- 04 去除网格线和背景,更改颜色
- 05 箱线图变带误差线、散点的柱形图
- 参考资料
前言
由于自己科研工作的需要,经常需要画一些箱线图,比较2个样本的基因表达量啊什么的,这个时候,就会想说如何实现箱线图的美化,以及最近看到一个把正常基因表达量的箱线图画成了直方图加散点图再加误差线的形式,因此想趁空闲来写下我的ggplot2的箱线图的美化之路。
数据准备
首先先生成一个测试数据集
1 2 3 | data <- c(rnorm(200)) name <- c(rep("control", 99),rep("treat",101)) res <- data.frame(data,name) |
得到的数据集就是这样子的:
箱线图美化
01 一个平平无奇的箱线图
1 2 | library(ggplot2) g <- ggplot(res, aes(name, data))+geom_boxplot(aes(fill = name )) |
02 给箱线图加上误差线
1 2 3 | library(ggsignif) compared_list = list(c("control", "treat")) #设定比较组 g + geom_signif(comparisons = compared_list, test = t.test, step_increase = 0.2) |
如果想要p值以星号来显示显著性,可以增加一个参数:
map_signif_level=T
1 | g <- g + geom_signif(comparisons = compared_list, test = t.test, step_increase = 0.2, map_signif_level=T) |
03 加上散点的信息
1 | g <- g + geom_jitter(aes(fill=name),width =0.2,shape = 21,size=1) |
04 去除网格线和背景,更改颜色
选颜色的时候,为了解决我的纠结和拯救大家谜一般的审美,这里祭出我的ggsci大法。
ggsci是ggplot的主题包,它提供一系列高质量的调色板,其灵感来自于科学期刊、数据可视化库、科幻电影和电视节目中使用的颜色。ggsci中的调色板可以作为ggplot2 scales使用。
不过我这里只有2个组,完全不能体现出它的便利和美,但真的很推荐大家尝试,一句get杂志同款颜色,顺带拯救审美。
1 2 3 4 5 | #去除网格线和背景 g <- g+ theme_bw() + theme(panel.grid.major =element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(),axis.line = element_line(colour = "black")) #更换颜色 library(ggsci) g <- g + scale_fill_npg() |
反正我觉得是有美了的……
05 箱线图变带误差线、散点的柱形图
首先需要计算下数据
1 2 | library(Rmisc) input <- summarySE(res, measurevar="data", groupvars=c("name")) |
得到的input就是这样子:
这里看到均值一个大于0,一个小于0,画成柱形图会很尴尬,所以我稍微换了个数据……
1 2 3 4 5 6 7 8 9 10 | data <- c(rnorm(99,10,3),rnorm(101,20,5)) name <- c(rep("control", 99),rep("treat",101)) res <- data.frame(data,name) input <- summarySE(res, measurevar="data", groupvars=c("name")) g <- ggplot(input, aes(name, data, fill=name)) + geom_bar(position=position_dodge(), stat="identity") + geom_errorbar(aes(ymin=data-se, ymax=data+se), width=.3, # 设置误差线的宽度 position=position_dodge(.9)) + theme_bw() +theme(panel.grid.major =element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(),axis.line = element_line(colour = "black")) |
最后要把散点和显示显著性的给加上,这里其实就是在ggplot中2个图叠加,不过2个图共用坐标轴。这里需要告诉ggplot后面加的geom是基于一个不同的数据集
1 2 3 | g <- g + geom_signif(comparisons = compared_list, test = t.test, step_increase = 0.2) + geom_jitter(data = res, aes(name,data,fill=name),width =0.2,shape = 21,size=1) + geom_signif(data = res, aes(name,data),comparisons = compared_list, test = t.test, step_increase = 0.2) |
得到结果图:
最后倔强地美化一下:
1 | g <- g + scale_fill_aaas() +labs(subtitle="My final figure",x="Sample Name", y="Sample size") |
好了,快乐下班,如果还是觉得不ok,这里推荐Adobe Illustrator,神器up!
参考资料
在R中使用ggplot2覆盖两个图
教你用科学杂志喜欢的配色作图——R包ggsci