该内容已被发布者删除 该内容被自由微信恢复。
文章于 3月30日 上午 5:50 被检测为删除。
被用户删除
其他
R语言绘图 | 箱线图(从入门到精通)
箱线图
箱线图:是一种统计图表,用于展示和比较数据集的分布情况。它由一个矩形框(箱体)和两条延伸出的线段(须)组成。箱体表示数据的四分位数,即数据集的中位数和上下四分位数。中位数表示数据的中心趋势,上下四分位数表示数据的分布范围。须表示数据的离散程度,通常延伸到数据集中的最小值和最大值,但不包括异常值。通过箱线图,可以观察数据的集中趋势、离散程度和异常值,辅助分析数据的分布特征和比较不同数据集之间的差异。
线条名称 | 说明 |
---|---|
最小值 | 等于该样本中所有数值的最小值 |
平均值 | 是指在一组数据中所有数据之和再除以这组数据的个数。通常是指样本均值 |
最大值 | 等于该样本中所有数值的最大值 |
中位数 | 等于该样本中所有数值由小到大排列后第50%的数字 |
四分位数 | 把一组数中的数据由小到大排列并分成四等份,处于三个分割点位置的数字就是四分位数 |
下四分位数 | 等于该样本中所有数值由小到大排列后第25%的数字 |
上四分位数 | 等于该样本中所有数值由小到大排列后第75%的数字 |
基础的箱线图
#加载R包
library(ggplot2)
# mtcars 数据集是内置的
head(mtcars)
# 一个非常基础的箱线图
ggplot(mtcars, aes(x=as.factor(cyl), y=mpg)) +
geom_boxplot(fill="slateblue", alpha=0.2) +
xlab("cyl") # 设置 x 轴标签为 "cyl"
外观
# mpg 数据集是内置的
head(mpg)
# geom_boxplot 提供了几个参数来定制外观
ggplot(mpg, aes(x=class, y=hwy)) +
geom_boxplot(
# 定制箱线图外观
color="blue", # 箱线图边框颜色为蓝色
fill="blue", # 箱线图填充颜色为蓝色
alpha=0.2, # 设置透明度为 0.2
# 凹口?
notch=TRUE, # 开启凹口
notchwidth = 0.8, # 设置凹口宽度为 0.8
# 定制离群值
outlier.colour="red", # 离群值边框颜色为红色
outlier.fill="red", # 离群值填充颜色为红色
outlier.size=3 # 离群值点大小为 3
)
排序
# 加载R包
library(forcats)
library(dplyr)
# 使用中位数
mpg %>%
mutate(class = fct_reorder(class, hwy, .fun='median')) %>%
ggplot( aes(x=reorder(class, hwy), y=hwy, fill=class)) +
geom_boxplot() +
xlab("class") + # 设置 x 轴标签为 "class"
theme(legend.position="none") + # 不显示图例
xlab("") # 清空 x 轴标签
# 使用每组观察数量
mpg %>%
mutate(class = fct_reorder(class, hwy, .fun='length' )) %>%
ggplot( aes(x=class, y=hwy, fill=class)) +
geom_boxplot() +
xlab("class") + # 设置 x 轴标签为 "class"
theme(legend.position="none") + # 不显示图例
xlab("") + # 清空 x 轴标签
xlab("") # 再次清空 x 轴标签
颜色
使用 fill
、colour
和 alpha
设置唯一的颜色
# 使用 fill、colour 和 alpha 设置唯一的颜色
ggplot(mpg, aes(x=class, y=hwy)) +
geom_boxplot(color="red", # 箱线图边框颜色为红色
fill="orange", # 箱线图填充颜色为橙色
alpha=0.2) # 设置透明度为 0.2
为每个组设置不同的颜色
# 为每个组设置不同的颜色
ggplot(mpg, aes(x=class, y=hwy, fill=class)) +
geom_boxplot(alpha=0.3) + # 设置透明度为 0.3
theme(legend.position="none") # 不显示图例
使用 BuPu 调色板
# 使用 BuPu 调色板
ggplot(mpg, aes(x=class, y=hwy, fill=class)) +
geom_boxplot(alpha=0.3) + # 设置透明度为 0.3
theme(legend.position="none") + # 不显示图例
scale_fill_brewer(palette="BuPu") # 使用 BuPu 调色板
使用 Dark2 调色板
# 使用 Dark2 调色板
ggplot(mpg, aes(x=class, y=hwy, fill=class)) +
geom_boxplot(alpha=0.3) + # 设置透明度为 0.3
theme(legend.position="none") + # 不显示图例
scale_fill_brewer(palette="Dark2") # 使用 Dark2 调色板
突出显示
# 加载R包
library(ggplot2)
library(dplyr)
library(hrbrthemes)
# 使用原生可用的 mpg 数据集
mpg %>%
# 添加一个名为 'type' 的列:我们是否想要突出显示该组?
mutate( type=ifelse(class=="subcompact","Highlighted","Normal")) %>%
# 构建箱线图。在 'fill' 参数中,使用这一列
ggplot( aes(x=class, y=hwy, fill=type, alpha=type)) +
geom_boxplot() +
scale_fill_manual(values=c("#69b3a2", "grey")) + # 手动设置填充颜色
scale_alpha_manual(values=c(1,0.1)) + # 手动设置透明度
theme_ipsum() + # 应用主题
theme(legend.position = "none") + # 不显示图例
xlab("") # 清空 x 轴标签
分组箱线图
# 创建一个数据框
variety=rep(LETTERS[1:7], each=40) # 创建变量 variety,每个字母重复 40 次
treatment=rep(c("high","low"),each=20) # 创建变量 treatment,每个水平重复 20 次
note=seq(1:280)+sample(1:150, 280, replace=T) # 创建变量 note,生成一个序列并添加随机数
data=data.frame(variety, treatment , note) # 创建数据框
# 分组箱线图
ggplot(data, aes(x=variety, y=note, fill=treatment)) +
geom_boxplot() # 使用分组箱线图表示数据
# 每个治疗方式一个箱线图
ggplot(data, aes(x=variety, y=note, fill=treatment)) +
geom_boxplot() + # 使用分组箱线图表示数据
facet_wrap(~treatment) # 按照 treatment 变量分面展示
# 每个品种一个箱线图
ggplot(data, aes(x=variety, y=note, fill=treatment)) +
geom_boxplot() + # 使用分组箱线图表示数据
facet_wrap(~variety, scale="free") # 按照 variety 变量分面展示,并自由缩放
设置宽度
# 加载R包
library(ggplot2)
# 创建数据
names <- c(rep("A", 20) , rep("B", 5) , rep("C", 30), rep("D", 100))
value <- c( sample(2:5, 20 , replace=T) , sample(4:10, 5 , replace=T), sample(1:7, 30 , replace=T), sample(3:8, 100 , replace=T) )
data <- data.frame(names,value)
# 准备特殊的 x 轴标签,显示每组观察数量
my_xlab <- paste(levels(data$names),"\n(N=",table(data$names),")",sep="")
# 绘图
ggplot(data, aes(x=names, y=value, fill=names)) +
geom_boxplot(varwidth = TRUE, alpha=0.2) + # 使用变宽箱线图,并设置透明度
theme(legend.position="none") + # 不显示图例
scale_x_discrete(labels=my_xlab) # 设置 x 轴标签
连续变量箱线图
# 加载R包
library(ggplot2)
library(dplyr)
library(hrbrthemes)
# 从 R 中的 diamonds 数据集开始:
p <- diamonds %>%
# 添加一个名为 'bin' 的新列:将初始的 'carat' 划分到不同的区间
mutate( bin=cut_width(carat, width=0.5, boundary=0) ) %>%
# 绘图
ggplot( aes(x=bin, y=price) ) +
geom_boxplot(fill="#69b3a2") + # 使用指定颜色填充箱线图
theme_ipsum() + # 应用主题
xlab("Carat") # 设置 x 轴标签
p
添加平均值
# 加载R包
library(ggplot2)
# 创建数据
names=c(rep("A", 20) , rep("B", 8) , rep("C", 30), rep("D", 80))
value=c( sample(2:5, 20 , replace=T) , sample(4:10, 8 , replace=T), sample(1:7, 30 , replace=T), sample(3:8, 80 , replace=T) )
data=data.frame(names,value)
# 绘图
p <- ggplot(data, aes(x=names, y=value, fill=names)) +
geom_boxplot(alpha=0.7) + # 使用指定透明度绘制箱线图
stat_summary(fun.y=mean, geom="point", shape=20, size=14, color="red", fill="red") + # 添加均值点
theme(legend.position="none") + # 不显示图例
scale_fill_brewer(palette="Set1") # 使用 Set1 调色板填充颜色
p
添加散点
# 加载R包
library(tidyverse)
library(hrbrthemes)
library(viridis)
# 创建数据集
data <- data.frame(
name=c( rep("A",500), rep("B",500), rep("B",500), rep("C",20), rep('D', 100) ),
value=c( rnorm(500, 10, 5), rnorm(500, 13, 1), rnorm(500, 18, 1), rnorm(20, 25, 4), rnorm(100, 12, 1) )
)
# 绘图
data %>%
ggplot( aes(x=name, y=value, fill=name)) +
geom_boxplot() + # 绘制箱线图
scale_fill_viridis(discrete = TRUE, alpha=0.6) + # 使用 Viridis 调色板填充颜色,并设置透明度
geom_jitter(color="black", size=0.4, alpha=0.9) + # 添加抖动点
theme_ipsum() + # 应用主题
theme(
legend.position="none", # 不显示图例
plot.title = element_text(size=11) # 设置图标题字体大小
) +
ggtitle("A boxplot with jitter") + # 设置图标题
xlab("") # 清空 x 轴标签
边际图
# 加载R包
library(ggplot2)
library(ggExtra)
# mtcars 数据集在 R 中是内置的
head(mtcars)
# 经典图:
p <- ggplot(mtcars, aes(x=wt, y=mpg, color=cyl, size=cyl)) +
geom_point() + # 绘制散点图
theme(legend.position="none") # 不显示图例
# 边缘箱线图
p1 <- ggMarginal(p, type="boxplot") # 添加边缘箱线图
p1