R语言绘图 --- 气泡图(Biorplot 开发日志 --- 4)

「写在前面」

在科研数据分析中我们会重复地绘制一些图形,如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包(Biorplot),用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。


相关链接

相关代码和文档都存放在了 Biorplot GitHub 仓库:
https://github.com/zhenghu159/Biorplot

欢迎大家 Follow 我的 GitHub 账号:
https://github.com/zhenghu159

我会不定期更新生物信息学相关工具和学习资料。如果您有任何问题和建议,或者想贡献自己的代码,请在我的 GitHub 上留言。

介绍

气泡图,是一种以二维图形展示多维数据的可视化工具。它将数据点绘制在平面坐标系中,每个数据点用一个圆圈表示,圆圈的大小通常与某个维度的数值大小相关。通过气泡图,我们可以轻松地观察到数据点在各个维度上的分布情况,从而更好地理解数据的结构和规律。

Biorplot 中,我封装了 Bior_DotPlot() 函数来实现气泡图的绘制。

基础气泡图

绘制一个基础的气泡图如下:

绘图代码:

复制代码
df <- data.frame(
  Sample = rep(paste('sample', 1:5, sep=''), 4),
  Gene = rep(paste('gene', 1:4, sep=''), 5),
  size = round(rnorm(20, mean = 10, sd = 5))
)
colour <- c("#1F77B4FF","#FF7F0EFF","#2CA02CFF","#D62728FF","#9467BDFF")
Bior_DotPlot(data = df, x = "Sample", y = "Gene", size = "size", color = "Gene",
             x.text.col = F, ggtheme = theme_bw()) + 
  theme(axis.text.x = element_text(angle = 0, hjust = 0.5))

表达量气泡图

绘制一个表达量气泡图如下:

绘图代码:

复制代码
df <- data.frame(
  Sample = rep(paste('sample', 1:4, sep=''), each=4),
  Gene = rep(paste('gene', 1:4, sep=''), 4),
  Pct = c(80,10,10,10,10,80,10,10,10,10,80,10,10,10,10,80),
  Expression = c(3,0.5,0.1,0.3,0.3,3,0.2,0.6,0.1,0.7,3,0.1,0.5,0.2,0.1,3)
)

Bior_DotPlot(data = df, x = "Sample", y = "Gene", size="Pct", color = "Expression",
             x.text.col = F, ggtheme = theme_bw()) + 
  theme(axis.text.x = element_text(angle = 0, hjust = 0.5)) +
  scale_color_gradientn(colours = c("lightblue3", "lightblue", "white", "red", "red4"))

源码解析

Biorplot::Bior_DotPlot() 函数主要继承了 ggpubr::ggdotchart() 函数。

源码:

复制代码
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#' Dot Plot
#' @description Create a dot plot.
#'
#' @importFrom ggpubr ggdotchart
#' @import ggplot2
#'
#' @inheritParams ggpubr::ggdotchart
#'
#' @return A ggplot object
#' @export
#'
#' @examples
#' # Examples 1
#' x <- rep(paste('sample', 1:5, sep=''), 4)
#' y <- rep(paste('gene', 1:4, sep=''), 5)
#' size <- round(rnorm(20, mean = 10, sd = 5))
#' colour <- c("#1F77B4FF","#FF7F0EFF","#2CA02CFF","#D62728FF","#9467BDFF")
#' p <- Bior_DotPlot(x = x, y = y, size = size, group.by = x, colour = colour, max_size=10)
#' p
Bior_DotPlot <- function(data, x, y, group = NULL,
                         combine = FALSE,
                         color = "black", palette = NULL,
                         shape = 19, size = NULL, dot.size = size,
                         sorting = c("ascending", "descending", "none"),
                         x.text.col = TRUE,
                         rotate = FALSE,
                         title = NULL, xlab = NULL, ylab = NULL,
                         facet.by = NULL, panel.labs = NULL, short.panel.labs = TRUE,
                         select = NULL, remove = NULL, order = NULL,
                         label = NULL, font.label = list(size = 11, color = "black"),
                         label.select = NULL, repel = FALSE, label.rectangle = FALSE,
                         position = "identity",
                         ggtheme = theme_pubr(),
                         ...)
{
  # Default options
  .opts <- list(data = data, x = x, y = y, group = group,
                combine = combine,
                color = color, palette = palette,
                shape = shape, size = size, dot.size = size,
                sorting = sorting,
                x.text.col = x.text.col,
                rotate = rotate,
                title = title, xlab = xlab, ylab = ylab,
                facet.by = facet.by, panel.labs = panel.labs, short.panel.labs = short.panel.labs,
                select = select, remove = remove, order = order,
                label = label, font.label = font.label,
                label.select = label.select, repel = repel, label.rectangle = label.rectangle,
                position = position,
                ggtheme = ggtheme,
                ...)

  p <- do.call(ggpubr::ggdotchart, .opts)

  return(p)
}

#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

「结束」

注:本文为个人学习笔记,仅供大家参考学习,不得用于任何商业目的。如有侵权,请联系作者删除。

本文由mdnice多平台发布

相关推荐
这个DBA有点耶10 小时前
云上运维新挑战:当数据库不再“看得见摸得着”
数据库·sql·程序人生·云原生·运维开发·学习方法·dba
charlee4412 小时前
代码之外:一个技术人的职场困境与自我和解
程序人生·技术管理·职场反思·自我和解·价值实现
风静如云19 小时前
程序人生:失业数月
程序人生
郝学胜-神的一滴21 小时前
Python 高级编程 018:深挖 super
开发语言·python·程序人生·软件构建
hai3152475431 天前
有规则的AI编制操作系统演进过程展示
人工智能·程序人生·算法·逻辑回归·创业创新
玩c#的小杜同学2 天前
一周 AI 新鲜事|2026.05.25—2026.05.31
人工智能·程序人生·ai·c#·程序员创富
郝学胜-神的一滴2 天前
Qt 高级开发 021:零基础吃透 QVBoxLayout 垂直布局
开发语言·c++·qt·程序人生·用户界面
luweis2 天前
企智孪生 ETA (3.5 执行层技术落地)【浙江联保网络 卢伟舜】
网络·人工智能·程序人生·职场和发展·学习方法
runafterhit3 天前
第一性原理总结:修正一推就倒的认知大厦
程序人生
郝学胜-神的一滴3 天前
Qt 高级开发 016:半内存管理机制
开发语言·c++·qt·程序人生·用户界面