查看: 1250|回复: 16

[R语言] 分组箱形图、小提琴图的绘制

  [复制链接]
  • TA的每日心情
    忙~
    2019.12.2 17:10
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    管理员

    Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

    主题
    86
    奥币
    695
    积分
    786
    注册时间
    2019.7.8
    在线时间
    148 小时

    发表于 2020.1.16 09:54:58 | 显示全部楼层 |阅读模式
    在之前的《R语言基础绘图函数学习笔记(二)》《小提琴图的画法》两篇文章其实介绍过无分组箱型形图和小提琴图的绘制。绘制单组的方法比较简单,但如果
    绘制分组的,则需要花些心思,特别是用基础函数或基于基础函数的R包作图。

    当然,小提琴图可以看作加强版的箱形图,我们先看分组箱型图的画法。其实,boxplot()函数的帮助文档有分享绘制方法,绘制的效果如下:


    但是,这种画法有一个明显的问题,就是横轴刻度是“双份”的。于是,我们的生信交流群(群号:133146835)就有人问啦:



    看到这个问题,就花了点心思,在原来的脚本基础上做了些改进,最终得到了想要的结果,改进后的画法如下。

    分组箱形图

    #预先设置好坐标轴标题、刻度标签、坐标轴线的之间的间隔;
    par(mgp=c(1.6,0.5,0),mar=c(4,4,1.5,1.5))
    #使用axes=FALSE,frame.plot=F 隐藏坐标轴与画图边框,或者使用par(xaxt="n",yaxt="n")也是一样的隐藏效果;
    #par(bty="n")与frame.plot=F 效果相同;
    使用'at =' 设置画图位置;yaxs = "i",绘制与刻度“齐平”的坐标轴; boxplot(len~ dose, data = ToothGrowth,
            boxwex = 0.3, at = 1:3 - 0.2,
            subset = supp == "VC", col ="tomato",
            xlab = "dose(mg)",
            ylab = "tooth length(mm)",
            xlim = c(0.5, 3.5), ylim = c(0, 35),
            yaxs ="i",axes=FALSE,frame.plot=F)


    add =TRUE,表示在原图表体系上继续追加画图;
    boxplot(len~ dose, data = ToothGrowth, add = TRUE,
            boxwex = 0.3, at = 1:3 + 0.2,
            subset = supp == "OJ", col ="orange",
            axes=FALSE,frame.plot=T)


    指定刻度标签,用低水平函数添加坐标和刻度;

    x=seq(1,3,1)
    y=seq(0,35,5)

    xlab=c("0.5","1","2")
    ylab=c("0","5","10","15","20","25","30","35")

    #添加横轴和纵轴;
    #las调整字体方向;tck调整刻度线长度;
    axis(1,at=x, labels=xlab, cex.axis=0.7,las=0,tck=-0.015)
    axis(2,at=y, labels=ylab, cex.axis=0.7,las=2,tck=-0.015)


    关于次刻度线的添加,R基础函数绘制的图表一般只有主刻度线而没有次刻度(minor tick),次刻度线的添加需要使用Hmisc包中的minor.tick()函数添加。
    #安装Hmisc包;
    #install.packages("Hmisc")
    #载入Hmisc包;
    library(Hmisc)
    #在气泡图的坐标轴上添加次刻度;
    minor.tick(nx=1,ny=2,tick.ratio= 0.3)

    #nx(ny)表示小刻度把x轴(y轴)两个相邻主刻度之间的区域分隔成2个区段;
    #tick.ratio表示小刻度与主刻度短线的长度比例;
    #x.args和y.args可以指定坐标轴的参数;
    #如x.args = list(lwd = 1.2,col = "black")可以指定坐标轴的粗细和颜色; 最后,添加图例。
    legend(0.4,35, c("Ascorbic acid", "Orange juice"),
           fill = c("yellow","orange"),bty = "n",cex=0.7)


    分组小提琴图的用法

    方法与分组箱形图相似,但也有“坑”。比如,axes=FALSE在vioplot R包不起作用。
    par(mgp=c(1.6,0.5,0),mar=c(4,4,1.5,1.5),xaxt="n",yaxt="n")
    #安装和载入vioplot包
    #install.packages("vioplot")

    library("vioplot")
    vioplot(len~ dose, data = ToothGrowth,
            wex = 0.45, at = 1:3 - 0.2,
            subset = supp == "VC",
            col ="gold",border="white",
            ylim=c(0,35),
            yaxs = "i",
           lty=1,lineCol="black",rectCol="green",
            frame.plot=F)


    vioplot(len~ dose, data = ToothGrowth, add = TRUE,
            wex = 0.45, at = 1:3 + 0.2,
            subset = supp == "OJ",
            col ="orange",border="white",frame.plot=T)


    指定刻度标签,用低水平函数添加坐标和刻度。

    x=seq(1,3,1)
    y=seq(0,35,5)

    xlab=c("0.5","1","2")
    ylab=c("0","5","10","15","20","25","30","35") 重新指定绘制坐标轴。
    par(mgp=c(1.6,0.5,0),mar=c(4,4,1.5,1.5),xaxt="s",yaxt="s")

    axis(1,at=x, labels=xlab, cex.axis=0.7,las=0,tck=-0.015)
    axis(2,at=y, labels=ylab, cex.axis=0.7,las=2,tck=-0.015)

    legend(0.4,35, c("Ascorbic acid", "Orange juice"),
           fill = c("yellow","orange"),bty = "n",cex=0.7)


    其他可用参数:
    lty, lwd:小提琴边框和中线(箱图的whiskers)的调整;
    lineCol:调整箱图的边框和whiskers;
    rectCol:箱图的填充色;
    pchMed:中值点的形状;
    colMed,colMed2:colMed指定中值点的填充颜色;21:25时前者为描边颜色,后者为填充颜色;
    drawRect=F:不画中间的箱图;
    side="left"或"right":小提琴图只画一半。

    当然,如果你喜欢使用ggplot2,得益于“长型”数据的优势,ggplot2绘制分组图表会更简单一些。 好啦,今天就分享到这里啦~

    拓展阅读
    R语言基础绘图函数学习笔记(一)
    R语言基础绘图函数学习笔记(二)
    R语言基础绘图函数学习笔记(三)

    本文作者:基迪奥-莫北

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

  • TA的每日心情

    2020.1.16 10:34
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    3
    奥币
    175
    积分
    68
    注册时间
    2018.8.21
    在线时间
    4 小时

    发表于 2020.1.16 10:29:49 | 显示全部楼层
    别别别版本
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    忙~
    前天 12:46
  • 签到天数: 14 天

    连续签到: 7 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    124
    积分
    112
    注册时间
    2018.10.19
    在线时间
    16 小时

    发表于 2020.1.16 16:01:49 | 显示全部楼层
    感谢楼主的无私奉献
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    yes!
    2020.1.10 11:08
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    帝王蝶

    Rank: 4

    主题
    0
    奥币
    236
    积分
    314
    注册时间
    2019.11.21
    在线时间
    10 小时

    发表于 2020.1.17 00:03:22 | 显示全部楼层
    学习
    回复

    使用道具 举报

  • TA的每日心情

    昨天 10:52
  • 签到天数: 15 天

    连续签到: 2 天

    [LV.4]偶尔看看III

    帝王蝶

    Rank: 4

    主题
    0
    奥币
    225
    积分
    318
    注册时间
    2020.1.16
    在线时间
    7 小时

    发表于 2020.1.19 11:27:55 | 显示全部楼层
    厉害
    回复

    使用道具 举报

  • TA的每日心情
    no
    2019.11.16 15:23
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    14
    积分
    47
    注册时间
    2019.9.24
    在线时间
    15 小时

    发表于 2020.1.31 20:31:07 | 显示全部楼层
    谢谢分享!!!
    回复

    使用道具 举报

  • TA的每日心情
    yes!
    2020.1.10 11:08
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    帝王蝶

    Rank: 4

    主题
    0
    奥币
    236
    积分
    314
    注册时间
    2019.11.21
    在线时间
    10 小时

    发表于 2020.2.1 21:40:49 | 显示全部楼层
    学习
    回复

    使用道具 举报

  • TA的每日心情

    2019.6.20 13:45
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    钵水母

    Rank: 3Rank: 3

    主题
    2
    奥币
    281
    积分
    105
    注册时间
    2017.5.31
    在线时间
    73 小时

    发表于 2020.2.3 09:43:48 | 显示全部楼层
    为什么报错呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019.6.20 13:45
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    钵水母

    Rank: 3Rank: 3

    主题
    2
    奥币
    281
    积分
    105
    注册时间
    2017.5.31
    在线时间
    73 小时

    发表于 2020.2.3 14:41:18 | 显示全部楼层
    vioplot(len~ dose, data = ToothGrowth,
    +         wex = 0.45, at = 1:3 - 0.2,
    +         
    +         # subset = supp == "VC",
    +         col ="gold",border="white",
    +         ylim=c(0,35),
    +         yaxs = "i",
    +         lty=1,lineCol="black",rectCol="green",
    +         frame.plot=F)
    Show Traceback

    Rerun with Debug
    Error in (1 - h) * qs[i] : non-numeric argument to binary operator
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    草履虫

    Rank: 2

    主题
    0
    奥币
    5
    积分
    7
    注册时间
    2020.2.6
    在线时间
    1 小时

    发表于 2020.2.6 17:24:05 | 显示全部楼层
    赞赞赞仄仄仄仄
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    草履虫

    Rank: 2

    主题
    0
    奥币
    5
    积分
    7
    注册时间
    2020.2.6
    在线时间
    1 小时

    发表于 2020.2.6 17:24:52 | 显示全部楼层
    赞赞赞仄仄仄仄
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    好棒
    4 天前
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    127
    积分
    97
    注册时间
    2019.3.14
    在线时间
    7 小时

    发表于 2020.2.7 09:40:26 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    忙~
    2020.2.8 13:44
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    0
    积分
    24
    注册时间
    2019.3.24
    在线时间
    4 小时

    发表于 2020.2.8 14:09:35 | 显示全部楼层
    非常好!!
    回复

    使用道具 举报

  • TA的每日心情

    昨天 10:52
  • 签到天数: 15 天

    连续签到: 2 天

    [LV.4]偶尔看看III

    帝王蝶

    Rank: 4

    主题
    0
    奥币
    225
    积分
    318
    注册时间
    2020.1.16
    在线时间
    7 小时

    发表于 2020.2.11 09:55:17 | 显示全部楼层
    学习
    回复

    使用道具 举报

    该用户从未签到

    钵水母

    Rank: 3Rank: 3

    主题
    2
    奥币
    5
    积分
    75
    注册时间
    2019.11.27
    在线时间
    4 小时

    发表于 2020.2.17 14:38:50 | 显示全部楼层
    画的太好看了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    yes!
    2020.2.19 17:52
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    73
    积分
    66
    注册时间
    2019.6.20
    在线时间
    8 小时

    发表于 2020.2.19 17:54:27 | 显示全部楼层
    谢谢分享!!!
    回复

    使用道具 举报

  • TA的每日心情
    yes!
    2020.2.19 17:52
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    73
    积分
    66
    注册时间
    2019.6.20
    在线时间
    8 小时

    发表于 2020.2.19 18:28:22 | 显示全部楼层

    谢谢分享!!!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表