簡體   English   中英

用圓圈設置和弦圖的扇形寬度

[英]Set sector width of chord diagram with circlize

我有一個涉及100人的數據集,他們對5種醫療狀況進行了診斷。 條件的任何組合都可以發生,但是我已經設置好條件D的概率取決於條件A,而E取決於B。

set.seed(14)
numpeople <- 100
diagnoses <- data.frame(A=rbinom(100, 1, .15), 
                        B=rbinom(100, 1, .1),
                        C=rbinom(100, 1, .2)
                        )
# Probability of diagnosis for D increases by .4 if patient has A, otherwise .5
diagnoses$D <- sapply(diagnoses$A, function(x) rbinom(1, 1, .4*x+.2))
# Probability of diagnosis for E increases by .3 if patient has B, otherwise rare
diagnoses$E <- sapply(diagnoses$B, function(x) rbinom(1, 1, .7*x+.1))

為了創建一個同時出現的矩陣,其中每個單元格是在行和列中都有兩次診斷的人數,我使用矩陣代數:

diagnoses.dist <- t(as.matrix(diagnoses))%*%as.matrix(diagnoses)
diag(diagnoses.dist) <- 0
diagnoses.dist
> diagnoses.dist
   A B C  D E
A  0 1 1 11 3
B  1 0 0  1 7
C  1 0 0  5 4
D 11 1 5  0 4
E  3 7 4  4 0

然后,我想使用和弦圖來顯示每種診斷的共同診斷的比例。

circos.clear()
circos.par(gap.after=10)
chordDiagram(diagnoses.dist, symmetric=TRUE)

5組和弦圖示例

默認情況下,為每個組分配的扇區(餅圖片)大小與鏈接數成正比。

> colSums(diagnoses.dist) #Number of links related to each diagnosis
 A  B  C  D  E 
16  9 10 21 18 

是否可以設置扇區寬度來說明每次診斷的人數?

> colSums(diagnoses) #Number of people with each diagnosis
 A  B  C  D  E 
16  8 20 29 18 

這個問題似乎與circlize書的14.5節有關,但是我不確定如何對gap.after參數進行數學運算。

基於circlize書的第2.3節 ,我嘗試使用circos.initalize設置扇區大小,但我認為chordDiagram函數會覆蓋此大小,因為外部的比例完全相同。

circos.clear()
circos.par(gap.after=10)
circos.initialize(factors=names(diagnoses), x=colSums(diagnoses)/sum(diagnoses), xlim=c(0,1))
chordDiagram(diagnoses.dist, symmetric=TRUE)

在此處輸入圖片說明

我看到了許多在chordDiagram微調音軌的選項,但對於扇區卻沒有太多選擇。 有辦法嗎?

就您而言,類別中的人數有時可能小於其他類別的同時出現的總數。 例如,類別B總共有9個並發出現,但人數只有8。

如果這不是問題,則可以在矩陣圖上放置一些值,這些值對應於屬於一個類別的人數。 在下面的示例代碼中,我僅向圖中添加隨機數以說明該想法:

diagnoses.dist <- t(as.matrix(diagnoses))%*%as.matrix(diagnoses)
diag(diagnoses.dist) = sample(10, 5)

# since the matrix is symmetric, we set the uppper diagnal to zero.
# we don't use `symmetrix = TRUE` here because the values on the diagonal
# are still used.
diagnoses.dist[upper.tri(diagnoses.dist)] = 0

par(mfrow = c(1, 2))
# here you can remove `self.link = 1` to see the difference
chordDiagram(diagnoses.dist, grid.col = 2:6, self.link = 1)

# If you don't want to see the "mountains"
visible = matrix(TRUE, nrow = nrow(diagnoses.dist), ncol = ncol(diagnoses.dist))
diag(visible) = FALSE
chordDiagram(diagnoses.dist, grid.col = 2:6, self.link = 1, link.visible = visible)

在此處輸入圖片說明

PS: link.visible選項僅在最新版本的circlize中可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM