4

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

rawr
  • 20,481
  • 4
  • 44
  • 78
  • check on `df2` which has the origin-destination mappings. there aren't any rows corresponding to the mappings that you say are missing. all of the ones in df2 are plotted – rawr Mar 06 '15 at 02:07
  • Thanks Suseika! You were totally right. I don't understand why df2 doesn't have all the links, but I edited it and it worked! Thanks! – Natalia Bayona Mar 06 '15 at 21:13

1 Answers1

2

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)

enter image description here

guyabel
  • 8,014
  • 6
  • 57
  • 86