前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R可视化:不一样的ggplot2箱线图

R可视化:不一样的ggplot2箱线图

原创
作者头像
生信学习者
发布2024-07-01 22:43:49
540
发布2024-07-01 22:43:49

欢迎大家关注全网生信学习者系列:

  • WX公zhong号:生信学习者
  • Xiao hong书:生信学习者
  • 知hu:生信学习者
  • CDSN:生信学习者2

介绍

使用 ggplot2 包画箱线图通常使用 geom_boxplot() 函数。箱线图(Boxplot)是一种用于展示一组数据分布特征的图形,它能够提供以下信息:

  1. 中位数:箱线图中的中位线表示数据的中位数。
  2. 四分位数:箱线图的箱子部分表示数据的四分位数范围,即25%和75%分位数,这可以展示数据的中间50%的分布情况。
  3. 异常值:箱线图通常会用点来表示异常值,即那些远离数据主体的值。
  4. 最小值和最大值:在某些箱线图中,除了四分位数之外,还会展示最小值和最大值(不包括异常值)。
  5. 数据的偏斜性:箱线图的形状可以揭示数据的偏斜性。如果箱子是对称的,那么数据可能接近正态分布;如果箱子倾斜,则数据可能偏斜。

箱线图非常适合用于比较不同组别的数据分布情况,例如,比较不同治疗方法的效果,或者不同群体的某个指标的分布。

在ggplot2 中,可以通过使用 geom_point() 来在箱线图上增加点,这些点可以代表分组中特定指标的出现率。

网格状箱线图

patternplot 是一个 R 包,它提供了创建网格状箱线图的功能,这种图表通常用于展示多个组别或条件下的数据分布。patternplot 包的 pattern_boxplot() 函数可以生成这样的图形,它允许用户在网格中为每个子集绘制箱线图,从而可以直观地比较不同组别或条件下的数据。下面是box1参数的详细解释:

  • data: 包含要展示的数据的数据框。
  • x: 箱线图的 x 轴变量,通常是分组的因子。
  • y: 箱线图的 y 轴变量,表示要展示的数值数据。
  • group: 分组变量,用于区分不同的箱线图。
  • pattern.type: 指定图案的类型,可以是 "lattice"(格子)或其他。
  • pattern.line.size: 图案线条的粗细。
  • label.size: x 轴上分组标签的字体大小。
  • pattern.color: 图案的颜色。
  • background.color: 图表背景颜色。
  • frame.color: 图表框架的颜色。
  • density: 密度参数,可能用于调整箱线图内密度图的显示。
  • legend.h: 图例的高度。
  • legend.x.pos 和 legend.y.pos: 图例在图表中的位置。
  • legend.pixel: 图例中图案的像素大小。
  • legend.w: 图例的宽度。
  • legend.label: 图例的标签,用于说明不同图案代表的组别或条件。
代码语言:javascript
复制
library(patternplot)
library(png)
library(ggplot2)
library(gridExtra)
​
data <- read.csv(system.file("extdata", "fruits.csv", package = "patternplot"))
group <- data$Fruit
y <- data$Weight
x <- data$Store
​
pattern.type <- c('nwlines', 'blank', 'waves')
pattern.color <- c('black','black', 'black')
background.color <- c('white','gray80', 'white')
frame.color <- c('black', 'black', 'black')
pattern.line.size <- c(6, 1,6)
density <- c(6, 1, 8)
​
​
box1 <- patternboxplot(
  data, x, y, group = group,
  pattern.type = pattern.type,
  pattern.line.size = pattern.line.size, 
  label.size = 3, 
  pattern.color = pattern.color, 
  background.color = background.color,
  frame.color = frame.color,
  density = density,  
  legend.h = 2, 
  legend.x.pos = 1.075, 
  legend.y.pos = 0.499, 
  legend.pixel = 10,
  legend.w = 0.18, 
  legend.label = c("Orange","Strawberry","Watermelon")) +
  ggtitle('(A) Boxplot with Black and White Patterns')
​
pattern.color <- c('black','white', 'grey20')
background.color <- c('gold','lightpink', 'lightgreen')
​
box2 <- patternboxplot(
  data, x, y, group = group,
  pattern.type = pattern.type,
  pattern.line.size = pattern.line.size, 
  label.size = 3,
  pattern.color = pattern.color, 
  background.color = background.color,
  frame.color = frame.color, 
  density = density,
  legend.h = 2, 
  legend.x.pos = 1.075, 
  legend.y.pos = 0.499, 
  legend.pixel = 10,
  legend.w = 0.18, 
  legend.label = c("Orange","Strawberry","Watermelon")) +
  ggtitle('(B) Boxplot with Colors and Patterns')
​
grid.arrange(box1, box2, nrow = 1)

结果:不同网格展示的分组的箱线图

加载R包

代码语言:javascript
复制
library(tidyverse)
library(ggplot2)
​
rm(list = ls())
options(stringsAsFactors = F)

