分享

Boxplot | 用R画一个漂亮的boxplot

 yjt2004us 2019-09-23
组学派 纪剑

Boxplot我想应该是做科研的最常用的可视化方式之一吧(具体自行百度),尤其是在做组学研究,常常要比较两组或多组间的某一个因素(代谢物、基因、蛋白质等)的强度,而且有时间还需要对其做显著性分析。

其实,可以做boxplot的软件非常多,OriginGraphPadexcel等等,性能和效果各有多长。但是在现在常见做boxplot的方法中,R是非常好的策略,没有之一。其优势在于,可以个性化设置,可以批量出图,仅仅这两点已经是大部分做组学且对图表有高癖好的同学们爱不释手的了。

先让我们看看常见的boxplot有哪些风格呢?在必应的国际版images检索“boxplot”得到的结果是这样的:

这一眼看到,还真的没有哪几个是看的上眼的,尤其是想用来发高水平文章的。那我们看看高水平文章的boxplot是什么样子的,姑且就先看看前几天代谢组圈子里吵得比较热的一篇Nature communication的文章(https:///10.1038/s41467-019-09550-x)中的boxplot做的效果,请看下图:

如论是配色、线条粗细、字体大小、还有表现风格都非常的小清醒。那么今天我们就来好好用R来学学(模仿)这个boxplot,看看是否能达到原图的效果,因为没有原始数据,我们姑且用ToothGrowthdata来演示(R内置,无需下载)。

---------------------------------------------------------------

首先,我们可以看到这个图应该是基于ggplot2完成的(猜测的),我们可以借用ggplot2开发的作图包ggpubr,和配套ggpubrmagrittr包。我们发现图中有显著性分析,推测可能会用到ggsignif包,接下来我们就这4个包开展boxplot图的绘制。

安装包(pacman请自行安装)

pacman::p_load(ggplot2, ggpubr, magrittr, ggsignif)

安装好这4个作图的包之后,开始观察数据:

View(ToothGrowth)

将数据中第三列属性设置成factor

ToothGrowth$dose <- as.factor(ToothGrowth$dose)

如果我们查看dose组的factors有哪些,可以看到如下:

下面我们就要根据数据来出图:

01
第一步

ggboxplot(ToothGrowth, #数据对象

          x = 'dose', # 选择x轴用那一列数据

          y = 'len', #选择y轴用什么数据

          fill = 'dose', #颜色根据哪一列决定

          bxp.errorbar = T, #是否添加error bar

          bxp.errorbar.width = 0.2, #error bar的长度

          palette = 'npg', #颜色风格

          add = 'point' # 是否添加boxplot上面的点点

          )

我们会得到下面的图:

似乎基本形成已经形成了,下面我们就需要美化这张boxplot

02
第二步

先把默认的x轴和y轴的标题改好:

ggboxplot(ToothGrowth, #数据对象

          x = 'dose', # 选择x轴用那一列数据

          y = 'len', #选择y轴用什么数据

          fill = 'dose', #颜色根据哪一列决定

          bxp.errorbar = T, #是否添加error bar

          bxp.errorbar.width = 0.2, #error bar的长度

          palette = 'npg', #颜色风格

          add = 'point' # 是否添加boxplot上面的点点

          ) +

labs(title = 'Effect of Vitamin C on Tooth Growth', # 添加主标题

         subtitle = 'Plot of length by dose', # 添加次标记

         caption = 'Data source: ToothGrowth', #添加脚注

         x = 'Dose (mg)', # x轴的名字

         y = 'Teeth length' # y轴的名字

         )

接着我们就得到下面的图:

03
第三步

我们需要添加显著性分析,假设我们dose=12的组需要跟dose=0.5的组进行比较:

ggboxplot(ToothGrowth, #数据对象

          x = 'dose', # 选择x轴用那一列数据

          y = 'len', #选择y轴用什么数据

          fill = 'dose', #颜色根据哪一列决定

          bxp.errorbar = T, #是否添加error bar

          bxp.errorbar.width = 0.2, #error bar的长度

          palette = 'npg', #颜色风格

          add = 'point' # 是否添加boxplot上面的点点

          ) +

labs(title = 'Effect of Vitamin C on Tooth Growth', # 添加主标题

         subtitle = 'Plot of length by dose', # 添加次标记

         caption = 'Data source: ToothGrowth', #添加脚注

         x = 'Dose (mg)', # x轴的名字

         y = 'Teeth length' # y轴的名字

         ) +

  geom_signif(comparisons = list(c('0.5', '1'), c('1','2'), c('0.5','2')), # 设置要对比的组

  y_position = c(34,36,38), #设置3个显著性标记的高度

  tip_length = c(0), #设置显著性那条横线两头向下的长度

  map_signif_level = T, #设置是否标记显著性的*号,还是直接标记数值

  test = t.test #设置显著性计算方式

  )

04
第四步

最后就是设置线宽度和字体大小,及其他的主题theme()参数:

ggboxplot(ToothGrowth, #数据对象

          x = 'dose', # 选择x轴用那一列数据

          y = 'len', #选择y轴用什么数据

          fill = 'dose', #颜色根据哪一列决定

          bxp.errorbar = T, #是否添加error bar

          bxp.errorbar.width = 0.2, #error bar的长度

          palette = 'npg', #颜色风格

          add = 'point' # 是否添加boxplot上面的点点

          ) +

labs(title = 'Effect of Vitamin C on Tooth Growth', # 添加主标题

         subtitle = 'Plot of length by dose', # 添加次标记

         caption = 'Data source: ToothGrowth', #添加脚注

         x = 'Dose (mg)', # x轴的名字

         y = 'Teeth length' # y轴的名字

         ) +

  geom_signif(comparisons = list(c('0.5', '1'), c('1','2'), c('0.5','2')), # 设置要对比的组

  y_position = c(34,36,38), #设置3个显著性标记的高度

  tip_length = c(0), #设置显著性那条横线两头向下的长度

  map_signif_level = T, #设置是否标记显著性的*号,还是直接标记数值

  test = t.test #设置显著性计算方式

  ) +

theme(

    plot.title    = element_text(color = 'black', size   = 16, hjust = 0.5),

    plot.subtitle = element_text(color = 'black', size   = 16,hjust = 0.5),

    plot.caption  = element_text(color = 'black', size   = 16,face = 'italic', hjust = 1),

    axis.text.x   = element_text(color = 'black', size = 16, angle = 0),

    axis.text.y   = element_text(color = 'black', size = 16, angle = 0),

    axis.title.x  = element_text(color = 'black', size = 16, angle = 0),

    axis.title.y  = element_text(color = 'black', size = 16, angle = 90),

    legend.title  = element_text(color = 'black', size  = 16),

    legend.text   = element_text(color = 'black', size   = 16),

    axis.line.y = element_line(color = 'black', linetype = 'solid'), # y轴线特征

    axis.line.x = element_line (color = 'black',linetype = 'solid'), # x轴线特征

     panel.border = element_rect(linetype = 'solid', size = 1.2,fill = NA) # 图四周框起来

       )

看起来效果已经达到。

That's easy!

如需联系EasyCharts团队

请加微信:EasyCharts

【书籍推荐】《R语言数据可视化之美》
【书籍推荐】《Excel 数据之美》
【手册获取】  国内首款-数据可视化参考手册
【网易云课堂】  Excel 商业图表修炼秘笈之基础篇
【文章汇总】 EasyCharts文章汇总

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约