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.pswp.cn/diannao/81730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81730.shtml
英文地址,請注明出處:http://en.pswp.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語言理論到單片機實踐應用的高效過渡 。