首页 > 编程知识 正文

ggplot2如何把直线调整成曲线,ggplot2画出两条曲线如何添加例

时间:2023-05-04 06:18:09 阅读:183300 作者:857

1. 背景

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

光亮的帅哥同学问我如何​增加趋势线,以及调整显示的顺序。

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

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

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

分享的是有道云笔记的小程序,没有办法在电脑端打开,只能在手机端查看,我太难了。1

容易的路不好走,那我就走一条难走的路 2。另外,我觉得上面的示例不够美观,好的例子至关重要,坏的例子南辕北辙。

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

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

他一定在写注释

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

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

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

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

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 Fri1 0.4395244 11.224082 3.932176 15.42646 3.3052932 0.7698225 10.359814 4.782025 14.70493 3.7920833 2.5587083 10.400771 3.973996 15.89513 2.7346044 1.0705084 10.110683 4.271109 15.87813 6.1689565 1.1292877 9.444159 4.374961 15.82158 5.2079626 2.7150650 11.786913 3.313307 15.68864 2.8768917 1.4609162 10.497850 5.837787 15.55392 3.5971158 -0.2650612 8.033383 5.153373 14.93809 3.5333459 0.3131471 10.701356 3.861863 14.69404 4.77996510 0.5543380 9.527209 6.253815 14.61953 3.916631

这个数据,需要变为长数据 3

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$groupsre1

多重比较结果:

> re1 y groupsThu 15.437094 aTue 9.637082 bWed 5.313095 cFri 3.604152 dMon 1.123084 e

可以看到,周四最高,齐次是周二,它们之间均达到显著性水平!

5. 多重比较作图 5.1 数据准备

为何还要准备数据?因为需要准备数据作图。

作为数据分析师,我们80%的时间,都是在准备数据。。。

整体思路:

将水平列出来计算标准差将数据合并 xx = aggregate(y ~ Day, dd,sd)names(xx) = c("Day","sd")xxre2 = re1 %>% mutate(Day = rownames(re1)) %>% inner_join(.,xx,by="Day")re2

结果:

> re2 y groups Day sd1 15.437094 a Thu 1.06888502 9.637082 b Tue 0.99550753 5.313095 c Wed 0.54751164 3.604152 d Fri 0.70554875 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


所以,发给别人文章时,极客用md文件,正规的是word或者pdf,不靠谱的就是有道小程序了。。。 ↩︎

然后,又做起了编程的大招:粘贴复制,修改代码 ↩︎

就是ggplot2作图用的数据 ↩︎

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。