ggalluvial | 沖擊圖/ 桑基圖繪制
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInVGcq5iYwcTM5ATY4kjYiVzMzkDNlFmM4gDN0U2NzQ2M5cTN08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpeg)
Alluvial_0
❝
小夥伴寫的ggalluvial使用指南。
❞
沖擊圖是一種對能量分流的可視化展示圖,在富集分析中可以用來展示基因在各通路中的富集流向,展示效果類比于弦圖。
ggalluvial
是
ggplot2
包的延伸,其設計和功能最初的靈感來自于
alluvial
,對于
ggalluvial
包使用方法的官方介紹參考Alluvial Plots in ggplot2 • ggalluvial (corybrunson.github.io)
「沖擊圖的基本結構」
- 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")
這些圖的一個重要特征是垂直坐标軸的意義:區塊之間沒有間隔,所有圖像的高度隻是反映了觀測值的累積量。
這種格式和功能應用前景廣泛,并将在未來的版本中保留。但是仍然還涉及一些明顯偏離
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
識别的長格式每個節點包含一行,可以了解為将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")
該格式允許我們沿着同一沖擊層從軸到軸的變化配置設定美學,這對重複測量資料集很有用。這需要為每個流生成單獨的圖形對象,就像在
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")
區塊高度
y
未指定,是以每一行給定機關高度。這個例子展示了處理丢失資料的一種方法。另一種方法是設定參數
na
。丢失的資料處理(具體來說,區塊的順序)也取決于區塊變量是字元變量還是因子/數字變量。
最後,
lode
格式為我們提供了聚合相鄰軸之間的流的選項,當相鄰軸之間的轉換是最重要的時候,這可能是合适的。我們可以通過蘭德美國生命小組(RAND American Life Panel)進行的流感疫苗接種調查資料來證明這一選擇。資料,包括三個調查中每個問題的一個問題,已被彙總的回應檔案:每個“主題”(映射到沖擊層)實際上代表了一個隊列的主題,他們以相同的方式回答所有三個問題,每個隊列的大小(映射到y)被記錄在“頻率”。
這個圖忽略了軸與軸之間的流動之間的連續性。這種“無記憶”區塊産生了一個不那麼混亂的中間區塊,其中最多有一個流從一個軸上的每個區塊 流向下一個軸上的每個區塊,但代價是能夠在整個地塊上跟蹤每個隊列。
示例資料和代碼領取
點贊
、
在看
本文,分享至朋友圈
集贊20個
并
保留30分鐘
,截圖發至微信
mzbj0002
領取。
「木舟筆記2022年度VIP可免費領取」。
木舟筆記2022年度VIP企劃
「權益:」
- 「2022」年度木舟筆記所有推文示例資料及代碼(「在VIP群裡實時更新」)。 data+code
ggalluvial | 沖擊圖/ 桑基圖繪制 - 木舟筆記「科研交流群」。
- 「半價」購買
(免費教程+代碼領取)|跟着Cell學作圖系列合集。跟着Cell學作圖系列合集
「收費:」
「99¥/人」。可添加微信:
mzbj0002
轉賬,或直接在文末打賞。
往期内容
- CNS圖表複現|生信分析|R繪圖 資源分享&讨論群!
- 這圖怎麼畫| 有點複雜的散點圖
- 這圖怎麼畫 | 相關分析棒棒糖圖
- 組學生信| Front Immunol |基于血清蛋白質組早期診斷标志篩選的簡單套路
- (免費教程+代碼領取)|跟着Cell學作圖系列合集
- Q&A | 如何在論文中畫出漂亮的插圖?
- 跟着 Cell 學作圖 | 桑葚圖(ggalluvial)
- R實戰 | Lasso回歸模型建立及變量篩選
- 跟着 NC 學作圖 | 互作網絡圖進階(蛋白+富集通路)(Cytoscape)
- R實戰 | 給聚類加個圈圈(ggunchull)
- R實戰 | NGS資料時間序列分析(maSigPro)
- 跟着 Cell 學作圖 | 韋恩圖(ggVennDiagram)
木舟筆記矩陣