Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R tips:ggplot2进行多维原位图绘制

R tips:ggplot2进行多维原位图绘制

作者头像
生信菜鸟团
发布于 2025-01-07 06:18:40
发布于 2025-01-07 06:18:40
12900
代码可运行
举报
文章被收录于专栏:生信菜鸟团生信菜鸟团
运行总次数:0
代码可运行

R中可以使用ggplot2的geom_tile图层绘制热图,可是有的时候我们想要每一个热图格子里面可以展示多维的信息:多个基因表达量、多个组别数据等等,而不是一个热图仅展示了一个表达量信息。本文可以解决这个需求。

先模拟两组热图数据,dat_1与dat_2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(tidyverse)
 

 
len_row <- 20
 
len_col <- 5
 

 
set.seed(1234)
 
dat_1 <- matrix(
 
  rnorm(len_row * len_col, 0, 1),
 
  nrow = len_row,
 
  ncol = len_col
 
)
 

 
dat_2 <- matrix(
 
  rnorm(len_row * len_col, 0, 10),
 
  nrow = len_row,
 
  ncol = len_col
 
)
 

 
rownames(dat_1) <- paste0('row', seq.int(len_row))
 
colnames(dat_1) <- paste0('col', seq.int(len_col))
 

 
rownames(dat_2) <- paste0('row', seq.int(len_row))
 
colnames(dat_2) <- paste0('col', seq.int(len_col))
 

 
# plot dat_1, dat_2
 
cowplot::plot_grid(
 
  pheatmap::pheatmap(dat_1, main = "dat_1", silent = T)$gtable,
 
  pheatmap::pheatmap(dat_2, main = "dat_2", silent = T)$gtable
 
)

模拟数据展示

模拟数据如下图所示,而我们想要的效果是合并这两个热图,绘制到同一个热图中。

ggplot绘制热图

ggplot可以使用geom_tile绘制热图,比如dat1的热图可以绘制如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dat_1_tidy <-
 
  dat_1 %>%
 
 as.data.frame() %>%
 
  rownames_to_column("row") %>%
 
  pivot_longer(-row, names_to = 'col', values_to = "val")
 

 

 
dat_2_tidy <-
 
  dat_2 %>%
 
 as.data.frame() %>%
 
  rownames_to_column("row") %>%
 
  pivot_longer(-row, names_to = 'col', values_to = "val")
 

 
# plot
 
p_heat_1 <-
 
  ggplot() +
 
  geom_tile(
 
    data = dat_1_tidy,
 
    aes(x = col, y = row, fill = val, height = 1, width = 1)
 
 ) +
 
  scale_fill_gradientn(colors = rev(RColorBrewer::brewer.pal(11, 'RdBu'))) +
 
  theme_minimal()
 
p_heat_1

热图如下图:

使用position_nudge绘制多维信息的热图

如果需要将两个热图合并到一起,那么可以将热图的格子高度减为以前的一半,然后将其中一个数据上移,另一个数据下移,那么就可以将两组数据刚好在原来的位置堆叠摆放:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p_heat_combined <- 
 
  ggplot() +
 
  geom_tile(
 
    data = dat_1_tidy,
 
    aes(x = col, y = row, fill = val, height = 0.5, width = 1),
 
    position = position_nudge(y = 0.25)
 
 ) +
 
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, 'Blues')) +
 
  theme_minimal() +
 
  ggnewscale::new_scale_fill() +
 
  geom_tile(
 
    data = dat_2_tidy,
 
    aes(x = col, y = row, fill = val, height = 0.5, width = 1),
 
    position = position_nudge(y = -0.25)
 
 ) +
 
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, "Reds")) +
 
  labs(
 
    fill_ggnewscale_1 = "dat1",
 
    fill = "dat2"
 
 ) 
 
p_heat_combined

如下图所示,两组数据以不同颜色方案(蓝色是dat1,红色是dat2)的方式组合到了一起,如果不需要分开两个颜色方案,可以关闭上述代码中的ggnewscale::newscalefill。

另可以将每个热图格子的边框加上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p_heat_combined2 <-
 
  p_heat_combined + 
 
  geom_tile(
 
    data = dat_1_tidy,
 
    aes(x = col, y = row), color = "gray50", fill = NA, linewidth = 0.6
 
 )
 
p_heat_combined2

略做优化的一个多维热图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# data做scale
 
