分享

多重比较的可视化 | 增加趋势线及调整顺序

 育种数据分析 2021-11-18

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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约