library(circlize)
## ========================================
## circlize version 0.4.6
## CRAN page: https://cran.r-project.org/package=circlize
## Github page: https://github.com/jokergoo/circlize
## Documentation: http://jokergoo.github.io/circlize_book/book/
##
## If you use it in published research, please cite:
## Gu, Z. circlize implements and enhances circular visualization
## in R. Bioinformatics 2014.
## ========================================
set.seed(999)
#matrix type
mat<-matrix(sample(18,18),3,6)
rownames(mat)<-paste0("S",1:3)
colnames(mat)<-paste0("E",1:6)
mat2<-matrix(sample(100,35),nrow=5) #有自我連接的弦
rownames(mat2)<-letters[1:5]
colnames(mat2)<-letters[1:7]
#調整參數:circos.par()
#調整起始位置(start.degree)、方向(clock.wise):
circos.par(start.degree=90,clock.wise=FALSE)
#調整間隙(gap.after(row間隙,row&col間隙,col間隙,col&row間隙)):
circos.par(gap.after=c(rep(5,nrow(mat)-1), #row間隙
15, #row&col間隙
rep(5,ncol(mat)-1), #col間隙
15)) #col&row間隙
#調整參數:chordDiagram()
#調整sector順序(order)
chordDiagram(mat,order=c("S1","E1","E2","S2","E3","E4","S3","E5" ,"E6"))

#顏色調整:
#外圍SECTOR顏色調整(grid.col())
grid_col<-c("S1"="red","S2"="green","S3"="blue","E1"="grey","E2"="grey","E3"="grey","E4"="grey","E5"="grey","E6"="grey")
chordDiagram(mat,grid.col=grid_col)

#連接弦
#顏色調整(col):
#指定顏色矩陣
#非連續變量:
#隨機顏色矩陣rand_color()
col_mat<-rand_color(length(mat),transparency = 0.7)
dim(col_mat)<-dim(mat) #確保col_mat是一個矩陣
chordDiagram(mat,col=col_mat)

#使用row.col或column.col指定顏色向量-僅提供與行名或列名長度相同的顏色向量,顏色向量可以用顏色名稱、hex色值甚至數字表示
chordDiagram(mat,row.col=6:9)

chordDiagram(mat,column.col=7:12)

#連續變量:
#連續顏色向量colorRamp2(breaks,colors,transparency,space="LAB"),space表示色彩空間
col_fun<-colorRamp2(range(mat),c("#FFEEEE","#FF0000"))
chordDiagram(mat,col=col_fun)

#透明度調整(transparency)
#連接弦邊線(矩陣型資料以下3個參數均可用長度為1的向量指定)
#線寬link.lwd
#線型link.lty
#線色link.border
#以長度1的向量指定
chordDiagram(mat,link.lwd=2,link.lty=2,link.border="blue")

#以矩陣指定
lwd_mat<-matrix(1,nrow(mat),ncol(mat))#與mat維度相同,元素為1
lwd_mat[mat>12]<-2#relation>12,則加寬邊線
border_mat<-matrix(NA,nrow(mat),ncol(mat))#與mat維度相同,元素為NA
border_mat[mat>12]<-"red" #relation>12,則紅線邊線
chordDiagram(mat,link.lwd=lwd_mat,link.border = border_mat)

#參數矩陣維度與資料原不同時,必須按名稱匹配
border_mat2<-matrix("black",nrow=1,ncol(mat))
rownames(border_mat2)<-rownames(mat)[2]
colnames(border_mat2)<-colnames(mat)
chordDiagram(mat,link.border = border_mat2)

#參數矩陣可以設置為特殊的3行格式,前2行分別對應數據源的列和行名稱,第3行則為參數,相當於list type的參數矩陣
lty_df<-data.frame(c("S1","S2","S3"),c("E4","E5","E6"),c(1,2,3))
lwd_df<-data.frame(c("S1","S2","S3"),c("E4","E5","E6"),c(2,2,2))
border_df<-data.frame(c("S1","S2","S3"),c("E4","E5","E6"),c(1,1,1))
chordDiagram(mat,link.lwd=lwd_df,link.lty=lty_df,link.border =border_df)

#連接弦強調方式
#弦邊緣顏色(如高亮顯示)
chordDiagram(mat,row.col=c("#00FF0010","#FF000080","#0000FF10"))

#不同透明度,指定透明色給範圍之外的連接弦
col_mat[mat<12]<-"#00000000"
chordDiagram(mat,col=col_mat) #mat值<12為透明色

#透過函數指定透明度和高亮色,此方法亦適用list_type
col_fun<-function(x){ifelse(x<12,"#00000000","#ff000080")}
chordDiagram(mat,col=col_fun)