dat_1_tidy2 <- 
 
  dat_1_tidy %>% 
 
  group_by(row) %>% 
 
  mutate(val = as.numeric(scale(val)))
 

 
dat_2_tidy2 <- 
 
  dat_2_tidy %>% 
 
  group_by(row) %>% 
 
  mutate(val = as.numeric(scale(val)))
 

 
# 绘图
 
p_heat_combined3 <-
 
  ggplot() +
 
  geom_tile(
 
    data = dat_1_tidy2,
 
    aes(x = col, y = row, fill = val, height = 0.3, width = 0.9),
 
    position = position_nudge(y = 0.15)
 
 ) +
 
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, 'Blues')) +
 
  theme_minimal() +
 
  theme(panel.grid = element_blank()) +
 
  geom_tile(
 
    data = dat_2_tidy2,
 
    aes(x = col, y = row, fill = val, height = 0.3, width = 0.9),
 
    position = position_nudge(y = -0.15)
 
 ) +
 
  scale_fill_gradientn(colors = rev(RColorBrewer::brewer.pal(11, "RdBu"))) +
 
  geom_tile(
 
    data = dat_1_tidy,
 
    aes(x = col, y = row), color = "gray80", fill = NA, linewidth = 0.6
 
 )
 
p_heat_combined3

稍作优化,将数据做scale处理,每个热图格子里面绘制两组数据:上面的是dat1,下面的是dat2,热图格子加灰色边框,如下图所示:

