当然,小提琴图可以看作加强版的箱形图,我们先看分组箱型图的画法。其实,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;colMed,colMed2:colMed指定中值点的填充颜色;21:25时前者为描边颜色,后者为填充颜色;side='left'或'right':小提琴图只画一半。当然,如果你喜欢使用ggplot2,得益于“长型”数据的优势,ggplot2绘制分组图表会更简单一些。R语言基础绘图函数学习笔记(一)
R语言基础绘图函数学习笔记(二)
R语言基础绘图函数学习笔记(三)
实用科研工具推荐
详实生信软件教程分享
前沿创新组学文章解读
独家生信视频教程发布