1

I need to make a circos plot (preferably using circlize or other R package) that should look similar to this one: https://journals.plos.org/plosone/article/figure/image?size=large&id=10.1371/journal.pone.0075072.g003, but I want it to be divided in half based on group variable. Then, each track should represent proportions of enst1 to 5 for each gene. Finally, instead of names I'd like to plot div variable in the boxes. I'd be grateful for any help constructing the plot!

Example data:

group <- c(
  rep("G1",3),
  rep("G2",3)
  )
gene <- rep(letters[1:3], 2)
enst1 <- runif(6, min = 0, max = 1)
enst2 <- runif(6, min = 0, max = 1)
enst3 <- runif(6, min = 0, max = 1)
enst4 <- runif(6, min = 0, max = 1)
enst5 <- runif(6, min = 0, max = 1)
mtx <- cbind.data.frame(enst1, enst2, enst3, enst4, enst5)*1/rowSums(cbind.data.frame(enst1, enst2, enst3, enst4, enst5))
div <- runif(6, min = 1, max = 3)
data <- cbind.data.frame(group, 
                         gene,
                         mtx,
                         div)

Edit: This is one track of a desired output (proportions may be different than in the example data).

Desired output

Cross-posted on github: https://github.com/jokergoo/circlize/issues/329

Mieszko
  • 49
  • 4
  • I am happy to help, but can you make a working example? It does not run because enst6 is not found... And to clarify: You want a plot with 3 tracks (rings) for this example: a,b and c. ? – Lucas Jul 27 '22 at 14:03
  • So sorry! The example data should be good now. I quickly drew what one track of a desired output should look like. – Mieszko Jul 27 '22 at 15:25

1 Answers1

2

Okay, there are a few issues with the texts in my code. But you can use the idea for the tracks...

group <- c(
  rep("G1",3),
  rep("G2",3)
)
gene <- rep(letters[1:3], 2)
enst1 <- runif(6, min = 0, max = 1)
enst2 <- runif(6, min = 0, max = 1)
enst3 <- runif(6, min = 0, max = 1)
enst4 <- runif(6, min = 0, max = 1)
enst5 <- runif(6, min = 0, max = 1)
mtx <- cbind.data.frame(enst1, enst2, enst3, enst4, enst5)*1/rowSums(cbind.data.frame(enst1, enst2, enst3, enst4, enst5))
div <- runif(6, min = 1, max = 3)
data <- cbind.data.frame(group, 
                         gene,
                         mtx,
                         div)

data.init <- data.frame(name = c("Text"), start = c(0,1), end = c(1,2))


library(circlize)

circos.par("start.degree" = 80)
circos.par("gap.degree" = 25)

circos.initialize(sectors = factor(data$group), xlim = c(0,1))

for (gene in unique(data$gene)) {
  circos.track(ylim = c(0,1), bg.border = NA)
}    

track = 3
for (gene in unique(data$gene)){
    circos.text(1.08,track, round(data$div[which(data$group == "G1" & data$gene == gene)], 2))
    start <- 0
    end <- 0
    end <- start + data$enst1[which(data$group == "G1" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "blue", sector.index = "G1", track.index = track)
    start <- end
    end <- end + data$enst2[which(data$group == "G1" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "green", sector.index = "G1", track.index = track)
    start <- end
    end <- end + data$enst3[which(data$group == "G1" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "orange", sector.index = "G1", track.index = track)
    start <- end
    end <- end + data$enst4[which(data$group == "G1" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "yellow", sector.index = "G1", track.index = track)
    start <- end
    end <- end + data$enst5[which(data$group == "G1" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "red", sector.index = "G1", track.index = track)
    track <- track - 1
}


track = 3
for (gene in unique(data$gene)){
    circos.text(-0.08,track, round(data$div[which(data$group == "G2" & data$gene == gene)], 2))
    start <- 0
    end <- 0
    end <- start + data$enst1[which(data$group == "G2" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "blue", sector.index = "G2", track.index = track)
    start <- end
    end <- end + data$enst2[which(data$group == "G2" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "green", sector.index = "G2", track.index = track)
    start <- end
    end <- end + data$enst3[which(data$group == "G2" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "orange", sector.index = "G2", track.index = track)
    start <- end
    end <- end + data$enst4[which(data$group == "G2" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "yellow", sector.index = "G2", track.index = track)
    start <- end
    end <- end + data$enst5[which(data$group == "G2" & data$gene == gene)]
    circos.rect(start,0,end,1, col = "red", sector.index = "G2", track.index = track)
    track <- track - 1
}

circos.clear()

enter image description here

Lucas
  • 409
  • 2
  • 10