导入数据

代码语言:javascript
复制
data("iris")
​
head(iris)

Sepal.Length<dbl>

Sepal.Width<dbl>

Petal.Length<dbl>

Petal.Width<dbl>

Species<fctr>

1

5.1

3.5

1.4

0.2

setosa

2

4.9

3.0

1.4

0.2

setosa

3

4.7

3.2

1.3

0.2

setosa

4

4.6

3.1

1.5

0.2

setosa

5

5.0

3.6

1.4

0.2

setosa

6

5.4

3.9

1.7

0.4

setosa

处理数据

  • 选择Sepal.Length指标和Species分组
  • 计算Sepal.Length在每个分组的出现率和对应画图位置坐标
代码语言:javascript
复制
plotdata <- iris |>
  dplyr::select(Sepal.Length, Species) |>
  dplyr::mutate(Species = factor(Species, c("setosa", "versicolor", "virginica"))) |>
  dplyr::rename(Group = Species,
                Index = Sepal.Length) 
​
occ_cutoff <- 5.2
​
occ_fun <- function(x) {
  return(round(length(x[x > occ_cutoff])/length(x), 4))
}
​
plotOcc <- plotdata |>
  dplyr::group_by(Group) |>
  dplyr::summarise(occ = occ_fun(Index)) |>
  dplyr::mutate(occ_lab = paste0(occ * 100, "%")) |>
  dplyr::mutate(position = min(plotdata$Index) - min(plotdata$Index) * 0.1)
​
head(plotOcc)

Group<fctr>

occ<dbl>

occ_lab<chr>

position<dbl>

setosa

0.22

22%

3.87

versicolor

0.90

90%

3.87

virginica

0.98

98%

3.87

画图:更多代码都来自于 https://mp.weixin.qq.com/s/d2Xht6sC7-P6ZqgTqFf13g

采用ggplot2的画图,下面是代码的逐行解析:

  1. ggplot(data = plotdata, aes(x = Group, y = Index, color = Group))
    • 初始化一个 ggplot 对象,使用 plotdata 数据框,并设置分组变量 Group 映射到 x 轴,指标 Index 映射到 y 轴,同时 Group 映射到颜色,用于区分不同组的颜色。
  2. stat_boxplot(geom = "errorbar", width = 0.15)
    • 添加一个箱线图的统计变换,这里使用 errorbar 几何对象,宽度设置为 0.15,这可能是用来表示箱线图的中位数线或四分位数范围的误差条。
  3. geom_boxplot(width = .4, outlier.shape = NA)
    • 添加一个箱线图几何对象,箱子的宽度设置为 0.4,并且移除异常值(outliers)的点。
  4. geom_point(size = 2, shape = 5)
    • 在箱线图上添加点,大小为 2,形状为 5(通常是一个星号)。
  5. labs(x = "")
    • 设置 x 轴的标签为空字符串。
  6. scale_y_continuous(expand = expansion(mult = c(0.1, 0.1)))
    • 设置 y 轴为连续比例尺,并添加一些扩展空间,mult 参数设置为 0.1,意味着在 y 轴的两端各增加 10% 的空间。
  7. geom_point(data = plotOcc, aes(x = Group, y = position, size = occ), show.legend = FALSE, shape = 1, stroke = 1)
    • 根据 plotOcc 数据框添加点,这些点表示出现率,映射 Group 到 x 轴,position 到 y 轴,occ 到点的大小,不显示图例,点的形状设置为 1(圆形),并且有 1 的描边。
  8. geom_text(data = plotOcc, aes(x = Group, y = position, label = occ_lab), show.legend = FALSE)
    • plotOcc 数据框的基础上添加文本标签,映射 Group 到 x 轴,position 到 y 轴,occ_lab 作为标签文本,不显示图例。
  9. scale_size_continuous(range = c(10, 12))
    • 设置点的大小比例尺,范围从 10 到 12。
  10. coord_flip()
    • 翻转坐标轴,使得 x 轴变为垂直,y 轴变为水平。
  11. guides(color = "none")
    • 设置颜色图例为不显示。
  12. theme_classic()
    • 应用经典的 ggplot2 主题。
  13. theme(axis.title = element_text(size = 12, color = "black", face = "bold"), axis.text = element_text(size = 10, color = "black"), text = element_text(size = 9, color = "black"))
    • 自定义图表的主题元素,设置轴标题和文本的大小、颜色和字体加粗。
代码语言:javascript
复制

pl

结果:带有显示Index在不同分组出现率的箱线图

画图: prism主题

结果:带有显示Index在不同分组出现率的prism风格的箱线图

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 网格状箱线图
  • 加载R包
  • 导入数据
  • 处理数据
  • 画图:更多代码都来自于 https://mp.weixin.qq.com/s/d2Xht6sC7-P6ZqgTqFf13g
  • 画图: prism主题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档