#利用指定色時,缺失顏色不會繪出功能凸顯
col_df<-data.frame(c("S1","S2","S3"),
c("E5","E6","E4"),
c("#FF000080","#00FF0080","#0000FF80"))
chordDiagram(mat,col=col_df)

#連接弦順序調整
#相同SECTOR,按連接弦大小順序調整link.sort=TRUE,link.decreasing=TRUE
chordDiagram(mat,link.sort=TRUE,link.decreasing=TRUE)

#調整連接弦上下源加順序link.rank
chordDiagram(mat,transparency = 0,link.rank=rank(mat))#將矩陣的秩指定給link.rank

#連接弦方向顯示directional
#縮排
par(mfrow=c(1,3))
chordDiagram(mat,directional=1) #預設起始端為縮排
chordDiagram(mat,directional=1,diffHeight=uh(5,"mm"))#uh:傳遞單位,設定縮短量為5mm,-uh為結束端縮排
chordDiagram(mat,directional=-1)#反轉方向

#增加箭頭:
#direction.type="arrows"中心線上增加帶箭頭的曲線
#link.arr.col指定箭頭顏色
#link.arr.lenght指定箭頭長度
#link.arr.type指定箭頭類型,當link.arr.type="big.arrow"箭頭與箭杆合二為一
arr_col<-data.frame(c("S1","S2","S3"),c("E5","E6","E3"),c("red","red","red"))#生成箭頭的顏色3列dataframe
chordDiagram(mat,directional=1,link.arr.col=arr_col,direction.type = "arrows",link.arr.length = 0.2)
#同時設置箭頭和縮排
chordDiagram(mat,directional=1,link.arr.col=arr_col,direction.type = c("diffHeight","arrows"),link.arr.length = 0.2)
#大箭頭+縮排
chordDiagram(mat,directional=1,direction.type=c("diffHeight","arrows"),link.arr.type="big.arrow",diffHeight = uh(2,"mm"))

#不顯示自我連接的弦(更改數據源對應的值,使之為0)
circos.clear()
mat3<-mat2
for(cn in intersect(rownames(mat3),colnames(mat3))){
mat3[cn,cn]<-0#將列名與行名相同的值改為0
}
chordDiagram(mat3,directional=1,row.col=1:5)
#連接弦寬度下限reduce(0~1,表示佔有所有弦寬度之和的百分比)
chordDiagram(mat,reduce=0.1)
#圖樣調整:
#annotaionTrack=c("name","grid","axis")可指定任一值或多選值
#annotationTrackHeight指定軌道環高,以數字向量指定,長度與annotationTrack一致
chordDiagram(mat,annotationTrack = "grid")#不顯示標籤及刻度

chordDiagram(mat,
annotationTrack = c("name","grid"),
annotationTrackHeight = c(0.05,0.1))#0.05為標籤與圖的距離,0.1 SECTOR的厚度
circos.clear()#結束繪圖,否則將繼續疊加
#list type
df<-data.frame(from=rep(rownames(mat),times=ncol(mat)),
to=rep(colnames(mat),each=nrow(mat)),
value=as.vector(mat),
stringsAsFactors = FALSE)
#調整間隙(gap.after(1st col元素之間間隙,1st col & 2nd col間隙,2nd col元素之間間隙,2nd col & 1st col間隙))
circos.par(gap.after=c(rep(5,length(unique(df$from))-1),
15,
rep(5,length(unique(df[[2]]))-1),
15))
#調整參數:chordDiagram()
#透明度調整(transparency)
#顏色調整:
#外圍SECTOR顏色調整(grid.col())
#連接弦顏色調整(col):
#指定顏色向量
#非連續變量:
#隨機顏色矩陣rand_color()
cols<-rand_color(nrow(df),transparency = 0.7)
chordDiagram(df,col=cols)
#連接弦邊線
#線寬link.lwd
#線型link.lty
#線色link.border
#當數據為list_type,指定上述三項時,只需指定與數據一樣列數的向量
chordDiagram(df,
link.lty=sample(1:3,nrow(df),replace=TRUE),
link.lwd=runif(nrow(df))*2,
link.border=sample(0:3,nrow(df),replace=TRUE)
)

#連接弦高亮色強調
#只需設置要高亮的顏色,其它為透明色就行了
cols<-rand_color(nrow(df))
cols[df[[3]]<10]<-"#00000000"
chordDiagram(df,col=cols)
#透過link.visible調整
chordDiagram(df,link.visible=df[[3]]>=10)
#連接弦順序調整
#相同SECTOR,按連接弦大小順序調整link.sort=TRUE,link.decreasing=TRUE
chordDiagram(df,link.sort=TRUE,link.decreasing=TRUE)

#調整連接弦上下源加順序link.rank
chordDiagram(mat,transparency = 0,link.rank=rank(df[[3]]))#將矩陣的秩指定給link.rank
circos.clear()
