文末送书|如何使用 ggplot2 绘制双轴分离图?

简介: 最近科研绘图中,需要解决这么一个需求。如何将下图中的左图(低配版)转化为右图(高配版, x,y 轴分离)。

简介


最近科研绘图中,需要解决这么一个需求。如何将下图中的左图(低配版)转化为右图(高配版, x,y 轴分离)。

TP1@%O($V_LQ3YQ6948J81E.png


低配版条形图

首先,构造一个数据集作为样例,读者可以根据自己的数据进行调整即可。假设 y 是分类变量,x 是连续型变量。

df1 <- data.frame(
  term = paste0('term', 1:4),
  p.val = runif(4, 1, 5)
)

JSOF(YSVS$X5D[_{{F5HG2C.png

image.gif样例数据集

之后,使用 geom_col() 绘制条形图,简单调整柱子的宽度以及加上 x,y 轴标题。

ggplot(df1, aes(p.val, term)) +
  geom_col(width = 0.6) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

image.gif4C(YL6FB6R8`(U)28$@5I)4.png

低配版条形图


高配版条形图

使用 geom_rangeframe()将 x,y 轴分离。在此之前,创建一个新的数据框,根据你的 x 值,手动划分 x 轴尺度范围。

df2 <- data.frame(x = c(0,2,4,6), y = df1$term)

_%6X4_HRQ]KQJ5BAWJN625M.png

然后进行一些细节的调整,得到下面的图形。这里的细节调整包括:使用 ggthemes 包中的 theme_tufte() 主题,viridis 包的 scale_fill_viridis() 离散配色。填充的 legend 没有实际含义,所以将图例去除(legend.position = 'none')。

注意:这里将柱子按照类别进行填充,当然你也可以使用另一个变量进行填充(下面会给例子)。

ggplot(df1, aes(p.val, term)) +
  geom_col(aes(fill = term), width = 0.6) +
  geom_rangeframe(data = df2, aes(x = x, y = y), sides = 'bl') +
  scale_fill_viridis(discrete = T)+
  theme_tufte() +
  theme(
    legend.position = 'none',
    panel.grid = element_blank(),
    axis.text = element_text(size = rel(1.1))
  ) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

image.gifFF]1$(EJ2B27R%T]A%S8V(A.png

高配版条形图


进阶版条形图

如前面所说,如果读者还想表达另一个变量与这两个变量之间的关系。可以在柱子的填充上加上做文章。假设第三变量为各个 Term 的得分系数 score(连续型变量)。那么对上面的代码进行简单调整,即可得到以下图形。

主要细节调整:geom_col() 中的 aes(fill = score),连续性变量填充使用 scale_fill_gradient2() 以及加上了图例。

df1 <- data.frame(
  term = paste0('term', 1:8),
  p.val = runif(8, 1, 5),
  score = rnorm(8, 0, 1)
)
df2 <- data.frame(x = c(0:6,6), y = df1$term)
ggplot(df1, aes(p.val, term)) +
  geom_col(aes(fill = score), width = 0.6) +
  geom_rangeframe(data = df2, aes(x = x, y = y), sides = 'bl') +
  scale_fill_gradient2(
    low = 'cyan',
    mid = '#fbffff',
    high = 'chocolate1',
    midpoint = 0)+
  theme_tufte() +
  theme(
    legend.position = c(0.9,0.75),
    panel.grid = element_blank(),
    axis.text = element_text(size = rel(1.1))
  ) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

NL}_D6SZF7JKR92E4K3FUIN.png

目录
相关文章
|
人工智能 数据可视化 Go
R绘图实战|GSEA富集分析图
GSEA(Gene Set EnrichmentAnalysis),即基因集富集分析,它的基本思想是使用预定义的基因,将基因按照在两类样本中的差异表达程度排序,然后检验预先设定的基因集合是否在这个排序表的顶端或者底端富集。
3057 0
R绘图实战|GSEA富集分析图
|
Web App开发
Python+selenium 技术篇-浏览器后台运行
Python+selenium 技术篇-浏览器后台运行
918 0
|
3月前
|
人工智能 前端开发 JavaScript
释放Qwen3-Coder潜力:Bolt+AnalyticDB Supabase,打造真正的生产力工具
阿里云发布Qwen3-Coder,具备卓越自主编码能力,支持超长上下文窗口与工具调用,结合Bolt与AnalyticDB Supabase,实现高效开发。
227 2
|
数据可视化
R语言绘图教程丨Nature论文都在用的多组比较箱线图,自动计算显著性并标注,附带误差线
R语言绘图教程丨Nature论文都在用的多组比较箱线图,自动计算显著性并标注,附带误差线
|
机器学习/深度学习 监控 算法
线性与非线性数据降维方法汇总(Python代码实现)
线性与非线性数据降维方法汇总(Python代码实现)
线性与非线性数据降维方法汇总(Python代码实现)
|
Linux Shell 数据处理
Linux命令skill详解
`skill`命令是Linux下的进程管理工具,用于向进程发送信号如TERM、KILL、STOP等。它可以按进程名、PID、用户或终端选择目标。交互模式提供确认操作,选项如`-l`列出信号,`-i`交互,`-KILL`强制终止。示例包括暂停所有bash进程、列出信号、交互式杀用户进程和终止特定终端进程。使用时注意信号影响、权限及避免误操作。了解信号和使用预览选项是最佳实践。
|
应用服务中间件 数据库 nginx
Python Web开发实战:从搭建博客到部署上线
使用Python和Flask初学者指南:从搭建简单博客到部署上线。文章详细介绍了如何从零开始创建一个博客系统,包括准备Python环境、使用Flask和SQLite构建应用、设计数据库模型、创建视图函数和HTML模板,以及整合所有组件。最后,简述了如何通过Gunicorn和Nginx将应用部署到Linux服务器。
|
人工智能 数据可视化 数据挖掘
这图怎么画| 富集分析之双向柱状图
这图怎么画| 富集分析之双向柱状图
438 0
|
关系型数据库 MySQL Linux
Centos7安装MySQL,修改初始密码并且配置打开远程连接访问
Centos7安装MySQL,修改初始密码并且配置打开远程连接访问
1100 0
Centos7安装MySQL,修改初始密码并且配置打开远程连接访问
|
并行计算 调度 Windows
R语言- parallel::mclapply 并行化计算任务
R语言中的 parallel::mclapply 是一个用于在多核CPU上实现并行计算的方法。它是lapply函数的并行版本,可以在多个处理器核心上同时运行lapply函数。mclapply函数的语法与lapply函数类似,但它可以指定要使用的处理器核心数量,从而提高计算速度。
1639 0