![](/img/trans.png)
[英]Adjust highlight.sector() width and placement - Chord diagram (circlize package) in R
[英]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)
默認情況下,為每個組分配的扇區(餅圖片)大小與鏈接數成正比。
> 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.