今天介绍一下ggplot中柱状图的绘制。柱状图在平时还是比较常见的,主要就是统计一些数量关系,比如统计数据中字符出现的次数,统计不同分组的数据和,不同分组的数据均值,中值等,跟箱型图和小提琴图差不多,但是不足之处也很明显——无法看数据的具体分布情况。

ggplot python 柱状图 ggplot绘制柱状图_数据

首先介绍一些geom_bar相关控制参数:
width调节柱子的宽度
color调节外部描边线条颜色
fill调节内部填充颜色
alpha调节透明度
size调节线条宽度
position调节柱状图的摆放方式,是stack堆叠还是dodge分开,默认stack

1.统计数据出现的次数

rm(list = ls())
options(stringsAsFactors = F)

data=data.frame(x=c(rep('A',20),rep('B',30),rep('C',50),rep('D',100)))
ggplot()+geom_bar(data=data,aes(x=x,fill=x),stat = 'count')

我们构建了一个数据框data,并定义了一列数据,其中包含多个不同的字母

ggplot python 柱状图 ggplot绘制柱状图_柱状图_02


通过stat = 'count’我们就可以统计数据集中各个字母出现的次数

ggplot python 柱状图 ggplot绘制柱状图_柱状图_03

2.统计数据的具体数值

rm(list = ls())
options(stringsAsFactors = F)
data=data.frame(x=rep(LETTERS[1:3],each=100),
                y=c(rnorm(100,100,sd=2),rnorm(100,86,sd=2),rnorm(100,110,sd=2)))
                #rnorm随机定义小数rnorm(num,mean,sd)
library(ggplot2)
library(ggpubr)

p1=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=x), #X轴为分组,Y轴为具体数值,颜色填充由分组决定
                           stat = 'identity')

p2=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=x),
                           stat = 'summary',fun=median)

p3=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=x),
                           stat = 'summary',fun=mean)
ggarrange(p1,p2,p3,ncol = 3)

我们定义了一列随机的数据,并对数据进行了A-C的分组,通过stat = ‘identity’,我们可以统计不同分组对应的数据的和(下图1);通过stat = ‘summary’,fun=median,我们可以统计不同分组对应的数据的中值(下图2);通过stat = ‘summary’,fun=mean,我们可以统计不同分组对应的数据的均值(下图3)。

ggplot python 柱状图 ggplot绘制柱状图_ggplot python 柱状图_04


如果我们要对分组再进行分组

rm(list = ls())
options(stringsAsFactors = F)
data=data.frame(x=rep(LETTERS[1:3],each=100),
                y=c(rnorm(100,100,sd=2),rnorm(100,86,sd=2),rnorm(100,110,sd=2)),
                z=rep(rep(c('young','old'),each=50),3))
library(ggplot2)
library(ggpubr)

p1=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=z),
                           stat = 'identity')

p2=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=z),
                           stat = 'summary',fun=median)

p3=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=z),
                           stat = 'summary',fun=mean)
ggarrange(p1,p2,p3,ncol = 3)

可以看到每个分组又进行了分组,并且堆叠在一起

ggplot python 柱状图 ggplot绘制柱状图_r语言_05

p1=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=z),
                           stat = 'identity',
                           position = position_dodge(0.5),width = 0.4)

p2=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=z),
                           stat = 'summary',fun=median
                           ,position = position_dodge(0.5),width = 0.4)

p3=ggplot(data=data)+geom_bar(aes(x=x,y=y,fill=z),
                           stat = 'summary',fun=mean
                           ,position = position_dodge(0.5),width = 0.4)
ggarrange(p1,p2,p3,ncol = 3)

我们通过position = position_dodge()可以调节摆放位置,这样分组之间就变为水平摆放而不是堆叠。其中position = position_dodge()中可以调节组内距离,width可以调节柱子的宽度,两者共同调节可以让柱状图更美观。

ggplot python 柱状图 ggplot绘制柱状图_ggplot python 柱状图_06

3.进行统计学分析

如果我们想为柱状图添加误差线,我们可以通过stat_summary中的errorbar来实现,需要注意的是误差线一般是在均值柱状图中添加。

rm(list = ls())
options(stringsAsFactors = F)
data=data.frame(x=rep(LETTERS[1:3],each=100),
                y=c(rnorm(100,100,sd=10),rnorm(100,86,sd=12),rnorm(100,110,sd=8)),
                z=rep(rep(c('young','old'),each=50),3))
library(ggplot2)
library(ggpubr)

errorbar_up<-function(x){ #误差线上下限公式 mean-sd到mena+sd
  mean(x)+sd(x)
}
errorbar_down<-function(x){
  mean(x)-sd(x)
}

p3=ggplot(data=data,aes(x=x,y=y,fill=x))+
  geom_bar(stat = 'summary',fun=mean)+
  stat_summary(geom="errorbar",               #绘制误差线
               fun.min = errorbar_down,
               fun.max = errorbar_up,
               width=0.6)

ggplot python 柱状图 ggplot绘制柱状图_r语言_07


如果我们想要对不同分组间进行差异检验,我们可以使用geom_signif来实现

p3=ggplot(data=data,aes(x=x,y=y,fill=x))+
  geom_bar(stat = 'summary',fun=mean)+
  stat_summary(geom="errorbar",               #绘制误差线
               fun.min = errorbar_down,
               fun.max = errorbar_up,
               width=0.6)+
  geom_signif(comparisons = list(c("A","B"),c('A','C'),c('B','C')), #设置差异分析组
              test = 't.test',                #检验方法
              y_position = c(130,140,120),    #线条位置
              map_signif_level = T)           #是否使用显著标记

可以看到我们对三个分组进行两两T检验,看它们之间是否具有显著差异,具体检验需要看数据的分布,如t.test一般用于正态分布的数据,非正态分布的数据可以用wilcox.test非参检验。

ggplot python 柱状图 ggplot绘制柱状图_r语言_08


以上就是我自己了解的ggplot中柱状图的相关绘制。