前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多重比较的可视化 | 增加趋势线及调整顺序

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

作者头像
邓飞
发布2021-04-22 15:19:29
6690
发布2021-04-22 15:19:29
举报

1. 背景

之前写过一篇文章,介绍多重比较的可视化:方差分析多重比较可视化

高广雄同学问我如何增加趋势线,以及调整显示的顺序。

我不了解如何加趋势线,调整顺序的话可以设置factor的level,然后建议他研究一下,如果成功的话,可以把经验写出来,我转发一下。

今天他给我了一个链接,上面是他实现的过程,效果如下:

本来直接就想用他给的代码,水一篇。但是!!!

❝分享的是有道云笔记的小程序,没有办法在电脑端打开,只能在手机端查看,我太难了。^[所以,发给别人文章时,极客用md文件,正规的是word或者pdf,不靠谱的就是有道小程序了。。。] ❞

容易的路不好走,那我就走一条难走的路 ^[然后,又做起了编程的大招:粘贴复制,修改代码]。另外,我觉得上面的示例不够美观,好的例子至关重要,坏的例子南辕北辙。

我想到了数据分析师的格言:没有数据,创造数据也要上!没有理想结果,多试几次就能达到,所以,关于图片误用,一切皆有可能,哈哈。

如果一个程序员,表情平静,键盘飞快

❝他一定在写注释 ❞

如果一个程序员,键盘很少动,鼠标飞快

❝他一定在粘贴复制别人的代码 ❞

如果一个程序员,抓耳挠腮,时而百度,时而有道云笔记,好久才动一次键盘

❝他应该在写程序,磕磕绊绊,连抄带借鉴 ❞

2. 模拟数据

代码语言:javascript
复制
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

数据如下:

代码语言:javascript
复制
> 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作图用的数据]

代码语言:javascript
复制
dd = pivot_longer(dat,1:5,values_to = "y",names_to = "Day")
dd

长数据来到:

代码语言:javascript
复制
> 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转化为因子!

代码语言:javascript
复制
str(dd)
dd$Day = as.factor(dd$Day)
mod = aov(y ~ Day, data=dd)
summary(mod)

方差分析结果:

代码语言:javascript
复制
> 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

代码语言:javascript
复制
library(agricolae)
re = LSD.test(mod,"Day",alpha = 0.05)
re1 = re$groups
re1

多重比较结果:

代码语言:javascript
复制
> 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%的时间,都是在准备数据。。。 ❞

整体思路:

  • 将水平列出来
  • 计算标准差
  • 将数据合并
代码语言:javascript
复制
xx = aggregate(y ~ Day, dd,sd)
names(xx) = c("Day","sd")
xx
re2 = re1 %>% mutate(Day = rownames(re1)) %>% inner_join(.,xx,by="Day")
re2

结果:

代码语言:javascript
复制
> 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 做柱形图

代码语言:javascript
复制
## 做直方图
p1 = re2 %>% ggplot(aes(Day,y)) + geom_col(aes(fill = Day), width=.4)
p1

5.3 在每个柱子上加标准误

代码语言:javascript
复制
## 加上标准误
p2 = p1 + geom_errorbar(aes(ymax = y + sd, ymin = y - sd),width = .1,size=.5)
p2

5.4 添加显著性

代码语言:javascript
复制
## 加上显著性
p3 = p2 + geom_text(aes(label = groups,y = y + sd +0.5))
p3

5.5 背景设置为空白

为何要设置空白背景?ggplot默认的风格不香吗?

❝空白的背景显得比较专业。。。 ❞

代码语言:javascript
复制
## 背景设置为空白
p4 = p3 + theme(panel.grid = element_blank(), panel.background = element_rect(color = "black",fill = "transparent"))
p4

5.6 设置标签

❝广告无处不在,有一种广告叫做镶嵌到图中! ❞

代码语言:javascript
复制
## 增加标签
p5 = p4 + labs(x = "星期几?",y = "表现如何?",title = "公众号:育种数据分析之放飞自我") + theme(plot.title = element_text(hjust = 0.5))
p5

6. 调整顺序

本来,应该是尽善尽美的,但是如果我想将顺序按照:Mon,Tue,Wed,Thu,Fri进行排布,应该如何处理?

用factor函数,重新定义一下水平:

代码语言:javascript
复制
str(re2)
re2$Day = factor(re2$Day,levels = c("Mon","Tue","Wed","Thu","Fri"))
re2

「看一下作图效果:」

代码语言:javascript
复制
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. 增加趋势线

为何要增加趋势线呢?

❝因为加上趋势线,比较学术! ❞

代码语言:javascript
复制
p6 = p5 + geom_line(aes(group=""),color = "red")
p6

感觉不错,欢迎转发朋友圈,点赞,点在看!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 育种数据分析之放飞自我 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景
  • 2. 模拟数据
  • 3. 方差分析
  • 4. 多重比较
  • 5. 多重比较作图
    • 5.1 数据准备
      • 5.2 做柱形图
        • 5.3 在每个柱子上加标准误
          • 5.4 添加显著性
            • 5.5 背景设置为空白
              • 5.6 设置标签
              • 6. 调整顺序
              • 7. 增加趋势线
              相关产品与服务
              云开发 CloudBase
              云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档