R_柱状图(标准差,显著性)

差异分析(t检验 / 方差分析)是基础的统计分析方法之一,但是图画起来一点也不轻松。
本文主要参考和复制了https://blog.csdn.net/wt141643/article/details/113033711的做法,做了小幅度的修改,验证了可行性。

#生成两组正态分布数
a <- rnorm (n = 100, mean = 75, sd = 10)
b <- rnorm (n = 100, mean = 72, sd = 12)
#加载包
library(ggplot2)
#ggthermr包能安装,但是不能加载,不明原因
library(ggthemr) 
library(ggsignif)
library(tidyverse)
library(dplyr)
library(ggpubr)
library(devEMF)
#数据整合到数据框中
data_all <- data.frame (group = rep(c("a","b"), each = 100), Scores = c(a, b))
data_mean <- data_all %>% 
  dplyr::group_by(group) %>% 
  dplyr::summarize(
    count=n(),
    mean = mean(Scores),
    sd = sd(Scores)
  )
#正态分布,方差齐性,及显著性检验
shapiro.test(data_all$Scores)    
bartlett.test(Scores~group,data = data_all) 
library(car)
leveneTest(data_all$Scores~data_all$group)
compare_means(Scores~group,data = data_all,
               method = "anova") #显著性计算
#########################################
#画图
plot_data1 <- data_mean
plot_data2 <- data_all
p4 <- ggplot()+
       geom_bar(data = plot_data1,
                mapping=aes(x=group,y=mean,fill=group),
                position="dodge", # 柱状图格式
                stat="identity", # 数据格式
                width = 0.7)+ # 柱状图尺寸
       scale_fill_manual(values = c("#4E4E56", "#DA635D"))+ # 柱状图颜色
       geom_signif(data=plot_data2,mapping=aes(x=group,y=Scores),
                   comparisons = list(c("a", "b")), # 哪些组进行比较
                   annotations = c("**"), # 显著性差异做标记
                   map_signif_level=T,
                   tip_length=c(0.04,0.04), # 修改显著性那个线的长短
                   y_position = c(90,90), # 设置显著性线的位置高度
                   size=1, # 修改线的粗细
                   textsize = 8, # 修改*标记的大小
                   test = "anova")+
       #误差线
       geom_errorbar(data=plot_data1,
                     mapping=aes(x = group,ymin = mean-sd,
                                 ymax = mean+sd),width = 0.1,
                     color = 'black', size=0.8)+
       # y轴的范围(这一句比较重要,能让柱形和y轴紧贴,而不是悬空)
       scale_y_continuous(limits =c(0, 100) ,expand = c(0,0))+ 
       theme_classic( # 主题设置,这个是无线条主题
       base_line_size = 1 # 坐标轴的粗细
       )+
       labs(title="",x="",y="")+
       theme(plot.title = element_text(size = 20,
                                       colour = "red",
                                       hjust = 0.5),
             axis.title.y = element_text(size = 15, 
                                         color = "black",
                                         face = "bold", 
                                         vjust = 1.9, 
                                         hjust = 0.5, 
                                         angle = 90),
             legend.title = element_text(color="black", # 修改图例的标题
                                         size=15, 
                                         face="bold"),
             legend.text = element_text(color="black", # 设置图例标签文字
                                        size = 10, 
                                        face = "bold"),
             axis.text.x = element_text(size = 13, # 修改X轴上字体大小,
                                        color = "black",
                                        face = "bold",
                                        vjust = 0.5,
                                        hjust = 0.5,
                                        angle = 0),
             axis.text.y = element_text(size = 13, # 修改y轴上字体大小,
                                        color = "black",
                                        face = "bold", 
                                        vjust = 0.5,
                                        hjust = 0.5,
                                        angle = 0)
              #  face取值:plain普通,bold加粗,italic斜体bold.italic斜体加粗
               )
#最后记得输出
p4
#########################################
#我个人遇到报错,但不影响输出
#直接复制原网址上的代码和数据也会报错
Warning message:
In geom_signif(data = plot_data2, mapping = aes(x = group, y = value),  :
  You have set data and mapping, are you sure that manual = FALSE is correct?
#在加入manual = T语句后,有了新的报错内容
Error in geom_signif(data = plot_data2, mapping = aes(x = group, y = value),  : 
  Manual mode only works if with 'annotations' is provided in mapping
#搞不清楚,放弃了
忙活一早晨的成果.png

后记:发现加了manual = T语句之后,柱状图的形状和其他参数修改了之后图没有变化,好像被锁上了一样,把这句话删掉之后图形才能改变(尤其是width = 0.7,#柱状图尺寸这一句)。所以还是把这一句删掉了。
结语:ggplot函数强大,看到网上还有其他帖子的画图攻略。过一段时间会尝试,然后记录下来。


2020.01.07补记:
上次把图画出来之后,匆忙的整理就发布了。后来用代码重新做的时候,总是报错。很是纳闷,经过比较,发现多了一个“,”。实在没想到。

data_all <- data.frame (group = rep(c("a","b",), each = 100), Scores = c(a, b))
Error in c("a", "b", ) : argument 3 is empty

绘图之后,还报错。各种尝试摸不着头脑。后来才发现,是仿照例子的时候,data_all应该赋值到plot_data2;data_mean应该赋值到plot_data1。弄反了。虽然不知道原理,但好歹是debug了,这次我没有放弃。
另外,以后表头还是不用“value”这种烂大街容易混淆的词了,起码也要首字母大写。

Warning message:
In geom_signif(data = plot_data2, mapping = aes(x = group, y = Scores),  :
  You have set data and mapping, are you sure that manual = FALSE is correct?
> p4
Error: Aesthetics must be valid data columns. Problematic aesthetic(s): y = mean. 
Did you mistype the name of a data column or forget to add after_stat()?
Run `rlang::last_error()` to see where the error occurred.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容