Circular Plot系列(一): 环形热图绘制

针对近期多个粉丝咨询环形图的绘制,我意识到,我们似乎没有真正介绍过circle图,但这一类图确是非常常用的图,所以这里详细学习一下circle的绘制,使用的是circlize包,功能很完善:安装包,


#https://github.com/jokergoo/circlize/tree/master
#install package
install.packages("circlize")
#devtools::install_github("jokergoo/circlize")
library(circlize)

做环形热图使用circos.heatmap函数,我们看看具体的参数解析:

#了解下环形热图绘制circos.heatmap基本参数。
circos.heatmap(mat, #矩阵或者向量,矩阵就是和我们做hetamap的时候提供的一样,例如行是基因,列是分组sample,向量的化会自动转化为一个单列矩阵,说到底还是矩阵,适合于plot单组数值split = NULL, #环线热图分列,例如我们可以设置分组,让热图分为多个扇形col, #热图颜色设置,参照colorRamp2,设置颜色和范围,例如一般设置:colorRamp2(c(-2, 0, 2), c("blue", "white", "red"))cell.border = NA, #r热图格子边框颜色,默认NA不设置cell.lwd = 1,#边框线条宽度bg.border = NA, #cell.border设置的是每个单元格的边框,bg.border设置的是整个热图外边框颜色bg.lty = par("lty"),#整个热图边框线条类型,可以直接设置数字,例如1,2,3等等,选择是实线还是虚线类型的线条bg.lwd = par("lwd"),#整个热图边框线条宽度,可直接设置数值cluster = TRUE, #热图行是否聚类。该值也可以是一个dendprogram /hclust对象或其他可以用as. dendprogram转换为的对象。也就是所已经做好聚类的objectclustering.method = "complete", #聚类方法,参照hclust函数,可选"ward.D", "ward.D2", "single", "complete", "average" (= UPGMA), "mcquitty" (= WPGMA), "median" (= WPGMC) or "centroid" (= UPGMC).distance.method = "euclidean",#参照dist函数,method可选"euclidean", "maximum", "manhattan", "canberra", "binary" or "minkowski". # dend.callback = function(dend, m, si) reorder(dend, rowMeans(m)),dend.side = c("none", "outside", "inside"), #聚类树位置,默认不展示。可选择外圈或者内圈放置dend.track.height = 0.1,#聚类树高度rownames.side = c("none", "outside", "inside"), #行名位置,默认不展示。可选择外圈或者内圈放置rownames.cex = 0.5,#行名文字大小rownames.font = par("font"), #行名字体rownames.col = "black",#行名颜色cell_width = rep(1, nrow(mat)),#热图单元格宽度

准备作图数据,这里我们使用转录组基因表达矩阵演示:


#prepare data
#这是一个转录组基因表达矩阵,也是我们常做pheatmap的输入矩阵
#行是基因,列是分组,有两个分组,HC,TL,分别有6个重复
df <- read.csv('./df_heat.csv', header = T, row.names = 1)
plot_df <- as.matrix(df)
#因为circos.heatmap没有像pheatmap那样,直接参数里面对数据进行scale
#所以我们plot之前需要对表达数据进行标准化,如果仅仅是想展示数值,那么数据并不用标准化
plot_df <- t(scale(t(plot_df)))#对数据进行标准化处理,按行z-score标准化

基础plot:布局也是绘图关键哦,了解下布局一些参数,可以调整:不可死板。

circos.par(start.degree,#数值,设置环形图的起始角度。0是其实,位于3点钟方向,数值增大,开口逆时针移动gap.degree,#数值或数值向量,设置扇区之间的间隔角度.单个数值设置表示多个扇区之间距离一致。向量可设置不一样间隔gap.after, #设置圆环开口的大小,数值越大,开口越大track.margin,#数值向量,设置轨道的上下边距cell.padding,#设置单元格的内边距,扇形内格子之间的距离,一般设置为0track.height,#设置轨道的高度,也就是圆环的宽度,默认0.2clock.wise,#设置环形方向是否为顺时针,默认Tlabels.cex,#设置文字大小labels.font,#设置文字字体,1=普通,2=粗体,3=斜体,4=粗斜体)unit.circle.segments,#设置绘制圆时的线段数量(影响圆形的平滑度),默认500big.gap,#设置两个环形图之间的间隔角度(用于多环形图)circle.margin,#环形图布局,图形距离四边的距离,数值向量设置。..., RESET = FALSE, READ.ONLY = NULL, LOCAL = FALSE, ADD = FALSE)

#布局设置
circos.clear()
circos.par(start.degree=30, gap.degree=30,track.height=0.3)circos.heatmap(plot_df,col = colorRamp2(c(-2,0,2),c("#003399","white","#cccc00")), cell.border = NA, cell.lwd = 1,bg.border = 'black', bg.lty = par("lty"),bg.lwd = par("lwd"),cluster = TRUE, clustering.method = "ward.D2", distance.method = "euclidean",dend.side = c("inside"), dend.track.height = 0.1,rownames.side = c("outside"),rownames.cex = 0.5,#行名文字大小rownames.font = par("font"), #行名字体rownames.col = "black")

image.png

基础图形出来了,感觉把平常的热图给掰弯了,现在还缺少legend和sample名:添加是比较麻烦的,需要为整个轨道创建绘图区域,使用函数circos.track():添加文字使用circos.text,列名的位置需要根据自己的实际数据,调整x,y轴的坐标慢慢实现,如果感觉调整费时间,可以导出手动修饰,这也是circlize的一个不方便之处。


circos.track(track.index = get.current.track.index(),  # 指定当前轨道的索引panel.fun = function(x, y) {            #panel.fun,自定义绘制函数,用于在轨道中添加图形或注释if (CELL_META$sector.numeric.index == 1) {  # 仅在第一个扇区执行cn = colnames(plot_df)  # 获取数据框的列名n = length(cn)          # 列名的数量#添加文字注释,参数需要设置文字位置xy坐标circos.text(x = CELL_META$cell.xlim[2] + convert_x(0.8, "mm"),#x坐标y = CELL_META$cell.ylim[2] + 4.5 * (1:n),  # y 坐标,labels = rev(cn),       # 文本内容(列名),这里需要注意,rev一下,保证标注正确cex = 0.4,         # 字体大小facing = "inside"  # 文本方向(朝内))}},bg.border = NA  # 轨道背景无边框
)

image.png

然而,我们前面也介绍了,circos.heatmap有一个参数,split,热图可以按照行的分组split,这里演示split以及添加分组注释。其他和之前一致。我的数据并没有分组,这里随机设置的,没有任何意义。将基因按照功能进行了分组。

annotation_row=data.frame(Pathway=c(rep("Wnt",20),rep("Inflammatory",32),rep("HIF",34)))#对行进行注释,用于后续的热图分裂
row.names(annotation_row) <- rownames(df)
annotation_row <- as.matrix(annotation_row)#在circlize函数中,需要为matrix#plot,画图和之前一样,需要注意的是布局设置的gap.degree
#这里我们有三组,也就是split时出现三组扇区,前面两个扇区的gap设置小点
#最后一个设置大一点,便于添加列名
circos.clear()
circos.par(start.degree=30, gap.degree=c(2,2,30),track.height=0.3)
circos.heatmap(plot_df,split = annotation_row,col = colorRamp2(c(-2,0,2),c("#003399","white","#cccc00")), cell.border = NA, cell.lwd = 1,bg.border = 'black', bg.lty = par("lty"),bg.lwd = par("lwd"),cluster = TRUE, clustering.method = "ward.D2", distance.method = "euclidean",dend.side = c("inside"), dend.track.height = 0.05,rownames.side = c("outside"),rownames.cex = 0.5,#行名文字大小rownames.font = par("font"), #行名字体rownames.col = "black",dend.callback=function(dend,m,si){color_branches(dend,k=5,col=c("#E69253", "#EDB931", "#E4502E", "#4378A0", "#272A2A"))})#还可以对层次聚类添加颜色,按照聚类数#
circos.track(track.index = get.current.track.index(),  # 指定当前轨道的索引panel.fun = function(x, y) {            #panel.fun,自定义绘制函数,用于在轨道中添加图形或注释if (CELL_META$sector.numeric.index == 3) {  # 仅在第一个扇区执行cn = colnames(plot_df)  # 获取数据框的列名n = length(cn)          # 列名的数量#添加文字注释,参数需要设置文字位置xy坐标circos.text(#这里我们将列名绘制在环形的尾部,我们前面参数里面解释了,环形是默认顺时针绘制的x = CELL_META$cell.xlim[2] + convert_x(0.8, "mm"),#前面的部分是获取行的长度,也就是绘制文字的x坐标,后面convert_x是调整参数,0.5表示文本向右偏移0.5y = CELL_META$cell.ylim[2] + 12 * (1:n),  # y 坐标,labels = rev(cn),       # 文本内容(列名),这里需要注意,rev一下,保证标注正确cex = 0.4,         # 字体大小facing = "inside"  # 文本方向(朝内))}},bg.border = NA  # 轨道背景无边框
)#添加分组设置,我们直接接上一个图层plot,这里没有设置track.index,所以注释在内圈
circos.track(ylim=c(0,1),track.height=0.081,#分组注释环形高度,可以设置低一点bg.col=c("#FF0000", "#00A08A", "#F2AD00"),#分组注释背景颜色panel.fun=function(x, y) {xlim = get.cell.meta.data("xlim")ylim = get.cell.meta.data("ylim")sector.index = CELL_META$sector.indexcircos.text(mean(xlim),mean(ylim),sector.index, col = "black", cex = 0.8, facing = 'bending.inside', niceFacing = TRUE)})

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据挖掘】时间序列预测-时间序列预测策略

时间序列预测策略 &#xff08;1&#xff09;单步预测与多步预测&#xff08;2&#xff09;直接多步预测&#xff08;3&#xff09;递归多步预测&#xff08;4&#xff09;直接递归的混合预测&#xff08;5&#xff09;多输入多输出预测 &#xff08;1&#xff09;单步预测与多…

【LLM】deepseek R1之GRPO训练笔记(持续更新)

note 相关框架对比&#xff1a; 需微调模型且资源有限 → Unsloth&#xff1b;本地隐私优先的小规模推理 → Ollama&#xff1b;复杂逻辑或多模态任务 → SGLang&#xff1b;高并发生产环境 → vLLM 微调SFT和GRPO是确实能学到新知识的四种格式&#xff08;messages、sharegpt…

【数据结构】--- 单链表的增删查改

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言 概念&#xff1a; 单链表的结构 我们设定一个哨兵位头节点给链…

【JAVA】数据类型与变量:深入理解栈内存分配(4)

核心知识点详细解释 Java 的基本数据类型和引用数据类型 基本数据类型 Java 有 8 种基本数据类型&#xff0c;它们可以分为 4 类&#xff1a; 整数类型&#xff1a;byte&#xff08;1 字节&#xff09;、short&#xff08;2 字节&#xff09;、int&#xff08;4 字节&#…

ReentrantLock实现公平锁和非公平锁

在 Java 里&#xff0c;公平锁和非公平锁是多线程编程中用于同步的两种锁机制&#xff0c;它们的主要差异在于获取锁的顺序规则。下面是对二者的详细介绍&#xff1a; 公平锁 公平锁遵循 “先来先服务” 原则&#xff0c;也就是线程获取锁的顺序和请求锁的顺序一致。先请求锁…

一篇撸清 Http,SSE 与 WebSocket

HTTP,SSE 和WebSocket都是网络传输的协议,本篇快速介绍三者的概念和比较。 SSE(Server-Sent Events) 是什么? SSE(Server-Sent Events),服务器发送事件, 是一种基于 HTTP 的轻量级协议,允许服务器主动向客户端(如浏览器)推送实时数据。它设计用于单向通信(服务器到…

5个重要的财务指标讲解

1&#xff09;净资产收益率 2&#xff09;销售净利率 3&#xff09; 销售毛利率 4&#xff09;销售成本率 5&#xff09; 期间费用率 好的&#xff0c;我将通过一个假设的案例&#xff08;某公司2023年数据&#xff09;逐步解释这些财务指标&#xff0c;并用具体数字演示计算…

PISI:眼图1:眼图相关基本概念

0 英文缩写 TIE&#xff08;Time Interval Error&#xff09;时间间隔误差&#xff0c;UI&#xff08;Unit Interval&#xff09;单位间隔PDF&#xff08;Probability Density Function&#xff09;概率密度函数BER&#xff08;Bit Error Rate&#xff09;误码率TJ&#xff08…

前端八股 CSS 2 选择器

选择器功能&#xff1a;选中特定 DOM节点进行渲染 原始方法 getElementById() getElementByName() 现在方法选择器 分类&#xff1a; id选择器 类选择器 标签选择器 逻辑与选择器 其他类型选择器&#xff1a; 伪类选择器&#xff1a; :link&#xff1a;未被访问的链接…

算法竞赛进阶指南.闇の連鎖

目录 题目算法标签: 树上差分, L C A LCA LCA, 倍增思路代码 题目 352. 闇の連鎖 算法标签: 树上差分, L C A LCA LCA, 倍增 思路 对于一个无向图, 第一次切断树边, 第二次切非树边, 一共多少种方案使得图不连通, 点数和边数都很大, 时间复杂度不能是 O ( n 2 ) O(n ^ 2…

ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(二)

ActiveMQ、Kafka 和 RocketMQ 详细对比 性能对比 在性能方面&#xff0c;Kafka 和 RocketMQ 通常在高吞吐量场景下表现出色&#xff0c;而 ActiveMQ 则相对较弱。根据相关测试数据表明&#xff0c;Kafka 在处理大规模日志数据时&#xff0c;单机吞吐量可以达到每秒数十万条甚…

Electron 从零开始:构建你的第一个桌面应用

&#x1f5a5;️ Electron 从零开始&#xff1a;构建你的第一个桌面应用 Electron 是一个可以使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用的框架。它将 Chromium 和 Node.js 融合到一个环境中&#xff0c;使 Web 开发者也能轻松开发原生桌面应用。 &#x1f680; 什么是 …

相向双指针-16. 最接近的三数之和

16. 最接近的三数之和 题目描述思路讲解代码展示复杂度分析相关标签 题目描述 思路讲解 思路和 15. 三数之和 类似&#xff0c;排序后&#xff0c;枚举 nums[i] 作为第一个数&#xff0c;那么问题变成找到另外两个数&#xff0c;使得这三个数的和与 target 最接近&#xff0c;…

C 语 言 - - - 文 件 操 作

C 语 言 - - - 文 件 操 作 文 件文 件 名文 件 操 作fopenfclose 文 件 的 顺 序 读 写fputcfgetcfputsfgetsfprintffscanffwritefread 流文 件 的 随 机 读 写fseekftellrewind 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你…

Walrus 与 Pudgy Penguins 达成合作,为 Web3 头部 IP 引入去中心化存储

以将深受喜爱的数字藏品赋予生命而闻名的 IP 与品牌开发公司 Pudgy Penguins&#xff0c;现已集成 Walrus&#xff0c;用于存储和管理其日益增长的数字媒体资源库&#xff0c;包括在其产品和社区体验中使用的贴纸和 GIF。团队将率先通过 Tusky&#xff08;Walrus 的用户友好型文…

2019ICPC陕西省赛暨陕西邀请赛题解 BCDEF HIJKL

共111支队伍&#xff0c;获奖情况&#xff08;大概&#xff09; 铜牌66 —— 3 296 银牌33 —— 4 391 金牌 11 —— 6 808 题目难度&#xff08;过题&#xff09;L F E B C I J D K H Problem - L - Codeforces 思路&#xff1a;注意到答案是连乘&#xff0c;只要有0…

5块钱的无忧套餐卡可以变成流量卡吗

电信的 5 块钱无忧套餐卡理论上可以变成流量卡&#xff0c;但会受到一些条件限制&#xff0c;以下是具体介绍&#xff1a; 中国电信无忧卡简介 中国电信无忧卡是电信推出的低月租套餐&#xff0c;月租仅 5 元&#xff0c;包含 200M 国内流量、来电显示和 189 邮箱&#xff0c;全…

SpringBoot校园失物招领平台源码开发实现

概述 实用的​​SpringBoot校园失物招领平台​​完整项目源码&#xff0c;帮助开发者快速构建校园失物招领系统。该项目采用SpringBootVue前后端分离架构&#xff0c;包含完整的注册登录、信息发布、认领管理等模块&#xff0c;是学习企业级项目开发的优秀范例 主要内容 1. …

如何在纯C中实现类、继承和多态(小白友好版)

基本实现原理 /* 通过结构体函数指针模拟类 */ typedef struct {// 成员变量int x; // 成员方法&#xff08;函数指针&#xff09; void (*print)(void* self); } MyClass;/* 成员函数实现 */ void my_print(void* self) {MyClass* obj (MyClass*)self;p…

51单片机入门教程——每个音符对应的重装载值

前言 本教程基于B站江协科技课程进行个人学习整理&#xff0c;专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题&#xff0c;也助力新手快速掌握51单片机核心知识&#xff0c;实现从C语言理论到单片机实践应用的高效过渡 。