差异分析(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.