omiccircos is an r software package used to generate high - quality circular plots for visualizing genomic variations , including mutation patterns , copy number variations ( cnvs ) , expression patterns , and methylation patterns . such variations can be displayed as scatterplot , line , or text - label figures . relationships among genomic features in different chromosome positions can be represented in the forms of polygons or curves . utilizing the statistical and graphic functions in an r / bioconductor environment , omiccircos performs statistical analyses and displays results using cluster , boxplot , histogram , and heatmap formats . in addition , omiccircos offers a number of unique capabilities , including independent track drawing for easy modification and integration , zoom functions , link - polygons , and position - independent heatmaps supporting detailed visualization . an extensive vignette in the package describes installation , data formatting , and workflow procedures . the software is open source under the artistic2.0 license . visualization is an essential aspect of the statistical analysis of large - scale genomic data collections . it plays important roles in exploring , analyzing , and presenting patterns and correlations found in multidimensional genomic data.1 the circular plot with multiple  doughnut  tracks is particularly effective in displaying relationships among genes or genomic intervals . the software package circos , written in perl , is widely used to generate circular plots.2 it has been cited in more than 300 publications describing the landscape of genomic alterations including mutations , aberrant expression patterns , cnvs , methylation patterns , and other types of structural variation ( http://circos.ca ) . however , while circos is flexible and quite powerful , it demands that users conquer a steep learning curve . other less well - known java - based circular plot tools , such as cgview and dnaplotter,3,4 are also known to be less than completely user - friendly . in efforts to develop more efficient software programs for generating circular plots , researchers have looked to the r package , a common environment for statistical computing and graphic visualization of large genomic data sets.5 the recently published r package rcircos incorporates standard r graphics into a circular ideogram , but lacks detailed visualization functions like zoom and independent track drawing.6 another application , ggbio , has very limited circular plot functionality since it utilizes a third - party graphic tool called ggplot.7 clearly , a distinct need exists for a software package for generating circular plots with readily customizable features that can help scientists more easily display and communicate complex genomics data . here , we present omiccircos , a simple and comprehensive approach to creating circular plots . the software package offers end users four unique customizable capabilities , all of which are available through a single command : independent track plotting and modification that does not affect other tracks in a given plot ; integrated statistical analysis and the concomitant display of results using boxplot , histogram , or position - independent heatmap representations ; provision of a zoom function that allows detailed visualization and link - polygon formulations to display for large translocations ; and the storage of genomic annotations and alignments in a way that permits the easy manipulation of genomic intervals . this last capability results from the integration and use of the genomicranges package in bioconductor within the omiccircos environment . the omiccircos package performs three main functions : 1 ) seganglepo ( ) specifies the circle size , number of segments , and segment width . such data are typically used to plot the outermost circle , which serves as an anchor for the figure . alternatively , if the figure is intended to represent a set of genes rather than a whole genome , the user can define one segment per gene by simply constructing the frame data with gene names and segment sizes . seganglepo ( ) can also read data from the granges object generated by the genomicranges package in bioconductor , which allows genomic intervals and annotations to be easily manipulated . for example , expression and cnv data can be viewed using basic shapes like scatterplots and lines while structural variations such as translocations and fusion proteins can be viewed using curves and polygons to connect different segments . additionally , multiple sample expression and cnv data sets can be displayed as boxplots , histograms , or heatmaps using standard r functions such as apply . furthermore , users are able to calculate and illustrate statistical values such as pvalue , ratio , standard deviation , mean , and median on the graph . it allows users to preview the graph quickly with different parameters and design an optimal presentation with desired features . the simulation data input files can be used as templates to format the genomic data for drawing publication - ready figures . to demonstrate the functionality of the omiccircos package , we display the cancer genome atlas ( tcga ) data describing breast cancer genomic variations such as mutation , expression , and copy number previously reported by the tcga network,8 as well as putative fusion proteins that were identified in house from tcga breast cancer rnaseq data using defuse.9 
 figure 1 illustrates an omiccircos plot consisting of two halves : the right half displays gene expression , cnv , correlation of cnv and expression , and fusion proteins for 15 her2 subtype samples ; the left half shows the zoom image of chromosomes 11 and 17 to demonstrate the focal copy number amplifications in the region of cdc6 , erbb2 , and ccnd1 . the gene - expression heatmap uses a position - independent display for a better representation of gene - dense areas . the circular plot from the omiccircos package can be seamlessly integrated with other types of r statistical graphics . for example , figure 2 illustrates cnv and gene - expression data for the four breast cancer subtypes : basal , her2 , luminal a ( luma ) and luminal b ( lumb ) with 15 samples in each group . cnvs for each subtype are represented in individual tracks . principal component analysis ( pca ) of gene - expression data for the four subtypes distinct patterns of arm - level cnv gain or loss are visible , eg , 5q loss in basal , 16q loss in luminal a / b , and 10p gain in basal . more examples of circular plots generated using omiccircos package are available in the package vignette . these show comparative genomic analyses , expression quantitative trait loci ( eqtls ) , protein - protein interactions ( ppis ) , and gene interactions within the context of pathways . the omiccircos package offers researchers a highly efficient , user - friendly program and visualization tool that not only illustrates genomic data analyses but also carries out statistical analyses that can be combined to generate publication - ready circular plots for a wide range of data types . besides these functionalities , omiccircos also takes advantage of statistical functions and comprehensive genome annotation packages in the r / biocondutor environment . this makes the package a powerful circular plot tool that provides users with unique functions that include independent track drawing , zooming , easy genome annotation manipulation , and integration of statistical analysis and graphics . omiccircos has sufficient flexibility to integrate with packages in r / bioconductor that bring together annotation , analysis , and comparative genomics pipelines . this document includes the following : the circos - like ideogram drawing the input file format the r codes of figures 1 and 2 comparison of omiccircos with other similar r package the circos - like ideogram drawing . the trigonometric algorithm and cubic bzier curve were used to draw the circular ideogram and polygon links . the arc of a circular track is defined by the trigonometric algorithm . given a circular center point ( xc , yc ) , a radius and two angles ( start and end points ) , the sequence points on the arc were calculated by the trigonometric algorithm . the arc was drawn by the line function in r. the linking curve or polygon between different chromosomal positions are plotted with a cubic bzier curve . the curve is defined by four points : p0 is the origin / starting point and p3 is the destination / end point ; which are corresponding to the positions on the chromosome(s ) ; p1 and p2 are control points defined by the center of the circular . r code for figure s1 : # # draw circle or arc using trigonometric functions # # draw.arc function in omiccircos draw.arc < - function ( xc , yc , r , w1 , w2 , col = " lightblue " , lwd = 1 , lend = 1 ) { ang.seq < - rev(seq(w1,w2,length.out = pix.n ) ) ; ang.seq < - ang.seq/360*2*pi ; fan.i.x < - xc + cos(ang.seq ) * r ; fan.i.y,- yc - sin(ang.seq ) * r ; # #  lend = 0(round ) ;  lend = 1(butt ) ; lend = 2(square ) lines(fan.i.x , fan.i.y , col = col , lwd = lwd , type = " l " , lend = lend ) ; cols < - rainbow(20 , alpha = 0.5 ) ; pdf("trig_function_curve.pdf " , 6 , 6 ) ; par(mar = c ( 1,1,1,1 ) ) ; plot(c(1,800 ) , c(1,800 ) , type = " n " , axes = f , xlab = " " , ylab = " " , main = " ") ; for ( i in 1:arc.num ) {  r < - sample(c(10:3 0 0),1 ) ;  w1 < - sample(c(0:180),1 ) ;  w2 < - sample(c(w 1:360),1 ) ;  lwd < - sample(c(4:20),1 ) ;  col < - sample(cols,1 ) ;  draw.arc(xc , yc , r , w1 , w2 , col = col , lwd = lwd ) ; the input data file format column 1 : chromosome number column 2 : chromosome position column 3 ( option ) : gene symbol > head(tcga.bc.cnv.2k.60[,1:6 ] ) linking data for fusion protein and translocation column 1 : chromosome number column 2 : chromosome position column 3 : gene symbol column 4 : other chromosome number column 5 : other chromosome position column 6 : other gene symbol > head(tcga.bc.fus[,c(1:6 ) ] ) ; the r codes of 
 figures 1 and 2 . options(stringsasfactors = false ) ; data(tcga.pam50_genefu_hg18  ) ; data(tcga.bc.cnv.2k.60  ) ; data(tcga.bc.gene.exp.2k.60  ) ; data(tcga.bc.sample60  ) ; data(tcga.bc_her2_cnv_exp  ) ; pvalue < - -1 * log10(tcga.bc_her2_cnv_exp[,5 ] ) ; pvalue < - cbind(tcga.bc_her2_cnv_exp[,c(1:3 ) ] , pvalue ) ; her2.i < - tcga.bc.sample60[her2.i,1 ] ; her2.j < - which(colnames(tcga.bc.cnv.2k.60)%in%her2.n ) ; cnv < - tcga.bc.cnv.2k.60[,c(1:3,her2.j ) ] ; cnv.m < - cnv[,c(4:ncol(cnv ) ) ] ; cnv.m[cnv.m > 2 ] < - 2 ; cnv.m[cnv.m < -2 ] < - -2 ; cnv < - cbind(cnv[,1:3 ] , cnv.m ) ; her2.j  < -  which(colnames(tcga.bc.gene.exp.2k.60)%in% her2.n ) ; gene.exp < - tcga.bc.gene.exp.2k.60[,c(1:3,her2.j ) ] ; colors < - rainbow(10 , alpha = 0.5 ) ; pdf(omiccircos4vignette10_paper1.pdf  , 8,8 ) ; par(mar = c(2 , 2 , 2 , 2 ) ) ; plot(c(1,800 ) , c(1,800 ) , type = n  , axes = false , xlab =   , ylab =   , main = ) ; zoom < - c(1 , 22 , 939245.5 , 154143883 , 0 , 180 ) ; circos(r = 400 , cir =  hg18  , w = 4 , type =  chr  , print.chr.lab = true , scale = true , zoom = zoom ) ; circos(r = 300 , cir =  hg18  , w = 100 , mapping = gene.exp , col.v = 4 , type = heatmap2  , cluster = false , col.bar = true , lwd = 0.01 , zoom = zoom ) ; circos(r = 220 , cir =  hg18  , ml3  , b = false , lwd = 1 , cutoff = 0 , zoom = zoom ) ; circos(r = 140 , cir =  hg18  , w = 80 , mapping = pvalue , col.v = 4 , type = l  , b = true , lwd = 1 , col = colors , zoom = zoom ) ; circos(r = 130 , cir =  hg18  , w = 10 , mapping = tcga.bc.fus , type =  link  , lwd = 2 , zoom = zoom ) ; # # zoom in links by using the hightlight functions the.col1 = rainbow(10 , alpha = 0.5 ) ; highlight < - c(140 , 400 , 11 , 282412.5 , 11 , 133770314.5 , the.col1 , the.col1 ) ; circos(r = 110 , cir =  hg18  , w = 40 , mapping = highlight , type =  hl  , lwd = 2 , zoom = zoom ) ; the.col2 = rainbow(10 , alpha = 0.5 ) ; highlight < - c(140 , 400 , 17 , 739525 , 17 , 78385909 , the.col2 , the.col2 ) ; circos(r = 110 , cir =  hg18 , w = 40 , mapping = highlight , type =  hl  , lwd = 2 , zoom = zoom ) ; highlight.link1 < - c(400 , 400 , 140 , 376.8544 , 384.0021 , 450 , 540.5 ) ; circos(cir =  hg18  , mapping = highlight.link1 , type = < - c(400 , 400 , 140 , 419.1154 , 423.3032 , 543 , 627 ) ; circos(cir =  hg18  , mapping = highlight.link2 , type =  highlight.link  , col = the.col2 , lwd = 1 ) ; # # zoom in chromosome 11 zoom < - c(11 , 11 , 282412.5 , 133770314.5 , 180 , 270 ) ; circos(r = 400 , cir = , print.chr.lab = true , scale = true , zoom = zoom ) ; circos(r = 300 , cir =  hg18  , w = 100 , mapping = gene.exp , col.v = 4 , type = heatmap2  , cluster = false , lwd = 0.01 , zoom = zoom ) ; circos(r = 220 , cir =  hg18  , w = 80 , mapping = cnv , col.v = 4 , type =  ml3  , b = false , lwd = 1 , cutoff = 0 , zoom = zoom ) ; circos(r = 140 , cir = l  , b = true , lwd = 1 , col = colors , zoom = zoom ) ; gene.names < - c(erbb2,cdc6  ) ; pam50.17  < -  which(tcga.pam50_genefu_hg18 [ , 3 ] = = gene.names ) ; tcga.pam50  < -  tcga.pam50_genefu_hg18[pam50.17 , ] ; tcga.pam50 < - rbind(tcga.pam50 , tcga.pam50[2 , ] ) ; tcga.pam50 < - 11 ; tcga.pam50 < - 69165000 ; tcga.pam50[,3 ] < - as.character(tcga.pam50[,3 ] ) ; tcga.pam50 < - c(ccnd1  ) ; circos(r = 410 , cir =  hg18 , w = 40 , mapping = tcga.pam50 , type =  label  , side =  out , col =  blue  , zoom = zoom ) ; # # zoom in chromosome 17 zoom < - c(17 , 17 , 739525 , 78385909 , 274 , 356 ) ; circos(r = 400 , cir =  hg18 , w = 4 , type =  chr  , print.chr.lab = true , scale = true , zoom = zoom ) ; circos(r = 300 , cir =  hg18  , w = 100 , mapping = gene.exp , col.v = 4 , type = cluster = false , lwd = 0.01 , zoom = zoom ) ; circos(r = 220 , cir =  hg18  , w = 80 , mapping = cnv , col.v = 4 , type = ml3  , b = false , lwd = 1 , cutoff = 0 , zoom = zoom ) ; circos(r = 140 , cir =  hg18  , w = 80 , mapping = pvalue , col.v = 4 , type = l  , b = true , lwd = 1 , col = colors , zoom = zoom ) ; gene.names < - c(erbb2,cdc6  ) ; pam50.17  < -  which(tcga.pam50_genefu_hg18 [ , 3 ] = = gene.names ) ; tcga.pam50  < -  tcga.pam50_genefu_hg18[pam50.17 , ] ; tcga.pam50  < -  rbind(tcga.pam50 , tcga.pam50[2 , ] ) ; tcga.pam50 < - 11 ; tcga.pam50 < - 69165000 ; tcga.pam50[,3 ]  < -  as.character(tcga.pam50[,3 ] ) ; tcga.pam50 < - c(ccnd1  ) ; circos(r = 410 , cir =  hg18  , w = 40 , mapping = tcga.pam50 , type =  label  , side =  out  , col =  blue  , zoom = zoom ) ; options(stringsasfactors = false ) ; data(tcga.bc.cnv.2k.60  ) ; data(tcga.bc.gene.exp.2k.60  ) ; data(tcga.bc.sample60  ) ; # # gene expression data for pca exp.m < - tcga.bc.gene.exp.2k.60[,c(4:ncol(tcga.bc.gene.exp.2k.60 ) ) ] ; cnv<- tcga.bc.cnv.2k.60 ; type.n < - unique(tcga.bc.sample60[,2 ] ) ; colors < - rainbow(length(type.n ) , alpha = 0.5 ) ; pca.col < - rep(na , nrow(tcga.bc.sample60 ) ) ; for ( i in 1:length(type.n ) ) { n.i < - which(tcga.bc.sample60[,2 ] = = n ) ; n.n < - tcga.bc.sample60[n.i,1 ] ; g.i < - which(colnames(exp.m)%in% n.n ) ; pca.col[g.i ] < - colors[i ] ; exp.m < - na.omit(exp.m ) ; pca.out < - prcomp(t(exp.m ) , scale = true ) ; for ( i in 1:length(type.n ) ) { n.i < - which(tcga.bc.sample60[,2 ] = = n ) ; n.n < - tcga.bc.sample60[n.i,1 ] ; cnv.i < - which(colnames(cnv)%in% n.n ) ; pdf(omiccircos4vignette7.pdf  , 8,8 ) ; par(mar = c(5 , 5 , 5 , 5 ) ) ; plot(c(1,800 ) , c(1,800 ) , type = n  , axes = false , xlab =   , ylab =   , main = ) ; legend(680,800 , c(basal,her2,luma,lumb  ) , pch = 19 , col = colors[c(2,4,1,3 ) ] , cex = 0.5 , title =  gene expression ( pca )  , box.col =  white  ) ; legend(5,800 , c(1 basal  ,  2 her2  ,  3 luma  ,  4 lumb  ,  ( center )  ) , cex = 0.5 , title =  cnv ( omiccircos )  , box.col =  white  ) ; circos(xc = 400 , yc = 400 , r = 390 , cir =  hg18  , w = 4 , type =  chr  , print.chr.lab = true , scale = true ) ; for ( i in 1:length(type.n ) ) { n.i < - which(tcga.bc.sample60[,2 ] = = n ) ; n.n < - tcga.bc.sample60[n.i,1 ] ; cnv.i < - which(colnames(cnv)%in% n.n ) ; c nv.v < - cnv[,cnv.i ] ; cnv.v[cnv.v < 2 ] < - 2 ; cnv.v[cnv.v < -2 ] < - -2 ; cnv.m < - cbind(cnv[,c(1:3 ) ] , cnv.v ) ; circos(xc = 400 , yc = 400 , r = r.v , cir =  hg18  , w = 60 , mapping = cnv.m , col.v = 4 , type = ml3  , b = false , lwd = 1 , cutoff = 0 , scale = true ) ; points(pca.out$x[,1]*3.6 + 400 ,  pca.out$x[,2]*3.6+400 , pch = 19 , col = pca.col , cex = 2 ) ; comparison of omiccircos with other similar r package . to demonstrate the features of omiccircos , we compared the circular plot generated by omiccircos ( fig . s2 ) using the same tcga breast cancer dataset ( zhang , meltzer et al . the main differences between omiccircos and rcircos were track design , zoom , sample number , heatmap , run time and output file size ( table s1 ) . circular plot generated by rcircos using the same data set as figure 1 generated by omiccircos .
summaryomiccircos is an r software package used to generate high - quality circular plots for visualizing genomic variations , including mutation patterns , copy number variations ( cnvs ) , expression patterns , and methylation patterns . 
 such variations can be displayed as scatterplot , line , or text - label figures . 
 relationships among genomic features in different chromosome positions can be represented in the forms of polygons or curves . utilizing the statistical and graphic functions in an r / bioconductor environment , omiccircos performs statistical analyses and displays results using cluster , boxplot , histogram , and heatmap formats . 
 in addition , omiccircos offers a number of unique capabilities , including independent track drawing for easy modification and integration , zoom functions , link - polygons , and position - independent heatmaps supporting detailed visualization.availability and implementationomiccircos is available through bioconductor at http://www.bioconductor.org/packages/devel/bioc/html/omiccircos.html . 
 an extensive vignette in the package describes installation , data formatting , and workflow procedures . 
 the software is open source under the artistic2.0 license .