利用R语言实现箱线图的绘制与美化(正态分布随机数生成、显著性检验、误差线添加、图例、背景更改)

时间:2024-12-16 07:07:27

问题:按照正态分布随机生成A(平均值= 50,sd = 3),B(平均值= 45,sd = 2),C(平均值= 40,sd = 5)和D(平均值= 52)作为4种甜瓜的产量数据 ,sd = 2),并绘制一个图以尽可能直观地显示4个品种之间的产量是否有显着差异结果。

  1. ###工作路径设置
  2. getwd()
  3. ## [1] "/Users/Zhanghp/Desktop/myProjects/finalexam"
  4. setwd("/Users/Zhanghp/Desktop/myProjects/finalexam")
  1. ###随机生成40个甜瓜产量数据
  2. dataA <- rnorm(n=40,mean=50,sd=3)
  3. dataB <- rnorm(n=40,mean=45,sd=2)
  4. dataC <- rnorm(n=40,mean=40,sd=2)
  5. dataD <- rnorm(n=40,mean=52,sd=2)
  6. mydata <- data.frame(A=dataA,B=dataB,C=dataC,D=dataD)##以四组数据创建数据框
  7. mydata
  1. ## A B C D
  2. ## 1 51.38140 43.62086 38.34938 49.31558
  3. ## 2 48.17464 43.95625 41.53496 49.74972
  4. ## 3 47.49706 42.28571 40.86612 51.50041
  5. ## 4 48.97543 43.96911 42.22170 54.82949
  6. ## 5 49.07308 47.71466 38.57461 51.70845
  7. ## 6 52.68781 44.75586 41.55359 51.47254
  8. ## 7 51.40030 45.45422 43.13246 52.39675
  9. ## 8 49.84378 44.40448 39.08546 49.73431
  10. ## 9 49.81800 42.41965 41.33657 52.03518
  11. ## 10 49.37837 45.21844 37.87255 51.20733
  12. ## 11 47.25974 42.24899 40.07773 52.53069
  13. ## 12 54.62392 43.54648 40.30749 51.40711
  14. ## 13 46.80442 41.88457 37.07953 51.10087

 数据框格式如上,该数据框为宽数据类型,若要用其来绘制箱线图需将数据转换为长数据类型,这里我们可以调用 gather(tidyr)函数来实现这一转换,代码如下:

  1. ###加载所需R packages
  2. library(tidyr) ##gather函数
  3. library(ggplot2) ##ggplot函数
  4. library(ggpubr) ##stat_compare_means函数
  5. ##数据归整处理(宽数据转换为长数据)
  6. mydata <- gather(mydata,key = 'Varieties',value = "Yield",A,B,C,D)
  7. mydata
  1. mydata
  2. ## Varieties Yield
  3. ## 1 A 51.38140
  4. ## 2 A 48.17464
  5. ## 3 A 47.49706
  6. ## 4 A 48.97543
  7. ## 5 A 49.07308
  8. ## 6 A 52.68781
  9. ## 7 A 51.40030
  10. ## 8 A 49.84378
  11. ## 9 A 49.81800
  12. ## 10 A 49.37837
  13. ## 11 A 47.25974
  14. ## 12 A 54.62392
  15. ## 13 A 46.80442
  16. ## 14 A 45.55051
  17. ## 15 A 45.49200

 处理后的数据如上,为长数据类型,下一步即可利用ggplot函数进行箱线图的初步绘制

  1. ###基础箱线图绘制
  2. p1 <- ggplot(mydata,aes(x=Varieties,y=Yield,fill=Varieties))+geom_boxplot()
  3. p1+scale_fill_manual(values=c("red","green","blue","purple"))##以Varieties为类别进行颜色填充

由于ggplot绘制的箱线图默认将误差线上下端的横线去除,若要添加横线则需对以上基础箱线图进行进一步的美化,包括原始数据的散点分布、默认背景颜色的替换、组间的显著性检验、p值添加、图例及标题设置。 最终代码、注释及效果图如下:

  1. # 设定比较对象用于显著性分析
  2. my_lists <- list(c("A", "B"), c("B", "C"), c("C", "D"),c("C", "A"),c("A", "D"),c("B", "D"))
  3. ##添加散点和显著性检验结果于箱线图中
  4. p1 + geom_jitter(aes(fill=Varieties),width =0.2,shape = 21,size=1)+ ##添加散点分布
  5. theme( = element_blank(),axis.line = element_line())+ ##去默认灰色背景颜色
  6. stat_compare_means(comparisons=my_lists,label="")+ ##显著性分析
  7. stat_boxplot(geom = "errorbar",width=0.5)+ ##添加误差线
  8. labs(title = "Plot of Melon'yield by Varieties")+ ##更改图例位置
  9. theme( = "bottom") ##添加标题

  1. ###图片文件保存
  2. ggsave("")