Multiple-group Chord diagram in R circlize packages

Multiple-group Chord diagram


Generally chordDiagram() function visualizes relations between two groups (i.e. from rows to columns if the input is an adjacency matrix or from column 1 to column 2 if the input is an adjacency list), however, for chordDiagram(), it actually doesn’t need any grouping information. The visual effect of grouping is just enhanced by setting different gap degrees. In this case, it is easy to make a Chord diagram with more than two groups.

First let’s generate four matrix which contain pairwise relations from three groups:


         A1 <- c(316, 556, 367, 378)

A2 <- c(343, 584, 220, 789)
A3 <- c(378, 742, 100, 900)
A4 <- c(673, 673, 540, 50)
mat1 <- rbind(A1,A2,A3,A4)
rownames(mat1) <- c("spring-C", "summer-C", "winter-C", "autumn-C")
colnames(mat1) <- c("spring-B", "summer-B", "winter-B", "autumn-B")

B1 <- c(20, 400, 370, 10)
B2 <- c(897, 56, 29, 100)
B3 <- c(562, 165, 90, 0)
B4 <- c(673, 673, 40, 50)
mat2 <- rbind(B1,B2,B3,B4)
rownames(mat2) <- c("spring-C", "summer-C", "winter-C", "autumn-C")
colnames(mat2) <- c("spring-K", "summer-K", "winter-K", "autumn-K")

C1 <- c(280, 40, 570, 190)
C2 <- c(797, 36, 29, 109)
C3 <- c(162, 565, 10, 90)
C4 <- c(273, 603, 50, 40)
mat3 <- rbind(C1,C2,C3,C4)
rownames(mat3) <- c("spring-B", "summer-B", "winter-B", "autumn-B")
colnames(mat3) <- c("spring-K", "summer-K", "winter-K", "autumn-K")

D1 <- c(18, 200, 30, 810)
D2 <- c(97, 56, 929, 111)
D3 <- c(52, 365, 90, 10)
D4 <- c(66, 173, 30, 90)
mat4 <- rbind(D1,D2,D3,D4)
rownames(mat4) <- c("spring-B", "summer-B", "winter-B", "autumn-B")
colnames(mat4) <- c("spring-S", "summer-S", "winter-S", "autumn-S")


Since chordDiagram() only accepts one single matrix, here the four matrix are merged into one big matrix.


mat = matrix(0, nrow = 8, ncol = 12)
rownames(mat) = c(rownames(mat2), rownames(mat3))
colnames(mat) = c(colnames(mat1), colnames(mat2),colnames(mat4))
mat[rownames(mat1), colnames(mat1)] = mat1
mat[rownames(mat2), colnames(mat2)] = mat2
mat[rownames(mat3), colnames(mat3)] = mat3
mat[rownames(mat4), colnames(mat4)] = mat4
mat

Merged matrix is:



When making the chord diagram, we add an additional track in which we add lines to enhance the visual effect of different groups.

library(circlize)#par(bg = "black")  => set image background color is black#plot circos and create a network:chordDiagram(mat, annotationTrack = c("grid", "axis"), directional = 1, transparency = 0,             preAllocateTracks = list(               track.height = uh(4, "mm"),               track.margin = c(uh(4, "mm"), 0)             ))
#add a text in each sector circos.track(track.index = 2, panel.fun = function(x, y) {  sector.index = get.cell.meta.data("sector.index")  xlim = get.cell.meta.data("xlim")  ylim = get.cell.meta.data("ylim")  circos.text(mean(xlim), mean(ylim), sector.index, col = "white", cex = 0.6, niceFacing = TRUE)})
#add a distic sector in each sectorhighlight.sector(rownames(mat1), track.index = 1, col = "red",                  text = "Chitwan", cex = 0.8, text.col = "white", niceFacing = TRUE)highlight.sector(colnames(mat1), track.index = 1, col = "green",                  text = "Bardia", cex = 0.8, text.col = "white", niceFacing = TRUE)highlight.sector(colnames(mat2), track.index = 1, col = "blue",                  text = "Khaptad", cex = 0.8, text.col = "white", niceFacing = TRUE)highlight.sector(colnames(mat4), track.index = 1, col = "black",                  text = "Suklaphata", cex = 0.8, text.col = "white", niceFacing = TRUE)
circos.clear()

Output plot is:
 Thanks!!

Comments

Popular Posts