<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article article-type="research-article" dtd-version="2.3" xml:lang="EN" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Genet.</journal-id>
<journal-title>Frontiers in Genetics</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Genet.</abbrev-journal-title>
<issn pub-type="epub">1664-8021</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">1535368</article-id>
<article-id pub-id-type="doi">10.3389/fgene.2025.1535368</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Genetics</subject>
<subj-group>
<subject>Technology and Code</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>CirclizePlus: using ggplot2 feature to write readable R code for circular visualization</article-title>
<alt-title alt-title-type="left-running-head">Zhang et al.</alt-title>
<alt-title alt-title-type="right-running-head">
<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.3389/fgene.2025.1535368">10.3389/fgene.2025.1535368</ext-link>
</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname>Zhang</surname>
<given-names>Zheyu</given-names>
</name>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Cao</surname>
<given-names>Tianze</given-names>
</name>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/2862024/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Huang</surname>
<given-names>Yuexia</given-names>
</name>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/2900600/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Xia</surname>
<given-names>Yu</given-names>
</name>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
</contrib-group>
<aff>
<institution>School of Mathematics</institution>, <institution>Hangzhou Normal University</institution>, <addr-line>Hangzhou</addr-line>, <country>China</country>
</aff>
<author-notes>
<fn fn-type="edited-by">
<p>
<bold>Edited by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/827295/overview">Lei Chen</ext-link>, Shanghai Maritime University, China</p>
</fn>
<fn fn-type="edited-by">
<p>
<bold>Reviewed by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/232195/overview">Fabio Iannelli</ext-link>, European Institute of Oncology (IEO), Italy</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1858543/overview">Archana Prabahar</ext-link>, Cleveland State University, United States</p>
</fn>
<corresp id="c001">&#x2a;Correspondence: Tianze Cao, <email>tianze-cao@hznu.edu.cn</email>; Yuexia Huang, <email>yxhuang@hznu.edu.cn</email>
</corresp>
</author-notes>
<pub-date pub-type="epub">
<day>27</day>
<month>03</month>
<year>2025</year>
</pub-date>
<pub-date pub-type="collection">
<year>2025</year>
</pub-date>
<volume>16</volume>
<elocation-id>1535368</elocation-id>
<history>
<date date-type="received">
<day>27</day>
<month>11</month>
<year>2024</year>
</date>
<date date-type="accepted">
<day>17</day>
<month>03</month>
<year>2025</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2025 Zhang, Cao, Huang and Xia.</copyright-statement>
<copyright-year>2025</copyright-year>
<copyright-holder>Zhang, Cao, Huang and Xia</copyright-holder>
<license xlink:href="http://creativecommons.org/licenses/by/4.0/">
<p>This is an open-access article distributed under the terms of the Creative Commons Attribution License (CC BY). The use, distribution or reproduction in other forums is permitted, provided the original author(s) and the copyright owner(s) are credited and that the original publication in this journal is cited, in accordance with accepted academic practice. No use, distribution or reproduction is permitted which does not comply with these terms.</p>
</license>
</permissions>
<abstract>
<p>In the R programming language, the <italic>de facto</italic> standard framework for drawing rectangular coordinates is ggplot2. The most important feature of ggplot2 is that it is object-oriented and uses the plus sign to overlay various objects. In the field of circular visualization, circlize is a popular software, but it is based on procedural programming. Making it object-oriented can make the logic of the written code clearer and improve the reusability of the code. In this work, we introduce circlizePlus, which redesigns the concepts in circular visualization into several R S4 classes. It also defines a set of additional rules, based on which users can implement ggplot2-like drawing techniques. circlizePlus is a wrapper for circlize. It transforms the procedural programming style of circular visualization drawing into object-oriented programming. The additional rules it defines reduce the amount of coding and make the code more readable. The source codes can be found at <ext-link ext-link-type="uri" xlink:href="https://github.com/tianzelab/circlizePlus">https://github.com/tianzelab/circlizePlus</ext-link>, and the sample code can be found at <ext-link ext-link-type="uri" xlink:href="https://tianzelab.github.io/circlizePlusBook/">https://tianzelab.github.io/circlizePlusBook/</ext-link>.</p>
</abstract>
<kwd-group>
<kwd>circlize</kwd>
<kwd>ggplot2</kwd>
<kwd>object-oriented</kwd>
<kwd>generic functions</kwd>
<kwd>functional programming</kwd>
</kwd-group>
<custom-meta-wrap>
<custom-meta>
<meta-name>section-at-acceptance</meta-name>
<meta-value>Computational Genomics</meta-value>
</custom-meta>
</custom-meta-wrap>
</article-meta>
</front>
<body>
<sec id="s1">
<title>1 Introduction</title>
<p>Circular layout plots typically consist of sectors and tracks. The intersection of sectors and tracks is called a cell (<xref ref-type="fig" rid="F1">Figure 1</xref>). This kind of layout can not only transparently represent the relationship between different data categories, but also rep-resent different observations from different dimensions within the same category. For instance, in genomics, different sectors may represent different chromosomes. In contrast, every single track layer can represent a different data category, such as gene density, or the variation standard, to name but a few.</p>
<fig id="F1" position="float">
<label>FIGURE 1</label>
<caption>
<p>Schematic diagram of circle layout plotting.</p>
</caption>
<graphic xlink:href="fgene-16-1535368-g001.tif"/>
</fig>
<p>Although numerous packages have been developed to implement circle layout plotting (<xref ref-type="bibr" rid="B12">Krzywinski et al., 2009</xref>; <xref ref-type="bibr" rid="B7">Darzentas, 2010</xref>; <xref ref-type="bibr" rid="B17">Zhang et al., 2013</xref>; <xref ref-type="bibr" rid="B11">Gu et al., 2014</xref>; <xref ref-type="bibr" rid="B2">An et al., 2015</xref>; <xref ref-type="bibr" rid="B3">Cheong et al., 2015</xref>; <xref ref-type="bibr" rid="B4">Cui et al., 2016</xref>; <xref ref-type="bibr" rid="B8">Diaz-Garcia et al., 2017</xref>; <xref ref-type="bibr" rid="B9">Drori et al., 2017</xref>; <xref ref-type="bibr" rid="B16">Yu et al., 2018</xref>; <xref ref-type="bibr" rid="B13">Marx and Coon, 2019</xref>; <xref ref-type="bibr" rid="B5">Cui et al., 2020</xref>; <xref ref-type="bibr" rid="B14">Rasche and Hiltemann, 2020</xref>; <xref ref-type="bibr" rid="B6">Cui et al., 2021</xref>; <xref ref-type="bibr" rid="B10">Ennis et al., 2023</xref>), circlize (<xref ref-type="bibr" rid="B11">Gu et al., 2014</xref>) has become the most mainstream tool since its release. It is an R package that offers various tools and functions to form these complex circle layout plots. Based on the statistical and graphical syntax of R, the package is especially easy for those who are good at R to use. By using circlize package, users can generate various types of charts, including scatter plots, histograms, line plots, heatmaps, etc.</p>
<p>By using circlize package, users can create many sorts of graphical elements easily, such as adding points, lines, texts, and axes. For instance, circos.points () function may be used for adding points, circos.line () for lines, and circos.text () for text labels. Moreover, the package is also accessible for stacking tracks and dividing sections, allowing every dataset to be displayed in the appropriate position.</p>
<p>In the domain of rectangular layout plotting, ggplot2 (<xref ref-type="bibr" rid="B15">Wickham, 2016</xref>) offers high-level flexibility and controllability by object-oriented programming and the overloading of the addition operator, which makes it much more popular than the basic R plotting API.</p>
<p>However, the classic way to use circlize is procedural programming, so it is necessary to provide support for object-oriented programming and addition operators like ggplot2. This will allow users to overlay different graphic elements in a more intuitive and modular way when creating complex circular layouts. Here, we&#x2019;d like to introduce circlizePlus, which implements object-oriented programming and additive operations in circular layout plotting by wrapping circlize.</p>
</sec>
<sec sec-type="materials|methods" id="s2">
<title>2 Materials and methods</title>
<sec id="s2-1">
<title>2.1 Classes and addition rules in circlizePlus</title>
<p>The classes and object constructors defined in circlizePlus are prefixed with &#x201c;cc,&#x201d; to avoid naming conflicts with other packages and represent the abbreviation of circlize. circlizePlus defines 12&#xa0;R S4 classes, 7 of which are primary classes, namely, ccPlot, ccPar, ccTrack, ccTrackGeom, ccLink, ccCell, and ccCellGeom. Based on these primary classes, circlizePlus constructs a set of addition operation rules as follows.<disp-formula id="equ1">
<mml:math id="m1">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2002;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="equ2">
<mml:math id="m2">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2002;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="equ3">
<mml:math id="m3">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">L</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">L</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">P</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">L</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="equ4">
<mml:math id="m4">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mi mathvariant="bold-italic">G</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">m</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mi mathvariant="bold-italic">G</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">m</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mi mathvariant="bold-italic">G</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">m</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="equ5">
<mml:math id="m5">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">T</mml:mi>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">k</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="equ6">
<mml:math id="m6">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">G</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">m</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">G</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">m</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mi mathvariant="bold-italic">t</mml:mi>
<mml:mi mathvariant="bold-italic">a</mml:mi>
<mml:mi mathvariant="bold-italic">i</mml:mi>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">l</mml:mi>
<mml:mi mathvariant="bold-italic">G</mml:mi>
<mml:mi mathvariant="bold-italic">e</mml:mi>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mi mathvariant="bold-italic">m</mml:mi>
<mml:mi mathvariant="bold-italic">s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">n</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:mrow>
</mml:math>
</disp-formula>
</p>
</sec>
<sec id="s2-2">
<title>2.2 Data mapping from track to geometry</title>
<p>In ggplot2, the parameter data of the function plotting the geometry can be missing. In this case, the value of the parameter with the same name in the function ggplot () will be taken as the default value. Similar features are also implemented in circlizePlus. The coordinate parameters (such as x, y) of the function that draws geometric figures in the sector can be missing. circlizePlus will extract the data of the corresponding sector of the track it is added to and set it as the default value. It is worth noting that the coordinate parameter can be an anonymous function of the form &#x201c;function (x, y) &#x2026;&#x201d;. This anonymous function will be called with the default parameter values above, and its re-turn value will be used as the actual value of the coordinate parameter.</p>
</sec>
<sec id="s2-3">
<title>2.3 Relationships between ccPar, ccTrack, ccLink and ccPlot</title>
<p>ccPlot is the core class of circlizePlus, whose objects are generated by the homonymous object constructor ccPlot (). The object of ccPlot acts as a container, holding the objects of ccPar, ccTrack, and ccLink. The objects of ccPar are generated by the homonymous object constructor ccPar(), defining the global parameter for plotting. Users may add one or more ccPar objects to a ccPlot object. circlizePlus aggregates multiple ccPar objects, thus determining the global plotting parameters. A single ccTrack object defines how to plot a track. There is also a subclass of ccTrack named ccGenomicTrack. Their object constructors and functionalities are listed in <xref ref-type="sec" rid="s11">Supplementary Table S1</xref>. A single ccLink object stores data of the link connecting two sectors. There are also 2 subclasses of ccLink: ccHeatmapLink and ccGenomicLink. Their object constructors and functionalities are listed in <xref ref-type="sec" rid="s11">Supplementary Table S2</xref>.</p>
<p>When plotting, users are supposed to call the generic show () function, in which ccPlot objects serve as a parameter. Once the show () function is called, circlizePlus will set global plotting parameters based on ccPar objects stored in ccPlot. Meanwhile, it plots tracks based on stored ccTrack objects or their subclasses, and plots lines based on ccLink objects or their subclasses.</p>
</sec>
<sec id="s2-4">
<title>2.4 Relationships between ccTrack, ccTrackGeom, ccCell and ccCellGeom</title>
<p>ccTrackGeom and ccCellGeom stored in ccTrack determine the geometrics plotted in the current track. Data stored in ccTrackGeom works on the entire track, while data stored in ccCellGeom works only on a single cell within the track. ccCellGeom objects cannot be add directly into ccTrack. It must first be added to a ccCell object before adding the ccCell object to ccTrack thereafter. ccCellGeom has a subclass named ccGenomicCellGeom. The object constructors and functionalities of ccTrackGeom and ccCellGeom are listed in <xref ref-type="sec" rid="s11">Supplementary Table S3</xref>.</p>
</sec>
</sec>
<sec sec-type="results" id="s3">
<title>3 Results</title>
<sec id="s3-1">
<title>3.1 Workflow of circlizePlus</title>
<p>There are approximately 6 steps for users using circlizePlus to plot (<xref ref-type="fig" rid="F2">Figure 2</xref>), with no strict order restriction for steps 1 to 4.<list list-type="simple">
<list-item>
<p>Step 1: When initiating plot programming, users must first call the ccPlot () function to generate a ccPlot object. Users also need to set a mandatory parameter named &#x201c;initMode,&#x201d; which can take one of the following 4 values: &#x201c;initialize,&#x201d; &#x201c;heatmap.initialize,&#x201d; &#x201c;initializeWithIdeogram&#x201d; or &#x201c;genomicInitialize.&#x201d; Different values of initMode correspond to different plotting scenes. The backend of circlizePlus will call the corresponding initialization functions from the circlize package based on the value of initMode. Therefore, ccPlot () function will have different applicable parameters.</p>
</list-item>
<list-item>
<p>Step 2: For general plotting, users are supposed to generate a ccTrack object. As for visualizing genomic data, users are supposed to create a ccGenomicTrack object.</p>
</list-item>
<list-item>
<p>Step 3: Users are supposed to select the appropriate object constructor function to generate geometric objects, according to the geometrics to be generated.</p>
</list-item>
<list-item>
<p>Step 4: Users are supposed to generate ccLink objects or one of its subclasses, in case users need to connect sectors to represent the relationships between each of them.</p>
</list-item>
<list-item>
<p>Step 5: Users assemble objects according to the addition rules of circlizePlus, and finally call the generic show () function, in which the ccPlot object is used as a parameter to generate a graph. Users are supposed to repeat some steps in steps 1 to 4 and reassemble if the figure generated does not meet expectations.</p>
</list-item>
<list-item>
<p>Step 6: circlizePlus is compatible with the circlize API. If the figure obtained by the above steps is not satisfactory, the user can also call the circlize API for further fine-tuning.</p>
</list-item>
</list>
</p>
<fig id="F2" position="float">
<label>FIGURE 2</label>
<caption>
<p>Workflow diagram of circlizePlus.</p>
</caption>
<graphic xlink:href="fgene-16-1535368-g002.tif"/>
</fig>
</sec>
<sec id="s3-2">
<title>3.2 Example 1: plotted dot plot categorized by chromosome, and zoomed for partial chromosome categorization</title>
<p>This section demonstrates the workflow of circlizePlus based on a small case (<xref ref-type="bibr" rid="B11">Gu et al., 2014</xref>). The code lines are segmented according to the workflow defined in the article (codes are shown in <xref ref-type="sec" rid="s11">Supplementary File S1</xref>). It plots the chromosome bands in the outer circle and the corresponding scatter points in the inner circle (<xref ref-type="fig" rid="F3">Figure 3</xref>). Magnified views of chromosomes 7 and 8 are shown on the left parts of the circles. The entire code process is like solving an addition problem, and the data flow of drawing can be clearly understood. Note that the data mapping technique is used in step 3. The coordinate parameter of the function ccGenomicPoints () is missing. It will take the coordinate parameter value of the corresponding sector from the variable track1. This technique ensures consistency of coordinate data while reducing code duplication.</p>
<fig id="F3" position="float">
<label>FIGURE 3</label>
<caption>
<p>Chromosomes 7 and 8 are shown enlarged on the left half of the circle.</p>
</caption>
<graphic xlink:href="fgene-16-1535368-g003.tif"/>
</fig>
</sec>
</sec>
<sec sec-type="discussion" id="s4">
<title>4 Discussion</title>
<sec id="s4-1">
<title>4.1 Why use object-oriented programming</title>
<p>circlizePlus is implemented using object-oriented programming. It is class- and object-centric, with an emphasis on data encapsulation and behavioral reuse. The resulting figure is ultimately determined by the property values of all objects used for drawing, making it easy to maintain and expand.</p>
<p>circlize, on the other hand, is implemented using traditional process-oriented programming, which has functions and processes at its core, and figures are the result of sequential execution of functions. It&#x27;s suitable for running step by step, with each step calling a function and the corresponding changes will be made immediately on the figure. However, when the parameters that need to be adjusted are used by functions that have been called in some previous steps, the user often has to rerun all the previous code. For example, <xref ref-type="fig" rid="F3">Figure 3</xref> can be plotted using either circlize or circirclizePlus. When it comes to adjusting the width of the outermost track, circlizePlus needs to run less code, because circlize needs to rerun the code from scratch. In summary, circlizePlus offers advantages in terms of maintenance and scalability, while circlize is better suited for scenarios that require real-time feedback and single-step commissioning (codes are shown in <xref ref-type="sec" rid="s11">Supplementary File S2</xref>).</p>
</sec>
<sec id="s4-2">
<title>4.2 Example 2: comparison of two pieces of code that use circlizePlus and circlize to implement the same requirements, respectively</title>
<p>In this section, we try to draw pictures from real publications. The literature (<xref ref-type="bibr" rid="B1">Alves et al., 2013</xref>) uses a plot similar to <xref ref-type="fig" rid="F4">Figure 4</xref> to present the VCaP cancer cell line. The outermost ring corresponds to human chromosome ideograms (<xref ref-type="fig" rid="F4">Figure 4A</xref>). It serves as an X-axis to indicate the position of the data of other rings on the chromosome. The inner ring in <xref ref-type="fig" rid="F4">Figure 4B</xref> represents the number of gene copies, and the value of each dot is from the Affymetrix SNP arrays. Its Y-axis range is &#x2212;1 to 1, where dots from 0.15 to 1 are marked in red, dots from &#x2212;0.15 to 0.15 are marked in grey, and dots from &#x2212;1 to 0.15 are marked in green. The inner ring in <xref ref-type="fig" rid="F4">Figure 4C</xref> represents the B-allele frequency (ratio), which ranges from 0 to 1 on the Y-axis. The links plot is used to reflect structural variations (SVs) (<xref ref-type="fig" rid="F4">Figure 4D</xref>). The intra- and inter-chromosomal SVs are on the inner rings and depicted in black and red lines, respectively. The red link lines are obscured by the black link lines because there are quite a few intra-chromosomal SVs. The red link lines have been reduced in scale (<xref ref-type="fig" rid="F4">Figure 4E</xref>) for aesthetic reasons. Combining all of the above plots together gives the picture in the literature (<xref ref-type="fig" rid="F4">Figure 4F</xref>).</p>
<fig id="F4" position="float">
<label>FIGURE 4</label>
<caption>
<p>Figure generated in example 2. <bold>(A)</bold> Chromosome ideograms in humans. <bold>(B)</bold> The outer ring is the chromosome ideograms, and the inner ring is the dot plot, which is used to represent the number of copies of the gene on the corresponding chromosome. <bold>(C)</bold> The inner ring is also a dot plot that is used to represent the B-allele frequency of the corresponding chromosome. <bold>(D)</bold> The inner loop is a linked line diagram that is used to represent structural variations. <bold>(E)</bold> For aesthetic reasons, the red link lines in Figure D have been scaled. <bold>(F)</bold> The resulting diagram obtained by combining all of the above plots.</p>
</caption>
<graphic xlink:href="fgene-16-1535368-g004.tif"/>
</fig>
<p>The process of drawing <xref ref-type="fig" rid="F4">Figure 4</xref> is to draw the graphs of the various categories first, and then put them together. Quite a few researchers use this process to create circos diagrams. Both circlize and circlizePlus implement such a process (codes are shown in <xref ref-type="sec" rid="s11">Supplementary File S3</xref>). According to code statistics, circlizePlus uses less code than circlize in such a process. Code statistics show that circlizePlus uses less code than circlize in such a process (<xref ref-type="table" rid="T1">Table 1</xref>).</p>
<table-wrap id="T1" position="float">
<label>TABLE 1</label>
<caption>
<p>Statistics on the amount of code in Example2.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left"/>
<th align="left">Figure 4A</th>
<th align="left">Figure 4B</th>
<th align="left">Figure 4C</th>
<th align="left">Figure 4D</th>
<th align="left">Figure 4E</th>
<th align="left">Figure 4F</th>
<th align="left">Total</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">The number of lines of code implemented with circlize</td>
<td align="left">3</td>
<td align="left">10</td>
<td align="left">6</td>
<td align="left">6</td>
<td align="left">6</td>
<td align="left">16</td>
<td align="left">48</td>
</tr>
<tr>
<td align="left">The number of lines of code implemented with circlizePlus</td>
<td align="left">2</td>
<td align="left">8</td>
<td align="left">4</td>
<td align="left">4</td>
<td align="left">4</td>
<td align="left">4</td>
<td align="left">28</td>
</tr>
<tr>
<td align="left">The number of characters in the code implemented with circlize (excluding spaces)</td>
<td align="left">118</td>
<td align="left">407</td>
<td align="left">303</td>
<td align="left">277</td>
<td align="left">291</td>
<td align="left">765</td>
<td align="left">2177</td>
</tr>
<tr>
<td align="left">The number of characters in the code implemented with circlizePlus (excluding spaces)</td>
<td align="left">100</td>
<td align="left">329</td>
<td align="left">291</td>
<td align="left">175</td>
<td align="left">189</td>
<td align="left">230</td>
<td align="left">1359</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
</sec>
</body>
<back>
<sec sec-type="data-availability" id="s5">
<title>Data availability statement</title>
<p>Publicly available datasets were analyzed in this study. This data can be found here: <ext-link ext-link-type="uri" xlink:href="https://github.com/tianzelab/circlizePlus">https://github.com/tianzelab/circlizePlus</ext-link> and <ext-link ext-link-type="uri" xlink:href="https://tianzelab.github.io/circlizePlusBook/">https://tianzelab.github.io/circlizePlusBook/</ext-link>.</p>
</sec>
<sec sec-type="author-contributions" id="s6">
<title>Author contributions</title>
<p>ZZ: Software, Funding acquisition, original draft.TC: Conceptualization, Software, Writing&#x2013;original draft. YH: Supervision, Writing&#x2013;review and editing. YX: Funding acquisition, Writing&#x2013;review and editing.</p>
</sec>
<sec sec-type="funding-information" id="s7">
<title>Funding</title>
<p>The author(s) declare that financial support was received for the research and/or publication of this article. This work was supported by the key project of Zhejiang Provincial Natural Science Foundation under grant number LZ23A010002 and the National Training Program of Innovation and Entrepreneurship for Undergraduates of Hangzhou Normal University under grant number 202410346057.</p>
</sec>
<ack>
<p>We are grateful to Dr. Zuguang Gu from DFKZ for his invaluable guidance and support throughout the project.</p>
</ack>
<sec sec-type="COI-statement" id="s8">
<title>Conflict of interest</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
<sec sec-type="ai-statement" id="s9">
<title>Generative AI statement</title>
<p>The author(s) declare that no Gen AI was used in the creation of this manuscript.</p>
</sec>
<sec sec-type="disclaimer" id="s10">
<title>Publisher&#x2019;s note</title>
<p>All claims expressed in this article are solely those of the authors and do not necessarily represent those of their affiliated organizations, or those of the publisher, the editors and the reviewers. Any product that may be evaluated in this article, or claim that may be made by its manufacturer, is not guaranteed or endorsed by the publisher.</p>
</sec>
<sec id="s11">
<title>Supplementary material</title>
<p>The Supplementary Material for this article can be found online at: <ext-link ext-link-type="uri" xlink:href="https://www.frontiersin.org/articles/10.3389/fgene.2025.1535368/full#supplementary-material">https://www.frontiersin.org/articles/10.3389/fgene.2025.1535368/full&#x23;supplementary-material</ext-link>
</p>
<supplementary-material xlink:href="Table1.docx" id="SM1" mimetype="application/docx" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Presentation1.pdf" id="SM2" mimetype="application/pdf" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Table2.docx" id="SM3" mimetype="application/docx" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Table3.docx" id="SM4" mimetype="application/docx" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Presentation2.pdf" id="SM5" mimetype="application/pdf" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Presentation3.pdf" id="SM6" mimetype="application/pdf" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</sec>
<ref-list>
<title>References</title>
<ref id="B1">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Alves</surname>
<given-names>I. T.</given-names>
</name>
<name>
<surname>Hiltemann</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Hartjes</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>van der Spek</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Stubbs</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Trapman</surname>
<given-names>J.</given-names>
</name>
<etal/>
</person-group> (<year>2013</year>). <article-title>Gene fusions by chromothripsis of chromosome 5q in the VCaP prostate cancer cell line</article-title>. <source>Hum. Genet.</source> <volume>132</volume> (<issue>6</issue>), <fpage>709</fpage>&#x2013;<lpage>713</lpage>. <pub-id pub-id-type="doi">10.1007/s00439-013-1308-1</pub-id>
</citation>
</ref>
<ref id="B2">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>An</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Lai</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Sajjanhar</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Batra</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Nelson</surname>
<given-names>C. C.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>J-Circos: an interactive Circos plotter</article-title>. <source>Bioinformatics</source> <volume>31</volume> (<issue>9</issue>), <fpage>1463</fpage>&#x2013;<lpage>1465</lpage>. <pub-id pub-id-type="doi">10.1093/bioinformatics/btu842</pub-id>
</citation>
</ref>
<ref id="B3">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Cheong</surname>
<given-names>W.-H.</given-names>
</name>
<name>
<surname>Tan</surname>
<given-names>Y.-C.</given-names>
</name>
<name>
<surname>Yap</surname>
<given-names>S.-J.</given-names>
</name>
<name>
<surname>Ng</surname>
<given-names>K.-P.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>ClicO FS: an interactive web-based service of Circos</article-title>. <source>Bioinformatics</source> <volume>31</volume> (<issue>22</issue>), <fpage>3685</fpage>&#x2013;<lpage>3687</lpage>. <pub-id pub-id-type="doi">10.1093/bioinformatics/btv433</pub-id>
</citation>
</ref>
<ref id="B4">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Cui</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Luo</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Fan</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Luo</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>He</surname>
<given-names>S.</given-names>
</name>
<etal/>
</person-group> (<year>2016</year>). <article-title>BioCircos.js: an interactive Circos JavaScript library for biological data visualization on web applications</article-title>. <source>Bioinformatics</source> <volume>32</volume> (<issue>11</issue>), <fpage>1740</fpage>&#x2013;<lpage>1742</lpage>. <pub-id pub-id-type="doi">10.1093/bioinformatics/btw041</pub-id>
</citation>
</ref>
<ref id="B5">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Cui</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Cui</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Hao</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Shi</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>D.</given-names>
</name>
<etal/>
</person-group> (<year>2020</year>). <article-title>NG-Circos: next-generation Circos for data visualization and interpretation</article-title>. <source>Nar Genomics Bioinforma.</source> <volume>2</volume> (<issue>3</issue>), <fpage>lqaa069</fpage>. <pub-id pub-id-type="doi">10.1093/nargab/lqaa069</pub-id>
</citation>
</ref>
<ref id="B6">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Cui</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Cui</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Zang</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>Y.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>interacCircos: an R package based on JavaScript libraries for the generation of interactive circos plots</article-title>. <source>Bioinformatics</source> <volume>37</volume> (<issue>20</issue>), <fpage>3642</fpage>&#x2013;<lpage>3644</lpage>. <pub-id pub-id-type="doi">10.1093/bioinformatics/btab232</pub-id>
</citation>
</ref>
<ref id="B7">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Darzentas</surname>
<given-names>N.</given-names>
</name>
</person-group> (<year>2010</year>). <article-title>Circoletto: visualizing sequence similarity with Circos</article-title>. <source>Bioinformatics</source> <volume>26</volume> (<issue>20</issue>), <fpage>2620</fpage>&#x2013;<lpage>2621</lpage>. <pub-id pub-id-type="doi">10.1093/bioinformatics/btq484</pub-id>
</citation>
</ref>
<ref id="B8">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Diaz-Garcia</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Covarrubias-Pazaran</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Schlautman</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Zalapa</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2017</year>). <article-title>SOFIA: an R package for enhancing genetic visualization with circos</article-title>. <source>J. Hered.</source> <volume>108</volume> (<issue>4</issue>), <fpage>443</fpage>&#x2013;<lpage>448</lpage>. <pub-id pub-id-type="doi">10.1093/jhered/esx023</pub-id>
</citation>
</ref>
<ref id="B9">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Drori</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Levy</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Smirin-Yosef</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Rahimi</surname>
<given-names>O.</given-names>
</name>
<name>
<surname>Salmon-Divon</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2017</year>). <article-title>CircosVCF: circos visualization of whole-genome sequence variations stored in VCF files</article-title>. <source>Bioinformatics</source> <volume>33</volume> (<issue>9</issue>), <fpage>1392</fpage>&#x2013;<lpage>1393</lpage>. <pub-id pub-id-type="doi">10.1093/bioinformatics/btw834</pub-id>
</citation>
</ref>
<ref id="B10">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ennis</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Broin</surname>
<given-names>P. O.</given-names>
</name>
<name>
<surname>Szegezdi</surname>
<given-names>E.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>CCPlotR: an R package for the visualization of cell-cell interactions</article-title>. <source>Bioinforma. Adv.</source> <volume>3</volume> (<issue>1</issue>), <fpage>vbad130</fpage>. <pub-id pub-id-type="doi">10.1093/bioadv/vbad130</pub-id>
</citation>
</ref>
<ref id="B11">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Gu</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Gu</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Eils</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Schlesner</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Brors</surname>
<given-names>B.</given-names>
</name>
</person-group> (<year>2014</year>). <article-title>Circlize implements and enhances circular visualization in R</article-title>. <source>Bioinformatics</source> <volume>30</volume> (<issue>19</issue>), <fpage>2811</fpage>&#x2013;<lpage>2812</lpage>. <pub-id pub-id-type="doi">10.1093/bioinformatics/btu393</pub-id>
</citation>
</ref>
<ref id="B12">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Krzywinski</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Schein</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Birol</surname>
<given-names>I.</given-names>
</name>
<name>
<surname>Connors</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Gascoyne</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Horsman</surname>
<given-names>D.</given-names>
</name>
<etal/>
</person-group> (<year>2009</year>). <article-title>Circos: an information aesthetic for comparative genomics</article-title>. <source>Genome Res.</source> <volume>19</volume> (<issue>9</issue>), <fpage>1639</fpage>&#x2013;<lpage>1645</lpage>. <pub-id pub-id-type="doi">10.1101/gr.092759.109</pub-id>
</citation>
</ref>
<ref id="B13">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Marx</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Coon</surname>
<given-names>J. J.</given-names>
</name>
</person-group> (<year>2019</year>). <article-title>MS-Helios: a Circos wrapper to visualize multi-omic datasets</article-title>. <source>Bmc Bioinforma.</source> <volume>20</volume>, <fpage>21</fpage>. <pub-id pub-id-type="doi">10.1186/s12859-018-2564-9</pub-id>
</citation>
</ref>
<ref id="B14">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Rasche</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Hiltemann</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2020</year>). <article-title>Galactic circos: user-friendly circos plots within the galaxy platform</article-title>. <source>Gigascience</source> <volume>9</volume> (<issue>6</issue>), <fpage>giaa065</fpage>. <pub-id pub-id-type="doi">10.1093/gigascience/giaa065</pub-id>
</citation>
</ref>
<ref id="B15">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Wickham</surname>
<given-names>H.</given-names>
</name>
</person-group> (<year>2016</year>). <source>ggplot2: elegant graphics for data analysis</source>. <publisher-loc>New York</publisher-loc>: <publisher-name>Springer-Verlag</publisher-name>.</citation>
</ref>
<ref id="B16">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yu</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Ouyang</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Yao</surname>
<given-names>W.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>shinyCircos: an R/Shiny application for interactive creation of Circos plot</article-title>. <source>Bioinformatics</source> <volume>34</volume> (<issue>7</issue>), <fpage>1229</fpage>&#x2013;<lpage>1231</lpage>. <pub-id pub-id-type="doi">10.1093/bioinformatics/btx763</pub-id>
</citation>
</ref>
<ref id="B17">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Meltzer</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Davis</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2013</year>). <article-title>RCircos: an R package for Circos 2D track plots</article-title>. <source>Bmc Bioinforma.</source> <volume>14</volume>, <fpage>244</fpage>. <pub-id pub-id-type="doi">10.1186/1471-2105-14-244</pub-id>
</citation>
</ref>
</ref-list>
</back>
</article>