简体   繁体   中英

Circlize migration plot missing links

I have tried to follow the R code from Guy, to create circular migration plots. My files are similar to those that he presents with the package "migest" (science/regions_custom). My data file example is 'regions_oceanos':

-   -   -   1   2   4   3
-   -   -   Pacífico    Índico  Mediterráneo    Atlántico
1   160,0,125   Pacífico    245.025 1.70210026  0.09857195  1.7337982
2   0,255,233   Índico  0.4165425   242.575 3.9052666   6.9741618
4   125,175,0   Mediterráneo    3.05222742  5.99567776  11.125  5.7953056
3   255,219,0   Atlántico   2.63735109  7.51662301  4.3093533   36.625

And the R code is:

library("migest")
m<-read.table("region_reciente.txt", skip=2, stringsAsFactors=FALSE)
df1<-m[,1:3]
names(df1)<-c("order","rgb","region")
df1$region<-gsub("_", " ", df1$region)
m<-m[,-(1:3)]/1e06
m<-as.matrix(m)
dimnames(m)<-list(orig=df1$region,dest=df1$region)
library("plyr")
df1<-arrange(df1, order)
df1$region <- factor(df1$region, levels=df1$region)  
m<-m[levels(df1$region),levels(df1$region)]
df1$xmin <- 0
df1$xmax <- rowSums(m)+colSums(m)
n<-nrow(df1)
df1 <- cbind(df1, matrix(as.numeric(unlist(strsplit(df1$rgb,","))),nrow=n,   byrow=TRUE) )
names(df1)[ncol(df1)-2:0]<-c("r","g","b")
df1$rcol<-rgb(df1$r, df1$g, df1$b, max = 255)
df1$lcol<-rgb(df1$r, df1$g, df1$b, alpha=200, max = 255)
library("circlize")
par(mar=rep(0,4))
circos.clear()
circos.par(cell.padding=c(0,0,0,0), track.margin=c(0,0.1), start.degree = 90, gap.degree =4)
circos.initialize(factors = df1$region, xlim = cbind(df1$xmin, df1$xmax))
circos.trackPlotRegion(ylim = c(0, 1), factors = df1$region,     track.height=0.1, bg.border = NA, bg.col = NA, bg.lty =0, bg.lwd=0.0001,
panel.fun = function(x, y) {
    name = get.cell.meta.data("sector.index")
    i = get.cell.meta.data("sector.numeric.index")
    xlim = get.cell.meta.data("xlim")
    ylim = get.cell.meta.data("ylim")
    circos.text(x=mean(xlim), y=2.2, labels=name, facing = "bending", cex=0.8)
    circos.rect(xleft=xlim[1], ybottom=ylim[1], xright=xlim[2], ytop=ylim[2], 
             col = df1$rcol[i], border=df1$rcol[i])
    circos.rect(xleft=xlim[1], ybottom=ylim[1], xright=xlim[2]-rowSums(m)[i], ytop=ylim[1]+0.3, 
             col = "white", border = "white")
    circos.rect(xleft=xlim[1], ybottom=0.3, xright=xlim[2], ytop=0.32, col = "white", border = "white")
    circos.axis(labels.cex=0.8, direction = "outside", major.at=seq(0,floor(df1$xmax)[i]), minor.ticks=1,
             labels.away.percentage = 0.15)
})
df1$sum1 <- colSums(m)
df1$sum2 <- numeric(n)
df2<-cbind(as.data.frame(m),orig=rownames(m),  stringsAsFactors=FALSE)
df2<-reshape(df2, idvar="orig", varying=list(1:n), direction="long",      timevar="dest", time=rownames(m),  v.names = "m")
df2<-arrange(df2,desc(m))
df2<-subset(df2, m>quantile(m,0.65))
for(k in 1:nrow(df2)){
    i<-match(df2$orig[k],df1$region)
    j<-match(df2$dest[k],df1$region)
    circos.link(sector.index1=df1$region[i], point1=c(df1$sum1[i], df1$sum1[i] + abs(m[i, j])),
          sector.index2=df1$region[j], point2=c(df1$sum2[j], df1$sum2[j] + abs(m[i, j])),
          col = df1$lcol[i])
    df1$sum1[i] = df1$sum1[i] + abs(m[i, j])
    df1$sum2[j] = df1$sum2[j] + abs(m[i, j])
}

And, as you can see I obtain this very cool graph , but the links within it not neccesarily represent my matrix. As an example, you can see that there is not flow from or to Pacifico and Mediterraneo or from Atlantico to Mediterraneo, but in the matrix I present some values for those segments that are similar to those that were actually plotted. It might be related to the Note that the code presents after creating the plot region: (Note: 1 point is out of plotting region in sector 'Pacífico', track '1'). But I am not sure how to deal with it. I will really appreciate any feedback and comments

The line

df2 <- subset(df2, m>quantile(m,0.65))

ensures only the biggest flows are plotted. You probably don't need this, given you have only four regions, and it sounds like you want to see all the flows.

Also, I have yet to update the CRAN version of the demo script in the migest package. You might be better off using the version on github, https://github.com/gjabel/migest/tree/master/demo , or... now these plots are even easier using the chordDiagram function:

library("circlize")
m <- read.table("region_reciente.txt", skip=2, stringsAsFactors=FALSE)
#data.frame for details on each region
df1 <- m[,1:3]
names(df1) <- c("order","rgb","region")
n <- nrow(df1)
df1 <- cbind(df1, matrix(as.numeric(unlist(strsplit(df1$rgb,","))),nrow=n, byrow=TRUE) )
names(df1)[ncol(df1)-2:0] <- c("r","g","b")
df1$rcol <- rgb(df1$r, df1$g, df1$b, max = 255)

#flow matrix
m <- m[,-(1:3)]
m <- as.matrix(m)
dimnames(m) <- list(orig=df1$region, dest=df1$region)
chordDiagram(m, directional = TRUE, grid.col=df1$rcol)

在此输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM