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()