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
Post a Comment