该内容已被发布者删除 该内容被自由微信恢复
文章于 3月30日 上午 5:50 被检测为删除。
查看原文
被用户删除
其他

R语言绘图 | 箱线图(从入门到精通)

小陈的R语言笔记 小陈的R语言笔記 2024-03-30

箱线图

箱线图:是一种统计图表,用于展示和比较数据集的分布情况。它由一个矩形框(箱体)和两条延伸出的线段(须)组成。箱体表示数据的四分位数,即数据集的中位数和上下四分位数。中位数表示数据的中心趋势,上下四分位数表示数据的分布范围。须表示数据的离散程度,通常延伸到数据集中的最小值和最大值,但不包括异常值。通过箱线图,可以观察数据的集中趋势、离散程度和异常值,辅助分析数据的分布特征和比较不同数据集之间的差异。

线条名称说明
最小值等于该样本中所有数值的最小值
平均值是指在一组数据中所有数据之和再除以这组数据的个数。通常是指样本均值
最大值等于该样本中所有数值的最大值
中位数等于该样本中所有数值由小到大排列后第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 轴标签

颜色

使用 fillcolouralpha 设置唯一的颜色

# 使用 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


继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存