天天看點

ggalluvial | 沖擊圖/ 桑基圖繪制

ggalluvial | 沖擊圖/ 桑基圖繪制

Alluvial_0

小夥伴寫的ggalluvial使用指南。

沖擊圖是一種對能量分流的可視化展示圖,在富集分析中可以用來展示基因在各通路中的富集流向,展示效果類比于弦圖。

ggalluvial

ggplot2

包的延伸,其設計和功能最初的靈感來自于

alluvial

,對于

ggalluvial

包使用方法的官方介紹參考Alluvial Plots in ggplot2 • ggalluvial (corybrunson.github.io)

ggalluvial | 沖擊圖/ 桑基圖繪制

「沖擊圖的基本結構」

  • x軸是一個次元即反映了能量分流的組數,資料沿着它在固定的水準位置在垂直方向分組。上面的圖中使用了三個分類軸:階級、性别和年齡。
  • 每個軸上的組繪制成不同的層次區塊,稱為「strata」。例如,「Class」軸包含4個層次:1、2、3和Crew。
  • 水準方向的曲線被稱為 「alluvia」(沖擊層),示例圖中沖擊層對應于每個軸變量的固定值,由其在軸上的垂直位置表示,以及由其填充顔色表示的「Survived」變量的固定值。
  • 在相鄰軸線之間的沖擊層是水流。
  • 「alluvia」向右流動并與「strata」相交。圖中可以獲得豐富的資訊,這也就意味着作圖所需的資料格式至關重要。

「Alluvial資料」格式

ggalluvial

可以識别兩種“沖擊資料”格式,在以下各小節中有詳細論述,但它們基本上對應于分類重複測量資料的“寬”和“長”格式。第三種形式是表格(或數組),用于存儲具有多個分類次元的資料,如

泰坦尼克号

UCBAdmissions

的資料集為了與整潔的資料原則和

ggplot2

資料格式保持一緻,

ggalluvial

不接受表格式輸入。

寬格式資料

寬格式資料反映了沖擊圖的可視化排布,每一行對應一組觀測,每個變量取特定值,每個變量有自己的列。另加一列,列上每行的數量,例如隊列中觀測機關的數量,可用于控制地層高度基本上,寬格式由每沖擊層一行組成。我們用包中自帶的資料進行展示。包中自帶的

is_alluvia_form

函數可以檢查輸入的資料是否符合規範。

setwd('F:/MZBJ/Alluvial')
install.packages('ggalluvial')
library(ggalluvial)
head(as.data.frame(UCBAdmissions), n = 12)
    Admit Gender Dept Freq
1  Admitted   Male    A  512
2  Rejected   Male    A  313
3  Admitted Female    A   89
4  Rejected Female    A   19
5  Admitted   Male    B  353
6  Rejected   Male    B  207
7  Admitted Female    B   17
8  Rejected Female    B    8
9  Admitted   Male    C  120
10 Rejected   Male    C  205

is_alluvia_form(as.data.frame(UCBAdmissions), axes = 1:3, silent = TRUE)
           

這種格式繼承自第一版的

ggalluvial

,使用與

alluvial

包相似的方法處理資料,其中

stat_alluvium

stat_stratum

以一緻的方式識别和處理軸變量。

ggplot(as.data.frame(UCBAdmissions),
       aes(y = Freq,
           axis1 = Gender,
           axis2 = Dept)) +
  geom_alluvium(aes(fill = Admit),#建立沖擊層
                width = 1/12) +
  geom_stratum(width = 1/12, #建立區塊
               fill = "black", color = "grey") +
  geom_label(stat = "stratum", #添加區塊标簽
             aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("Gender", "Dept"),
                   expand = c(.05, .05)) +
  scale_fill_brewer(type = "qual", 
                    palette = "Set1") +
  ggtitle("UC Berkeley admissions and rejections, by sex and department")
           
ggalluvial | 沖擊圖/ 桑基圖繪制

這些圖的一個重要特征是垂直坐标軸的意義:區塊之間沒有間隔,所有圖像的高度隻是反映了觀測值的累積量。

這種格式和功能應用前景廣泛,并将在未來的版本中保留。但是仍然還涉及一些明顯偏離

ggplot2

規範的情況:

[0-9]*

位置映射是非标準的:它們不是一組顯式參數,而是基于正規表達式模式的一系列參數。

Stat_alluvium

忽略組美學的任何參數;相反,

StatAlluvium$compute_panel

使用group來連結對應于同一沖擊層的内部轉換資料集的行。

