查看: 5847|回复: 17

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

  [复制链接]

管理员

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

主题
153
注册时间
2019.7.8
在线时间
243 小时

发表于 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
新的一天加油!
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
3
注册时间
2018.8.21
在线时间
6 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2018.10.19
在线时间
16 小时

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

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2019.11.21
在线时间
12 小时

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

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2020.1.16
在线时间
21 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2019.9.24
在线时间
18 小时

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

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2019.11.21
在线时间
12 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
2
注册时间
2017.5.31
在线时间
78 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
2
注册时间
2017.5.31
在线时间
78 小时

发表于 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
注册时间
2020.2.6
在线时间
1 小时

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

使用道具 举报

草履虫

Rank: 2

主题
0
注册时间
2020.2.6
在线时间
1 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2019.3.14
在线时间
27 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2019.3.24
在线时间
5 小时

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

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2020.1.16
在线时间
21 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
2
注册时间
2019.11.27
在线时间
5 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2019.6.20
在线时间
12 小时

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

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2019.6.20
在线时间
12 小时

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

谢谢分享!!!
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
1
注册时间
2018.7.8
在线时间
9 小时

发表于 2020.4.20 16:19:44 | 显示全部楼层
学习了,谢谢
开心了
回复 支持 反对

使用道具 举报

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

本版积分规则

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