1. 背景 之前写过一篇文章,介绍多重比较的可视化:方差分析多重比较可视化 。
高广雄同学问我如何增加趋势线,以及调整显示的顺序。
我不了解如何加趋势线,调整顺序的话可以设置factor的level,然后建议他研究一下,如果成功的话,可以把经验写出来,我转发一下。
今天他给我了一个链接,上面是他实现的过程,效果如下:
本来直接就想用他给的代码,水一篇。但是!!!
❝ 分享的是有道云笔记的小程序,没有办法在电脑端打开,只能在手机端查看,我太难了。^[所以,发给别人文章时,极客用md文件,正规的是word或者pdf,不靠谱的就是有道小程序了。。。]
❞ 容易的路不好走,那我就走一条难走的路 ^[然后,又做起了编程的大招:粘贴复制,修改代码]。另外,我觉得上面的示例不够美观,好的例子至关重要,坏的例子南辕北辙。
我想到了数据分析师的格言:没有数据,创造数据也要上!没有理想结果,多试几次就能达到,所以,关于图片误用,一切皆有可能,哈哈。
如果一个程序员,表情平静,键盘飞快
❝ 他一定在写注释
❞ 如果一个程序员,键盘很少动,鼠标飞快
❝ 他一定在粘贴复制别人的代码
❞ 如果一个程序员,抓耳挠腮,时而百度,时而有道云笔记,好久才动一次键盘
❝ 他应该在写程序,磕磕绊绊,连抄带借鉴
❞ 2. 模拟数据 set.seed(123) library(tidyverse) dat = data.frame("Mon" = rnorm(10)+1,"Tue" = rnorm(10)+10,"Wed" = rnorm(10) + 5, "Thu" = rnorm(10)+15,"Fri" = rnorm(10) +4) dat
数据如下:
> dat Mon Tue Wed Thu Fri 1 0.4395244 11.224082 3.932176 15.42646 3.305293 2 0.7698225 10.359814 4.782025 14.70493 3.792083 3 2.5587083 10.400771 3.973996 15.89513 2.734604 4 1.0705084 10.110683 4.271109 15.87813 6.168956 5 1.1292877 9.444159 4.374961 15.82158 5.207962 6 2.7150650 11.786913 3.313307 15.68864 2.876891 7 1.4609162 10.497850 5.837787 15.55392 3.597115 8 -0.2650612 8.033383 5.153373 14.93809 3.533345 9 0.3131471 10.701356 3.861863 14.69404 4.779965 10 0.5543380 9.527209 6.253815 14.61953 3.916631
这个数据,需要变为长数据 ^[就是ggplot2作图用的数据]
dd = pivot_longer(dat,1:5,values_to = "y",names_to = "Day") dd
长数据来到:
> dd # A tibble: 50 x 2 Day y <fct> <dbl> 1 Mon 1.38 2 Tue 9.51 3 Wed 5.01 4 Thu 16.0 5 Fri 3.29 6 Mon 0.498 7 Tue 7.69 8 Wed 5.39 9 Thu 15.5 10 Fri 4.26 # ... with 40 more rows
3. 方差分析 因为模拟的数据,我们直接用aov
进行方差分析,直接用agricolae
进行多重比较吧,就不整那些正态性检验,齐性检验了。
注意,这里要讲Day
转化为因子!
str(dd) dd$Day = as.factor(dd$Day) mod = aov(y ~ Day, data=dd) summary(mod)
方差分析结果:
> summary(mod) Df Sum Sq Mean Sq F value Pr(>F) Day 4 1270.5 317.6 417.1 <2e-16 *** Residuals 45 34.3 0.8 --- Signif. codes: 0 '***’ 0.001 '**’ 0.01 '*’ 0.05 '.’ 0.1 ' ’ 1
可以看到,Day达到极显著,可以进行多重比较。
4. 多重比较 这里,对Day
进行多重比较,方法是LSD
,水平是0.05
library(agricolae) re = LSD.test(mod,"Day",alpha = 0.05) re1 = re$groups re1
多重比较结果:
> re1 y groups Thu 15.437094 a Tue 9.637082 b Wed 5.313095 c Fri 3.604152 d Mon 1.123084 e
可以看到,周四最高,齐次是周二,它们之间均达到显著性水平!
5. 多重比较作图 5.1 数据准备为何还要准备数据?因为需要准备数据作图。
❝ 作为数据分析师,我们80%的时间,都是在准备数据。。。
❞ 整体思路:
xx = aggregate(y ~ Day, dd,sd) names(xx) = c("Day","sd") xx re2 = re1 %>% mutate(Day = rownames(re1)) %>% inner_join(.,xx,by="Day") re2
结果:
> re2 y groups Day sd 1 15.437094 a Thu 1.0688850 2 9.637082 b Tue 0.9955075 3 5.313095 c Wed 0.5475116 4 3.604152 d Fri 0.7055487 5 1.123084 e Mon 0.9363923
5.2 做柱形图## 做直方图 p1 = re2 %>% ggplot(aes(Day,y)) + geom_col(aes(fill = Day), width=.4) p1
5.3 在每个柱子上加标准误## 加上标准误 p2 = p1 + geom_errorbar(aes(ymax = y + sd, ymin = y - sd),width = .1,size=.5) p2
5.4 添加显著性## 加上显著性 p3 = p2 + geom_text(aes(label = groups,y = y + sd +0.5)) p3
5.5 背景设置为空白为何要设置空白背景?ggplot默认的风格不香吗?
❝ 空白的背景显得比较专业。。。
❞ ## 背景设置为空白 p4 = p3 + theme(panel.grid = element_blank(), panel.background = element_rect(color = "black",fill = "transparent")) p4
5.6 设置标签❝ 广告无处不在,有一种广告叫做镶嵌到图中!
❞ ## 增加标签 p5 = p4 + labs(x = "星期几?",y = "表现如何?",title = "公众号:育种数据分析之放飞自我") + theme(plot.title = element_text(hjust = 0.5)) p5
6. 调整顺序 本来,应该是尽善尽美的,但是如果我想将顺序按照:Mon,Tue,Wed,Thu,Fri进行排布,应该如何处理?
用factor函数,重新定义一下水平:
str(re2) re2$Day = factor(re2$Day,levels = c("Mon","Tue","Wed","Thu","Fri")) re2
「看一下作图效果:」
p1 = re2 %>% ggplot(aes(Day,y)) + geom_col(aes(fill = Day), width=.4) p2 = p1 + geom_errorbar(aes(ymax = y + sd, ymin = y - sd),width = .1,size=.5) p3 = p2 + geom_text(aes(label = groups,y = y + sd +0.5)) p4 = p3 + theme(panel.grid = element_blank(), panel.background = element_rect(color = "black",fill = "transparent")) p5 = p4 + labs(x = "星期几?",y = "表现如何?",title = "公众号:育种数据分析之放飞自我") + theme(plot.title = element_text(hjust = 0.5)) p5
搞定!
7. 增加趋势线 为何要增加趋势线呢?
❝ 因为加上趋势线,比较学术!
❞ p6 = p5 + geom_line(aes(group=""),color = "red") p6