打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
分组箱形图、小提琴图的绘制
userphoto

2020.01.15

关注
在之前的《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语言基础绘图函数学习笔记(三)


实用科研工具推荐      
详实生信软件教程分享
前沿创新组学文章解读
独家生信视频教程发布

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
R中设置图形参数
R plot()参数详解
常见列线图的绘制及自定义美化详细教程
[R]关于R语言的绘图函数
R语言做图plot参数
做微生物生态该学多少技术之《R语言实战》-xph学习笔记
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服