箱線圖展示的就是分位數(shù),中間的線表示的是中位數(shù)冗恨,也就是50%分位數(shù),如果非要在箱線圖上畫上表示平均值的線段也是可以實(shí)現(xiàn)的,今天介紹一下實(shí)現(xiàn)代碼
示例數(shù)據(jù)集我們用R語言的內(nèi)置數(shù)據(jù)集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
通過ggplot_build()函數(shù)可以獲取畫箱線圖用到的數(shù)據(jù)
ggplot_build(p1)$data[[1]]
我們利用原始數(shù)據(jù)計算一下平均值且改,然后將數(shù)據(jù)集的平均值添加到這組數(shù)據(jù)中
df %>%
group_by(group) %>%
summarise(mean_value=mean(weight)) %>%
rename("group_1"="group") %>%
cbind(ggplot_build(p1)$data[[1]]) -> df1
然后利用geom_segment()函數(shù)添加品均值的線段
p1+
geom_segment(data=df1,
aes(x=xmin,xend=xmax,
y=mean_value,
yend=mean_value),
color="red")
這里如果不想要中位數(shù)的線的話
找到一種辦法是重新畫一條線把原來的中位數(shù)的線給蓋住
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)
最后稍微美化一下
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")
這個方法還是比較繁瑣的,不知道有沒有比較好的辦法
(猜測geom_boxplot函數(shù)里應(yīng)該是有一個步驟計算中位數(shù)的板驳,試著看看源代碼又跛,看能不能把中位數(shù)的代碼改為平均值)
歡迎大家關(guān)注我的公眾號
小明的數(shù)據(jù)分析筆記本
小明的數(shù)據(jù)分析筆記本 公眾號 主要分享:1、R語言和python做數(shù)據(jù)分析和數(shù)據(jù)可視化的簡單小例子若治;2慨蓝、園藝植物相關(guān)轉(zhuǎn)錄組學(xué)感混、基因組學(xué)、群體遺傳學(xué)文獻(xiàn)閱讀筆記礼烈;3弧满、生物信息學(xué)入門學(xué)習(xí)資料及自己的學(xué)習(xí)筆記!