Code:
library(circlize)
library(vegan) # for reorder.hclust (may be masked by the package seriation)
library(dendextend) # for color_branches
f="uralaltaic.i"
kvals=c(3,7)
columnorder=list(c(3,2,1),c(1,5,4,3,6,7,2))
mats=sapply(kvals,function(x)read.table(paste0(f,".",x,"a"),r=1)[,columnorder[lapply(columnorder,length)==x][[1]]])
joined=do.call(cbind,sapply(Sys.glob(paste0(f,".[0-9]a")),function(x)read.table(x,r=1)))
dist=as.data.frame(as.matrix(dist(joined)))
hc=hclust(dist(joined))
hc=reorder(hc,dist[,"Nganasan"]-dist[,"Estonian"])
# hc=reorder(hc,mats[[1]][,3]-mats[[1]][,1])
# maxdist=which(dist==max(dist))[1];hc=reorder(hc,dist[,maxdist%%nrow(dist)]-dist[,maxdist%/%nrow(dist)+1])
labelcolor=hcl(c(260,120,60,0,220,160,310,90)+15,60,70)
barcolor=list(hcl(c(220,120,310)+15,60,70),hcl(c(220,60,120,0,270,90,310)+15,60,70))
labels=hc$labels[hc$order]
cut=cutree(hc,8)
dend=color_branches(as.dendrogram(hc),k=length(unique(cut)),col=labelcolor[unique(cut[labels])])
circos.clear()
png("a.png",w=2500,h=2500,res=300)
circos.par(cell.padding=c(0,0,0,0))
circos.initialize(0,xlim=c(0,nrow(mats[[1]])))
circos.track(ylim=c(0,1),bg.border=NA,track.height=.2,track.margin=c(.005,0),panel.fun=function(x,y)
for(i in 1:nrow(mats[[1]]))circos.text(i-.5,0,labels[i],adj=c(0,.5),facing="clockwise",niceFacing=T,cex=.65,col=labelcolor[cut[labels[i]]])
)
for(j in length(mats):1)circos.track(ylim=c(0,1),track.height=.25,track.margin=c(0,.01),bg.lty=0,panel.fun=function(x,y){
mat=as.matrix(mats[[j]][hc$order,])
pos=1:nrow(mat)-.5
barwidth=1
for(i in 1:ncol(mat)){
seq1=rowSums(mat[,seq(i-1),drop=F])
seq2=rowSums(mat[,seq(i),drop=F])
circos.rect(pos-barwidth/2,if(i==1){0}else{seq1},pos+barwidth/2,seq2,col=barcolor[[j]][i],border="gray20",lwd=.1)
}
for(i in 1:ncol(mat)){
seq1=rowSums(mat[,seq(i-1),drop=F])
seq2=rowSums(mat[,seq(i),drop=F])
lab=round(100*mat[,i])
lab[lab<=1]=""
circos.text(pos,if(i==1){seq1/2}else{seq1+(seq2-seq1)/2},labels=lab,col="gray10",cex=.5,facing="downward")
}
})
circos.track(ylim=c(0,attr(dend,"height")),track.height=.25,track.margin=c(0,.0015),bg.border=NA,panel.fun=function(x,y)circos.dendrogram(dend))
circos.clear()
dev.off()
Bookmarks