stat_stratum

産生的區塊在執行統計轉換之前不可用,必須使用

after_stat()

恢複。

必須手動糾正水準軸(使用

scale_x_discrete

scale_x_continuous

),以反映辨別軸的分類變量。

此外,對于每個沖擊層來說,對于每一個沖擊層

fill

必須是固定的,例如,它們不能根據每個軸的值從一個軸改變到另一個軸。這意味着,盡管它們可以再現平行集的分支樹結構,但這種格式和功能不能自然地産生帶有配色方案的沖擊圖,比如這裡的那些(“Controlling colors”),它們在每個軸上都被“重置”

ggplot(as.data.frame(HairEyeColor),
       aes(y = Freq,
           axis1 = Hair,
           axis2 = Eye,
           axis3 = Sex)) +
  geom_alluvium(aes(fill = Eye),
                width = 1/8,
                knot.pos = 0, 
                reverse = FALSE) +
  scale_fill_manual(values = c(Brown = "#70493D", 
                               Hazel = "#E2AC76",
                               Green = "#3F752B", 
                               Blue = "#81B0E4")) +
  guides(fill = FALSE) +
  geom_stratum(alpha = .25, 
               width = 1/8, 
               reverse = FALSE) +
  geom_text(stat = "stratum", 
            aes(label = after_stat(stratum)),
            reverse = FALSE) +
  scale_x_continuous(breaks = 1:3, 
                     labels = c("Hair", "Eye", "Sex")) +
  coord_flip() +
  ggtitle("Eye colors of 592 subjects, by sex and hair color")
#這一警告是由于“Hair”和“Eye”坐标軸同時具有“Brown”。
           
ggalluvial | 沖擊圖/ 桑基圖繪制

長格式資料

ggalluvial

識别的長格式每個節點包含一行,可以了解為将dplyr格式的資料集的軸列

gather

或将 excel 格式的資料集的軸列

pivoting

到一個鍵-值對的列中,将軸編碼為鍵,區塊編碼為值。這種格式需要一個額外的索引列,将對應于一個共同隊列的行連接配接起來

UCB_lodes <- to_lodes_form(as.data.frame(UCBAdmissions),
                           axes = 1:3,
                           id = "Cohort")
head(UCB_lodes, n = 12)
   Freq Cohort     x  stratum
1   512      1 Admit Admitted
2   313      2 Admit Rejected
3    89      3 Admit Admitted
4    19      4 Admit Rejected
5   353      5 Admit Admitted
6   207      6 Admit Rejected
7    17      7 Admit Admitted
8     8      8 Admit Rejected
9   120      9 Admit Admitted
10  205     10 Admit Rejected
11  202     11 Admit Admitted
12  391     12 Admit Rejected
           

在寬(「alluvia」)和長(「lodes」)格式之間轉換資料的函數包括幾個有助于儲存輔助資訊的參數。參見幫助("alluvial-data")擷取示例。

相同的「stat」和「geom」可以使用不同的位置美學來接收這種格式的資料,同樣也适用于碎石積層:

x

:“鍵”變量,表示行對應的軸,将沿水準軸排列;

stratum

,由軸變量x所表示的“值”;

alluvium

,将單個沖擊層的各行連接配接起來的索引方案。

高度可以從軸到軸變化,允許使用者生成像這裡展示的凹凸圖,在這些情況下,「strata」所包含的資訊并不比沖擊層多,而且常常沒有繪制出來。為了友善起見,

stat_alluvium

stat_flow

将接受

x

和「alluvium」的參數,即使對「stratum」沒有給出參數例如,我們可以按地區對難民資料集中的國家進行分組,以便比較不同規模的難民數量:

install.packages('alluvial')
data(Refugees, package = "alluvial")
country_regions <- c(
  Afghanistan = "Middle East",
  Burundi = "Central Africa",
  `Congo DRC` = "Central Africa",
  Iraq = "Middle East",
  Myanmar = "Southeast Asia",
  Palestine = "Middle East",
  Somalia = "Horn of Africa",
  Sudan = "Central Africa",
  Syria = "Middle East",
  Vietnam = "Southeast Asia"
)
Refugees$region <- country_regions[Refugees$country]
ggplot(data = Refugees,
       aes(x = year, y = refugees, alluvium = country)) +
  geom_alluvium(aes(fill = country, colour = country),
                alpha = .75, decreasing = FALSE) +
  scale_x_continuous(breaks = seq(2003, 2013, 2)) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = -30, hjust = 0)) +
  scale_fill_brewer(type = "qual", palette = "Set3") +
  scale_color_brewer(type = "qual", palette = "Set3") +
  facet_wrap(~ region, scales = "fixed") +
  ggtitle("refugee volume by country and region of origin")
           
