箱线图(Box-plot)也叫箱须图,由美国科学家john.w.tukey1977年在论文中首次展示,能显示出数据的最大值、最小值,中位数及上下四分位数,因形状像箱子得名。箱线图箱线图在SCI论文中应用非常广泛。

R语言 将变量按照四分位数分类 r语言求四分位数_中位数


第一四分位数(Q1),又称较小四分位数,等于该样本中所有数值由小到大排列后第25%的数字。

第二四分位数,又称中位数,等于该样本中所有数值由小到大排列后第50%的数字。

第三四分位数(Q3)又称较大四分位数,等于该样本中所有数值由小到大排列后第75%的数字。

逸出值,是根据四分位间距(interquartile range)进行计算的:

四分位间距 = Q3-Q1 = ΔQ

在区间 Q3+1.5ΔQ, Q1-1.5ΔQ 之外的值即被视为逸出值。

今天我们来讲讲怎么使用R语言制作箱线图,继续使用我们的汽车销售数据,数据可以在公众号回复汽车销售即可获得数据,首先我们导入R包和数据

library(foreign)
library(ggplot2)
bc <- read.spss("E:/r/test/tree_car.sav",
                use.value.labels=F, to.data.frame=T)

R语言 将变量按照四分位数分类 r语言求四分位数_中位数_02


R语言 将变量按照四分位数分类 r语言求四分位数_数据分析_03


我们来看下数据,car就是汽车售价,age是年龄,gender是性别,inccat是收入,这里分成4个等级,ed是教育程度,这里分为5个等级.我们处理一下数据,把分类变量转换成因子,然后加上一个标签。

bc$ed<-factor(bc$ed,levels=c(1:5),labels=c("小学","初中","高中","大学","博士"))
bc$inccat<-factor(bc$inccat,levels=c(1:4),labels=c("低收入","中低收入","中等收入","富裕"))
bc$gender<-ifelse(bc$gender=="m",1,0)
bc$gender<-factor(bc$gender,levels = c(0,1),labels=c("女性","男性"))

然后先开始一个简单的箱线图,教育程度和买车的价格关系

ggplot(bc,mapping = aes(x=ed,y=car))+
  geom_boxplot()###简单的箱线图

R语言 将变量按照四分位数分类 r语言求四分位数_中位数_04


可以进一步填充颜色美化图形

ggplot(bc,mapping = aes(x=ed,y=car))+
  geom_boxplot(aes(fill=ed),notch = F)####按类别填充填充颜色

R语言 将变量按照四分位数分类 r语言求四分位数_中位数_05


假如把notch = F改为notch = T可以做出带有凹槽的箱线图,中位数的置信区间可以由凹槽表示,加入不考虑数据分布情况,凹槽不重合,就可以认为中位数95%CI显著不同

ggplot(bc,mapping = aes(x=ed,y=car))+
  geom_boxplot(aes(fill=ed),notch = T)

R语言 将变量按照四分位数分类 r语言求四分位数_中位数_06


我们还可以在其中加入散点,可以得出数据的分布情况

ggplot(bc,mapping = aes(x=ed,y=car))+
  geom_boxplot(aes(fill=ed),notch = F)+
  geom_jitter()###添加散点分布

R语言 将变量按照四分位数分类 r语言求四分位数_R语言 将变量按照四分位数分类_07


进一步美化图形

ggplot(bc,mapping = aes(x=ed,y=car))+
  geom_boxplot(aes(fill=ed),notch = F)+
  geom_jitter(binaxis="y",position = position_jitter(0.3),satckdir="center",
              dotsize=0.4)###调整美化图形

R语言 将变量按照四分位数分类 r语言求四分位数_bc_08


设置背景为横线或空白

###
ggplot(bc,mapping = aes(x=ed,y=car))+
  geom_boxplot(aes(fill=ed),notch = F)+
  geom_jitter(binaxis="y",position = position_jitter(0.3),satckdir="center",
              dotsize=0.4)+
  theme_light()###带横线的背景
###
ggplot(bc,mapping = aes(x=ed,y=car))+
  geom_boxplot(aes(fill=ed),notch = F)+
  geom_jitter(binaxis="y",position = position_jitter(0.3),satckdir="center",
              dotsize=0.4)+
  theme_classic()###空白的背景

R语言 将变量按照四分位数分类 r语言求四分位数_数据分析_09


在SCI论文中,我们常需要比较每组的关系,并得出统计值,因此我们可以使用ggpubr增强包

my_comparisons1 <- list( c("1", "2"), c("2", "3"), c("3", "4"),c("4","5"))
p<-ggboxplot(bc, x = "ed", y = "car",
          color = "ed", palette = "npg", add = "jitter")
p + stat_compare_means() ###添加P值
p + stat_compare_means(method = "t.test")###可以更换其他方法

R语言 将变量按照四分位数分类 r语言求四分位数_R语言 将变量按照四分位数分类_10


可以进行组别多组比较,这里注意一下,这里比较不能把类别用作因子,不然比不出来,要重新跑一下数据,数据5跑不出结果应该是本身数据的问题

bc <- read.spss("E:/r/test/tree_car.sav",
                use.value.labels=F, to.data.frame=T)  
my_comparisons1 <- list( c("1", "2"), c("2", "3"), c("3", "4"),c("4","5"))
ggboxplot(bc, x = "ed", y = "car",
          color = "ed", palette = "npg")+
  stat_compare_means(comparisons = my_comparisons1, 
                     label.y = c(70, 80, 90),method = "t.test")###添加比较

R语言 将变量按照四分位数分类 r语言求四分位数_数据_11


可以更改一下位置和调色,并添加一个Anova的p值

ggboxplot(bc, x = "ed", y = "car",
          fill= "ed", palette = "npg")+
  stat_compare_means( comparisons = my_comparisons1,
                     label.y = c(70, 80, 90),method = "t.test")+
  stat_compare_means(label.y = 100)# 添加一个Anova的p值

R语言 将变量按照四分位数分类 r语言求四分位数_数据_12


假如我们想其他组都和一组比较,

ggboxplot(bc, x = "ed", y = "car",
          fill= "ed", palette = "npg")+
  stat_compare_means(method = "anova", label.y = 100)+ # Add global p-value
  stat_compare_means(aes(label = ..p.signif..),
                     method = "t.test", ref.group = "1")

这里要对*解释一下,结果表明每组和一组比较都是有意义的

• ns: p > 0.05

• *: p <= 0.05

• **: p <= 0.01

• ***: p <= 0.001

• ****: p <= 0.0001

R语言 将变量按照四分位数分类 r语言求四分位数_数据分析_13


假设我们想知道不同性别的买车和教育程度情况

ggboxplot(bc, x = "ed", y = "car",
             color = "ed", palette = "npg", add = "jitter",
             facet.by = "gender", short.panel.labs = FALSE)

R语言 将变量按照四分位数分类 r语言求四分位数_中位数_14


还可以加上统计值

ggboxplot(bc, x = "ed", y = "car",
          color = "ed", palette = "npg", add = "jitter",
          facet.by = "gender", short.panel.labs = FALSE)+
  stat_compare_means(
aes(label = paste0("p = ", ..p.format..)))

R语言 将变量按照四分位数分类 r语言求四分位数_R语言 将变量按照四分位数分类_15