每天学习一点R:20.一条代码搞定带误差棒的条形图
在前几天的推文中曾经介绍过一种使用arrow()函数用箭头表示误差棒的条形图绘制方法,但是这种方法是基于后期绘图元素的添加,如果所绘制的图像相对比较简单,那没有什么问题,但是如果绘制多系列数据的条形图时,一个一个添加误差棒难免有些麻烦,因此今天给大家带来另外两个可以直接生成含有误差棒条形物的方法。
gplots包的barplot2函数
首先还是老规矩,先介绍一下barplot2()函数所包含的参数。
barplot2(height, width = 1, space = NULL,
names.arg = NULL, legend.text = NULL, beside = FALSE,
horiz = FALSE, density = NULL, angle = 45,
col = NULL, prcol = NULL, border = par("fg"),
main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
axes = TRUE, axisnames = TRUE,
cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
plot.ci = FALSE, ci.l = NULL, ci.u = NULL,
ci.color = "black", ci.lty = "solid", ci.lwd = 1, ci.width = 0.5,
plot.grid = FALSE, grid.inc = NULL,
grid.lty = "dotted", grid.lwd = 1, grid.col = "black",
add = FALSE, panel.first = NULL, panel.last = NULL, ...)
各参数意义:
height,一个向量或者矩阵,用于指定绘图所需的数据;
width,条形的宽度;
space,条形之间的间隔:
names.arg,定义每个条形或每组条形对应的名称,也就是x轴标签;
legend.text,可以使用一个向量定义图例的内容,也可是使用TRUE/FALSE规定是否绘制图例;
beside,如果为FALSE,则图像会堆叠条形图,如果为TRUE,则为相邻条形图;
horiz,使用TRUE/FALSE定义条形为纵向还是横向;
density,使用箱顶定义条形中阴影线的密度;
angle,阴影线的角度;
col,定义条形的颜色;
prcol,定义绘图区的颜色;
border,定义条形边框的颜色;
main,主标题;
sub,副标题
xlab、ylab,x和y轴的坐标轴标签;
xlim、ylim,x和y轴的范围;
xpd,是否允许在绘图区以外显示图像;
log,参数为”x”、”y”或”xy”以规定是否对数据进行log转换;
axes,是否绘制坐标轴;
cex.axis,缩放数据轴标签大小,一般为y轴;
cex.names,缩放名称轴标签大小,一般为x轴;
axis.lty,轴的线型;
plot.ci,是否绘制误差棒,但是如果绘制的是堆叠条形图,则无法添加误差棒;
ci.l,ci.u,误差棒所需数据,l代表下方,u代表上方;
ci.color,ci.lty,ci.lwd,ci.width,误差棒的颜色、线性、线宽和T型线的宽度;
plot.grid,是否绘制网格线;
grid.inc,grid.lty,grid.lwd,grid.col,网格线的数目、线型、线宽和颜色。
本篇文章主要介绍误差棒的画法,因此普通条形图的画法就不在赘述了,大家可以自行研究,和barplot函数区别不大。
从上面的绘图参数可以看出,使用barplot2绘制误差棒条形图需要3个绘图数据,一个用于绘制条形,一个用于绘制上方误差棒,一个用于绘制下方误差棒。
数据就是普通的表格形式文件,正常测定一组数据的平均值作为绘制条形的数据,平均值+标准偏差用于绘制上方误差棒,平均值-标准偏差用于绘制下方误差棒。
绘图命令如下:
#加载绘图包
library(gplots)
#导入绘图数据
hh <- read.table("siRNA.txt",header = T,sep = "\t",row.names = 1)
ci.u <- read.table("siRNA.u.txt",header = T,sep = "\t",row.names = 1)
ci.l <- read.table("siRNA.l.txt",header = T,sep = "\t",row.names = 1)
#barplot2要求绘图数据为矩阵格式
hh <- as.matrix(hh)
ci.u <- as.matrix(ci.u)
ci.l <- as.matrix(ci.l)
#要求样本为列,分组为行
hh <- t(hh)
ci.u <- t(ci.u)
ci.l <- t(ci.l)
##进行图像的绘制
barplot2(hh, beside = TRUE,names.arg = c("3h","6h","12h"),
legend.text = TRUE,col = c("lightblue","mistyrose","lightcyan"),
ylim =c(0, 4.5), main ="Changes of PO gene expression",
font.main = 4, cex.names = 1.5, plot.ci =TRUE,
ci.l = ci.l, ci.u = ci.u, plot.grid =TRUE)
sciplot包的bargraph.CI函数
使用barplot2绘制误差棒还是有些麻烦,因为需要准备3个绘图数据,还需要自行计算出数据的平均值和标准偏差。
接下来介绍一个可以自动计算标准偏差并进行误差棒绘制的方法,那就是使用sciplot包的bargraph.CI函数。
还是照例线给出bargraph.CI的参数。
bargraph.CI(x.factor, response, group=NULL, split=FALSE,
xlab=NULL, ylab=NULL, col=NULL, angle=NULL, density=NULL,
lc=TRUE, uc=TRUE, legend=FALSE, ncol=1,
leg.lab=NULL, x.leg=NULL, y.leg=NULL, cex.leg=1,
bty="n", bg="white", space=if(split) c(-1,1),
err.width=if(length(levels(as.factor(x.factor)))>10) 0 else .1,
err.col="black", err.lty=1,
fun = function(x) mean(x, na.rm=TRUE),
ci.fun= function(x) c(fun(x)-se(x), fun(x)+se(x)),
ylim=NULL, xpd=FALSE, data=NULL, subset=NULL, ...)
各参数意义:
x.factor,规定X轴的参数;
response,规定绘图所需的数据;
group,规定在每个X轴上的分组情况;
col,规定bars的颜色;
angle,规定bars填充阴影线的角度;
density,规定bars填充阴影线的密度;
lc、uc,规定误差限的显示格式,lc规定上误差线,uc规定下误差线;
legend,规定是否显示图例;
ncol,规定图例由多少列组成;
leg.lab,定义图例的标题;
cex.lag,调整图例的大小;
bty,调整图例的轮廓线型;
bg,设定图例的背景色;
space,设定图形中bar之间的间距;
err.with,设定误差线中水平线的宽度;
err.col,设定误差线的颜色;
err.lty,设定误差线的线型;
fun,计算绘制bar所用的数据,默认为平均数;
ci.fun,计算绘制误差线所用的数据,默认是标准误差的正负值;
ylim,设定Y轴的范围
data,规定绘图所用的数据。
bargraph.CI绘图所需要的数据比较简单,基本上就是实验测得的原始数据,格式为csv,以“,”间隔。
绘图命令如下:
#载入绘图包
library(sciplot)
library(reshape)
#载入绘图数据
err <- read.csv("err.csv")
#将指定为x轴和分组的列设置为因子
err$Group <- as.factor(err$Group)
err$Sample <- as.factor(err$Sample)
#对数据进行格式处理
err.m <- melt(err)
#绘制第一幅图
bargraph.CI(Sample, value, group = Group, data =err.m,
xlab = "Sample", ylab = "Number",
err.col = c(1,2), col = c(1,2))
#添加图例
legend("topright", legend = c("A","B"), bty = "n",
horiz = F, fill = c(1,2))
除了绘制相邻条形图之外,bargraph.CI还可以使用split参数将两组相邻的条形改为对称形式。
bargraph.CI(Sample, value, group = Group, data =err.m,
xlab = "Sample", ylab = "Number",
err.col = c(1,2), col = c(1,2),split = TRUE)
legend("topright", legend = c("A","B"), bty = "n",
horiz = F, fill = c(1,2))
关注公众号“红皇后学术”,后台回复“误差棒条形图”获取绘图数据示例和完整代码。