这个思路是可以推广的,不限于只展示两组数据,而且也不限于是geom_tile图层,geom_point图层也是可以的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ggplot2绘制多图层相关性热图
R语言数据分析指南
2023/10/24
8870
ggplot2绘制多图层相关性热图
Nature图表复现|热图叠加折线图
R语言数据分析指南
2023/10/24
7810
Nature图表复现|热图叠加折线图
ggplot2优雅绘制相关性网络热图(批量修改字符)
R语言数据分析指南
2024/07/02
3610
ggplot2优雅绘制相关性网络热图(批量修改字符)
🤫 linkET | 完美解决ggcor安装失败方案(附教程)
最近看了一个出自Science的神图,在网上搜遍教程,踩了好多坑,在这里分享一下完美解决方案~ (•‿•)
生信漫卷
2022/10/31
2K0
🤫 linkET | 完美解决ggcor安装失败方案(附教程)
浅谈R中相关性网络热图绘制小细节
❝最近在绘制相关性网络热图的时候突然有一个小的发现,可以使用相关性热图的数据来结合「linkET」来绘图,以前一直认为为必须使用「mantel_test」才行;果然绘图还得多思考;本节就来通过一个案例将两份数据结合起来进行绘图;
R语言数据分析指南
2022/12/20
3.2K2
浅谈R中相关性网络热图绘制小细节
基于CellMiner数据库的基因表达与药敏分析
CellMiner数据库,主要是通过国家癌症研究所癌症研究中心(NCI)所列出的60种癌细胞为基础而建立的。该数据库最初发表于2009年,后于2012年在Cancer Research杂志上进行了更新,题目为“CellMiner: a web-based suite of genomic and pharmacologic tools to explore transcript and drug patterns in the NCI-60 cell line set”。大家后期在使用该数据库记得应用相关文献。
DoubleHelix
2022/11/24
4.5K0
基于CellMiner数据库的基因表达与药敏分析
[GBD数据库挖掘] 13.ggplot2绘制风险因素图
R语言数据分析指南
2023/11/23
5660
[GBD数据库挖掘] 13.ggplot2绘制风险因素图
多系列数据核密度图
ggridges包提供了geom_density_ridges_gradient()函数,用于画核密度估计峰峦图
爱学习的小明明
2020/09/26
2.1K0
多系列数据核密度图
跟着Microbiome学绘图(1) 个性化组合进化树与热图
❝今天来介绍如何对进化树枝进行折叠,将属于同一分支的折叠,从下面的论文中挑出一份数据通过一个小例子来展示 ❞ 加载R包 library(tidyverse) library(ggtree) library(ggdendro) library(patchwork) 加载数据 df <- read_csv("Figure5-metabolicfunctions_logtpm.csv") %>% dplyr::rename(tax=`...1`) %>% column_to_rownames(v
R语言数据分析指南
2022/09/21
7100
跟着Microbiome学绘图(1) 个性化组合进化树与热图
跟着NatureMetabolism学作图:R语言ggplot2画热图展示基因表达量
https://www.nature.com/articles/s42255-022-00629-2#Sec15
用户7010445
2023/01/06
1.2K0
跟着NatureMetabolism学作图:R语言ggplot2画热图展示基因表达量
R-gstat+ggplot2-克里金(Kriging)插值计算及可视化绘制
上篇推文我们介绍了使用Python-pykrige包实现了克里金(Kriging)插值计算及对应的可视化结果绘制,详细内容点击下方链接:Python-pykrige包-克里金(Kriging)插值计算及可视化绘制,相信你也感受到了Python的简单方便性。本期推文,我们就推出使用R-gstat包实现克里金(Kriging)插值的计算及对应结果的可视化绘制,主要知识点如下:
DataCharm
2021/02/22
4.1K0
R-gstat+ggplot2-克里金(Kriging)插值计算及可视化绘制
[R包分享] corrmorant卡通化相关性矩阵
❝本节来介绍一个基于「ggplot2」来绘制相关性矩阵的R包,完美兼容「ggplot2」语法;下面通过一个案例来简单介绍一下,具体请查看作者官方文档 ❞ https://github.com/r-link/corrmorant 安装并加载R包 library(tidyverse) remotes::install_github("r-link/corrmorant") library(corrmorant) library(ggfx) library(RColorBrewer) 案例一 corrmor
R语言数据分析指南
2022/09/23
1K0
[R包分享] corrmorant卡通化相关性矩阵
R中循环处理多组间相关性分析
R语言数据分析指南
2023/11/30
3280
R中循环处理多组间相关性分析
R-ggTimeSeries | ggplot2: 热力日历图
我们平常的日历也可以当作可视化工具,适用于显示不同时间段,以及活动事件的组织情况。时间段通常以不同单位显示,例如日、周、月和年。今天我们最常用的日历形式是公历,每个月份的月历由7个垂直列组成(代表每周7天),如图所示。
数据小磨坊
2020/09/10
2.5K0
R-ggTimeSeries | ggplot2: 热力日历图
R-gstat-ggplot2 IDW计算及空间插值可视化绘制
上一篇文章,我们使用了Python 自定义IDW插值函数进行了IDW空间插值及可视化的plotnine、Basemap的绘制方法(Python - IDW插值计算及可视化绘制),本期推文我们将使用R-gstat进行IDW插值计算和使用ggplot2进行可视化绘制,主要涉及的知识点如下:
DataCharm
2021/02/22
3.1K1
R-gstat-ggplot2 IDW计算及空间插值可视化绘制
R可视化之美化山脊图
基因集可视化是很常见的分析内容,山脊图使用较少,原因可能是默认生成的图片不美观。本文提供山脊图的美化后的效果图,供选择。
生信技能树jimmy
2022/03/14
3.7K0
R可视化之美化山脊图
跟着Nature学绘图(7)随心所欲话热图
❝今天在帮朋友做数据分析的时候,由于基因数目比较多聚类后图非常臃肿,突然产生一个想法如何只对图形进行聚类但不显示聚类树,下面通过一个小例子来展示 ❞ 加载R包 主要使用ggdendro中的函数dendro_data来提取聚类标签 library(tidyverse) # install.packages("ggdendro") library(ggdendro) library(aplot) 导入数据 df <- read_tsv("data.xls") %>% column_to_rownam
R语言数据分析指南
2022/09/21
6680
跟着Nature学绘图(7)随心所欲话热图
R中绘制环状聚类热图
R语言数据分析指南
2023/11/16
5660
R中绘制环状聚类热图
R包:ggalign调整和组合多个图形的R包
这个包扩展了ggplot2,提供了用于对齐和组织多个图的高级工具,特别是那些自动重新排序观察结果的工具,比如树形图。它提供了对布局调整和情节注释的精细控制,使您能够创建复杂的、出版质量的可视化,同时仍然使用熟悉的ggplot2语法。
生信学习者
2025/02/25
2750
R包:ggalign调整和组合多个图形的R包
R可视乎 | 散点图系列(2)
散点图(scatter graph、point graph、X-Y plot、scatter chart )是科研绘图中最常见的图表类型之一,通常用于显示和比较数值。散点图是使用一系列的散点在直角坐标系中展示变量的数值分布。在二维散点图中,可以通过观察两个变量的数据变化,发现两者的关系与相关性。
庄闪闪
2021/04/09
1.3K0
推荐阅读
相关推荐
ggplot2绘制多图层相关性热图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档