ggalluvial | 沖擊圖/ 桑基圖繪制

該格式允許我們沿着同一沖擊層從軸到軸的變化配置設定美學,這對重複測量資料集很有用。這需要為每個流生成單獨的圖形對象,就像在

geom_flow

中實作的那樣。下面的情節使用了一組(更改)學生在幾個學期的課程的學術課程。由于

geom_flow

預設調用

stat_flow

(見下一個例子),我們用

stat_alluvium

覆寫它,以便跟蹤所有學期的每個學生:

data(majors)
majors$curriculum <- as.factor(majors$curriculum)
ggplot(majors,
       aes(x = semester, 
           stratum = curriculum,
           alluvium = student,
           fill = curriculum, 
           label = curriculum)) +
  scale_fill_brewer(type = "qual",
                    palette = "Set2") +
  geom_flow(stat = "alluvium", 
            lode.guidance = "frontback",
            color = "darkgray") +
  geom_stratum() +
  theme(legend.position = "bottom") +
  ggtitle("student curricula across several semesters")
           
ggalluvial | 沖擊圖/ 桑基圖繪制

區塊高度

y

未指定,是以每一行給定機關高度。這個例子展示了處理丢失資料的一種方法。另一種方法是設定參數

na

。丢失的資料處理(具體來說,區塊的順序)也取決于區塊變量是字元變量還是因子/數字變量。

最後,

lode

格式為我們提供了聚合相鄰軸之間的流的選項,當相鄰軸之間的轉換是最重要的時候,這可能是合适的。我們可以通過蘭德美國生命小組(RAND American Life Panel)進行的流感疫苗接種調查資料來證明這一選擇。資料,包括三個調查中每個問題的一個問題,已被彙總的回應檔案:每個“主題”(映射到沖擊層)實際上代表了一個隊列的主題,他們以相同的方式回答所有三個問題,每個隊列的大小(映射到y)被記錄在“頻率”。

ggalluvial | 沖擊圖/ 桑基圖繪制

這個圖忽略了軸與軸之間的流動之間的連續性。這種“無記憶”區塊産生了一個不那麼混亂的中間區塊,其中最多有一個流從一個軸上的每個區塊 流向下一個軸上的每個區塊,但代價是能夠在整個地塊上跟蹤每個隊列。

示例資料和代碼領取

點贊

在看

本文,分享至朋友圈

集贊20個

保留30分鐘

,截圖發至微信

mzbj0002

領取。

「木舟筆記2022年度VIP可免費領取」。

木舟筆記2022年度VIP企劃

「權益:」

  1. 「2022」年度木舟筆記所有推文示例資料及代碼(「在VIP群裡實時更新」)。
    ggalluvial | 沖擊圖/ 桑基圖繪制
    data+code
  2. 木舟筆記「科研交流群」。
  3. 「半價」購買

    跟着Cell學作圖系列合集

    (免費教程+代碼領取)|跟着Cell學作圖系列合集。

「收費:」

「99¥/人」。可添加微信:

mzbj0002

轉賬,或直接在文末打賞。

ggalluvial | 沖擊圖/ 桑基圖繪制

往期内容

  1. CNS圖表複現|生信分析|R繪圖 資源分享&讨論群!
  2. 這圖怎麼畫| 有點複雜的散點圖
  3. 這圖怎麼畫 | 相關分析棒棒糖圖
  4. 組學生信| Front Immunol |基于血清蛋白質組早期診斷标志篩選的簡單套路
  5. (免費教程+代碼領取)|跟着Cell學作圖系列合集
  6. Q&A | 如何在論文中畫出漂亮的插圖?
  7. 跟着 Cell 學作圖 | 桑葚圖(ggalluvial)
  8. R實戰 | Lasso回歸模型建立及變量篩選
  9. 跟着 NC 學作圖 | 互作網絡圖進階(蛋白+富集通路)(Cytoscape)
  10. R實戰 | 給聚類加個圈圈(ggunchull)
  11. R實戰 | NGS資料時間序列分析(maSigPro)
  12. 跟着 Cell 學作圖 | 韋恩圖(ggVennDiagram)
ggalluvial | 沖擊圖/ 桑基圖繪制

木舟筆記矩陣