R语言ggplot2做箱线图的时候如何添加表示平均值的线
2021-10-04 本文已影响0人
小明的数据分析笔记本
箱线图展示的就是分位数,中间的线表示的是中位数,也就是50%分位数,如果非要在箱线图上画上表示平均值的线段也是可以实现的,今天介绍一下实现代码
示例数据集我们用R语言的内置数据集PlantGrowth
首先是画一个最普通的箱线图
df<-read.csv("PlantGrowth.csv")
library(ggplot2)
library(tidyverse)
p1<-ggplot(data=df,
aes(x=group,y=weight))+
geom_boxplot(aes(fill=group))
p1
image.png
通过ggplot_build()函数可以获取画箱线图用到的数据
ggplot_build(p1)$data[[1]]
image.png
我们利用原始数据计算一下平均值,然后将数据集的平均值添加到这组数据中
df %>%
group_by(group) %>%
summarise(mean_value=mean(weight)) %>%
rename("group_1"="group") %>%
cbind(ggplot_build(p1)$data[[1]]) -> df1
然后利用geom_segment()函数添加品均值的线段
p1+
geom_segment(data=df1,
aes(x=xmin,xend=xmax,
y=mean_value,
yend=mean_value),
color="red")
image.png
这里如果不想要中位数的线的话
找到一种办法是重新画一条线把原来的中位数的线给盖住
p1+
geom_segment(data=df1,
aes(x=xmin,xend=xmax,
y=mean_value,
yend=mean_value),
color="black",
size=4)+
geom_segment(data=df1,
aes(x=xmin+0.005,xend=xmax,
y=middle,
yend=middle,
color=group_1),
show.legend = F,
size=5)
image.png
最后稍微美化一下
ggplot(data=df,
aes(x=group,y=weight))+
stat_boxplot(geom="errorbar",
width=0.2)+
geom_boxplot(aes(fill=group))+
geom_segment(data=df1,
aes(x=xmin,xend=xmax,
y=mean_value,
yend=mean_value),
color="black",
size=4)+
geom_segment(data=df1,
aes(x=xmin+0.005,xend=xmax,
y=middle,
yend=middle,
color=group_1),
show.legend = F,
size=5)+
theme_bw()+
theme(legend.position = "top")
image.png
这个方法还是比较繁琐的,不知道有没有比较好的办法
(猜测geom_boxplot函数里应该是有一个步骤计算中位数的,试着看看源代码,看能不能把中位数的代码改为平均值)
欢迎大家关注我的公众号
小明的数据分析笔记本
小明的数据分析笔记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简单小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读笔记;3、生物信息学入门学习资料及自己的学习笔记!