大家好,今天主要向大家分享下误差柱形图的三种可视化方法,先上个示例图:
正式介绍实现方法之前,我们先来了解下误差柱形图上的帽子到底是个什么东东,也就是先了解下涉及的三个统计概念。
1 三个概念
标准偏差(Standard Deviation,SD)
标准偏差(简称标准差)是样本平均数方差的开平方。它反映组内个体间的离散程度。标准差通常是相对于样本数据的平均值而定的,通常用M±SD来表示样本数据观察值和平均值的差距。从公式可以看出,标准差会受到极值的影响。标准差越小,表明数据越聚集;标准差越大,表明数据越离散。Excel中如何用函数实现,请参考【Excel实现】部分。
# R 语言实现函数
sd <- sd(vec)
sd <- sqrt(var(vec))
标准误差(Standard Error,SE)
标准误差(简称标准误)表示的是抽样的误差。因为从一个总体中可以抽取出无数多种样本,每一种样本的数据都是对总体的数据的估计。标准误代表的就是当前的样本对总体数据的估计,标准误是由样本的标准差除以样本容量的开平方来计算的。从公式可以看到,标准误更大的是受到样本容量的影响。样本容量越大,标准误越小,那么抽样误差就越小,就表明所抽取的样本能够较好地代表总体。
se = sd(vec) / sqrt(length(vec))
置信区间(Confidence Interval,CI)
所谓置信区间就是分别以统计量的置信上限和置信下限为上下界构成的区间,是这个参数的真实值在一定概率条件下落在测量结果周围的程度。
# R 语言实现
alpha=0.05
t=qt((1-alpha)/2 + .5, length(vec)-1) # tend to 1.96 if sample size is big enough
CI=t*se
2 Excel 实现
本实例所示数据如下,依次为处理方案(Treat)、分组类别(Group)、平均值(Mean)和标准偏差(SD)。
标准偏差可以参照下图所示函数(STDEV.S())进行计算
绘图步骤:选中前三列数据,依次选择【插入→柱状图】,生成柱状图后点击右上图标添加按钮,添加误差线。在弹出的参数框中,选择【更多选项→误差量→自定义】,选择第四列的SD值,即可绘制误差线。另外根据需要,还可以在误差线里面选择只显示“正偏差”。
3 R 语言实现
# 加载需要的包
library(plyr)
library(ggplot2)
# 读取数据
dat <- read.delim("data.txt")
# 定义计算平均值和标准差函数
dat_sd <- function(data, varname, groupnames){
sum_func <- function(x, col){
c(Mean = mean(x[[col]], na.rm=TRUE),
SD = sd(x[[col]], na.rm=TRUE))
}
data_sum<-ddply(data, groupnames, .fun=sum_func,varname)
#data_sum <- rename(data_sum, c("mean" = varname))
return(data_sum)
}
# 计算标准偏差
df <- dat_sd(dat,varname="Value", groupnames=c("Treat","Group"))
# 作图
p<- ggplot(df, aes(x=Treat, y=Mean, fill=Group)) +
geom_bar(stat="identity", color="black",
position=position_dodge()) +
geom_errorbar(aes(ymin=Mean-SD, ymax=Mean+SD), width=.5,
position=position_dodge(.9))
4 Python 语言实现
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
size = 3
x = np.arange(size)
a = [5, 10, 23]
a_SD = [1.1, 0.6, 1.4]
b = [6, 9, 10]
b_SD = [0.4, 1.2, 2.5]
total_width, n = 0.6, 2
width = total_width / n
x = x - (total_width - width) / 2
labels = ['Treat1', 'Treat2', 'Treat3']
plt.bar(x, a, width=width, yerr = a_SD, tick_label=labels, label='Control')
plt.bar(x + width, b, width=width, yerr = b_SD, tick_label=labels ,label='Experimental')
plt.legend()
plt.show()
sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.barplot(x="day", y="tip", data=tips, capsize=.2)
ax
5 云平台实现
本人经常使用的是基因云平台(https://www.genescloud.cn),进入基因云平台【云图汇→误差柱状图】工具,在【图表数据→文件上传】页面选择数据文件后,点击“提交绘图”,即可生成误差柱状图。进入【图表调整】页面,**可以实现颜色填充、图案填充等多种类型图表的随意切换,分组/样品的任意删减和排序,以及近百种样式的自由调整。
基因云平台(https://www.genescloud.cn)除了上述误差柱状图,还提供了断轴柱状图、彩带柱状图。进入云图汇总览,搜索“柱状图”,可以查看近10种不同类型的柱状图。有兴趣的小伙伴可以前去溜溜~
交互断轴柱状图
交互带状条形图
极坐标柱状图