Shiny App. Idiograms with Marks and Karyotype Indices downloads 10.5281/zenodo.3579417

Buy Me a Coffee at

The goal of idiogramFISH is to plot idiograms of karyotypes, plasmids and circ. chr. having a set of data.frames for chromosome data and optionally marks’ data (plotIdiograms function) (Roa and PC Telles, 2021). Idiograms can also be plotted in concentric circles. Separated chromatids can be visible when not in a circular plot.

Six styles of marks are available: square (squareLeft), dots, cM (cMLeft), cenStyle, upArrow (downArrow), exProtein (inProtein); its legend (label) can be drawn inline or to the right of karyotypes. Three styles of centromere are available: rounded, triangular and internal (inProtein). It is possible to calculate also chromosome and karyotype indexes (Romero-Zarco, 1986; Watanabe et al., 1999) and classify chromosome morphology in the categories of Levan (1964), and Guerra (1986).

IdiogramFISH was written in R (R Core Team, 2019) and also uses crayon (Csárdi, 2017), tidyr (Wickham and Henry, 2020), plyr (Wickham, 2011) and dplyr packages (Wickham et al., 2019a). Documentation was written with R-packages roxygen2 (Wickham et al., 2018), usethis (Wickham and Bryan, 2019), bookdown (Xie, 2016), knitr (Xie, 2015), pkgdown (Wickham and Hesselberth, 2019), Rmarkdown (Xie et al., 2018), rvcheck (Yu, 2019a), badger (Yu, 2019b), kableExtra (Zhu, 2019), rmdformats (Barnier, 2020) and RCurl (Temple Lang and CRAN team, 2019). For some vignette figures, packages rentrez (Winter, 2017), phytools (Revell, 2012), ggtree (Yu et al., 2018), ggplot2 (Wickham, 2016) and ggpubr (Kassambara, 2019) were used.

In addition, the shiny app runBoard() uses shiny (Chang et al., 2021), shinydashboard (Chang and Borges Ribeiro, 2018), rhandsontable (Owen, 2018), gtools (Warnes et al., 2020), rclipboard (Bihorel, 2021).


You can install idiogramFISH from CRAN with:


Windows users: To avoid installation of packages in OneDrive

.libPaths("D:R/lib") # for example
.libPaths()          # set or read libraries

To do that permanently: Search (magnifier) “environment variables” and set R_LIBS_USER to D:\R\lib (example)

Other option: something in the line of this

Devel. version of idiogramFISH

From gitlab with devtools (Wickham et al., 2019b)

Attention windows users, please install Rtools and git (compilation tools).

Vignettes (optional) use a lua filter, so you would need pandoc ver. > 2. and pandoc-citeproc or citeproc. RStudio comes with pandoc. rmarkdown::pandoc_version()

# This installs package devtools, necessary for installing the dev version

url <- ""

# Packages for vignettes: (optional)
list.of.packages <- c(
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

# Linux with vignettes and Windows
devtools::install_git(url = url,build_vignettes = TRUE, force=TRUE)

# Mac with vignettes
devtools::install_git(url = url, build_opts=c("--no-resave-data","--no-manual") )
Installing in system terminal
# clone repository:
git clone ""

R CMD build idiogramFISH
# install
R CMD INSTALL idiogramFISH_*.tar.gz



CRAN archive

Download history

Need help?

Manual in Bookdown style

Documentation in Pkgdown style



Launch vignettes from R for the installed version:



To cite idiogramFISH in publications, please use:

Roa F, Telles MPC (2021) idiogramFISH: Shiny app. Idiograms with Marks and Karyotype Indices, Universidade Federal de Goiás. Brazil. R-package. version 2.0.5 doi:10.5281/zenodo.3579417

To write citation to file:



Fernando Roa
Mariana PC Telles

Working online

For Shiny App in the cloud availability, please check this chapter in the online version

Each chapter has a jupyter version. A jupyter notebook seems an interactive vignette.

They are hosted in github

They can be accessed with google colab to work online.

Colab Github   Raw
3 Minimal examples link Raw
4 Plotting chromosomes link Raw
5 Multiple OTUs link Raw
6 Changing units link Raw
7 GISH link Raw
8 Groups link Raw
9 Circular Plots link Raw
10 Plotting alongside phylogeny link Raw
11 Citrus link Raw
12 Human Karyotype link Raw

Chapers can be accessed locally in your jupyter-lab or jupyter notebook

After installing jupyter, you can install the R kernel with:


Shiny App

Attention windows users, might require the last R version to plot correctly.


Basic examples

1 How to plot a karyotype:

Define your plotting window size with something like par(pin=c(10,6)), or with svg(), png(), etc. Add chromosome morphology according to Guerra (1986) or (Levan et al., 1964)


data(dfOfChrSize) # chromsome data
data(dfMarkColor) # mark general data
data(dfOfMarks2)  # mark position data (inc. cen.)

dfOfMarks2[which(dfOfMarks2$markName=="5S"),]$markSize<-0.8 # modif. of mark size

# column Mbp not for plotting purposes

opar <- par(no.readonly = TRUE)      # make a copy of current settings if you want to restore them later
#par(opar) # recover par


plotIdiograms(dfChrSize=dfOfChrSize,    # data.frame of chr. size
              dfMarkColor=dfMarkColor,  # d.f of mark style <- Optional
              dfMarkPos=dfOfMarks2,     # df of mark positions (includes cen. marks)
              karHeight=5,              # kar. height
              chrWidth = 1.2,           # chr. width
              chrSpacing = 1,           # space among chr.
              morpho="Guerra",          # chr. morpho. classif. (Guerra, Levan, both, "" ) ver. >= 1.12 only
              chrIndex="CI",            # cen. pos. (CI, AR, both, "" ) ver. >= 1.12 only
              chrSize = TRUE,           # add chr. sizes under chr.
              chrSizeMbp = TRUE,        # add Mbp sizes under chr. (see above)
              rulerPos= 0,              # position of ruler
              ruler.tck=-0.01,          # size and orientation of ruler ticks
              rulerNumberSize=.8        # font size of rulers
              ,xPosRulerTitle = 3             # ruler units (title) pos.
              ,legendWidth=1            # width of legend items
              ,fixCenBorder = TRUE      # use chrColor as border color of cen. or cen. marks
              ,distTextChr = 1.2        # chr. text separation
              ,xlimLeftMod = 2          # xlim left param.
              ,ylimBotMod = 0           # modify ylim bottom argument
              ,ylimTopMod = 0           # modify ylim top argument
); # # close svg()

Let’s explore the data.frames for monocentrics:

chrName shortArmSize longArmSize Mbp
1 3 4 700
2 4 5 900
3 2 3 500
X 1 2 300
markName markColor style
5S red dots
45S chartreuse3 square
DAPI blue square
CMA darkgoldenrod1 square

p, q and w marks can have empty columns markDistCen and markSize since v. 1.9.1 to plot whole arms (p, q) and whole chr. w.

chrName markName chrRegion markSize markDistCen
1 5S p 0.8 0.5
1 45S q 1.0 0.5
X 45S p NA NA
3 DAPI q 1.0 1.0
1 DAPI cen NA NA

2 How to plot a karyotype of holocentrics:


# column Mbp not for plotting purposes

# svg("testing.svg",width=14,height=8 )
par(mar = c(0, 0, 0, 0), omi=rep(0,4) )

plotIdiograms(dfChrSize  =dfChrSizeHolo, # data.frame of chr. size
              dfMarkColor=dfMarkColor,   # df of mark style
              dfMarkPos  =dfMarkPosHolo, # df of mark positions
              addOTUName=FALSE,        # do not add OTU names
              distTextChr = 1,         # chr. name distance to chr.
              chrSize = TRUE,          # show chr. size under chr.
              chrSizeMbp = TRUE,       # show chr. size in Mbp under chr. requires Mbp column
              rulerPos=-.4,            # position of ruler
              rulerNumberPos=.9,       # position of numbers of rulers
              xPosRulerTitle= 4.5            # ruler units (title) horizon. pos. 
              ,xlimLeftMod=2           # modify xlim left argument of plot
              ,ylimBotMod=.2           # modify ylim bottom argument of plot
              ,legendHeight=.5         # height of legend labels
              ,legendWidth = 1.2       # width of legend labels
              ,xModifier = 20        # separ. among chromatids
); # # close svg()

Let’s explore the data.frames for holocentrics:

chrName chrSize Mbp OTU
1 3 300 Species holo
2 4 400 Species holo
3 2 200 Species holo
4 5 500 Species holo
markName markColor style
5S red dots
45S chartreuse3 square
DAPI blue square
CMA darkgoldenrod1 square
chrName markName markPos markSize OTU
3 5S 1.0 0.5 Species holo
3 DAPI 1.5 0.5 Species holo
1 45S 2.0 0.5 Species holo
2 DAPI 2.0 0.5 Species holo
4 CMA 2.0 0.5 Species holo
4 5S 0.5 0.5 Species holo

3. Plotting both mono. and holo.

See vignettes for a circular version.

Merge data.frames with plyr (Wickham, 2011)

# chromsome data, if only 1 species, column OTU is optional
dfOfChrSize$OTU   <- "Species mono"
dfChrSizeHolo$OTU <- "Species holo"
monoholoCS <- plyr::rbind.fill(dfOfChrSize,dfChrSizeHolo)

dfOfMarks2$OTU     <-"Species mono"
dfMarkPosHolo$OTU <-"Species holo"

monoholoMarks <- plyr::rbind.fill(dfOfMarks2,dfMarkPosHolo)
   chrName markName chrRegion markSize markDistCen          OTU markPos
1        1       5S         p      0.5         0.5 Species mono      NA
2        1      45S         q      1.0         0.5 Species mono      NA
3        X      45S         p       NA          NA Species mono      NA
4        3     DAPI         q      1.0         1.0 Species mono      NA
5        1     DAPI       cen       NA          NA Species mono      NA
6        X      CMA       cen       NA          NA Species mono      NA
7        3       5S      <NA>      0.5          NA Species holo     1.0
8        3     DAPI      <NA>      0.5          NA Species holo     1.5
9        1      45S      <NA>      0.5          NA Species holo     2.0
10       2     DAPI      <NA>      0.5          NA Species holo     2.0
11       4      CMA      <NA>      0.5          NA Species holo     2.0
12       4       5S      <NA>      0.5          NA Species holo     0.5

# svg("testing.svg",width=10,height=6 )
plotIdiograms(dfChrSize  = monoholoCS,   # data.frame of chr. size
              dfMarkColor= dfMarkColor,  # df of mark style
              dfMarkPos  = monoholoMarks,# df of mark positions, includes cen. marks
              chrSize = TRUE,            # show chr. size under chr.
              squareness = 4,            # vertices squareness
              roundedCen = FALSE,        # triangular cen.
              addOTUName = TRUE,         # add OTU names
              OTUTextSize = .7,          # font size of OTU
              distTextChr = 0.7,         # separ. among chr. and text and among chr. name and indices
              karHeiSpace = 4,           # karyotype height inc. spacing
              karIndexPos = .2,          # move karyotype index
              legendHeight= 1,           # height of legend labels
              legendWidth = 1,           # width of legend labels
              fixCenBorder = TRUE,       # use chrColor as border color of cen. or cen. marks
              rulerPos= 0,               # position of ruler
              ruler.tck=-0.02,           # size and orientation of ruler ticks
              rulerNumberPos=.9,         # position of numbers of rulers
              xPosRulerTitle= 4,               # ruler units (title) pos.
              xlimLeftMod=1,             # modify xlim left argument of plot
              xlimRightMod=3,            # modify xlim right argument of plot
              ylimBotMod= .2             # modify ylim bottom argument of plot
              ,chromatids=FALSE          # do not show separ. chromatids
              # for Circular Plot, add:
              # ,useOneDot=TRUE
              # ,circularPlot = TRUE       # circularPlot
              # ,shrinkFactor = .9         # percentage 1 = 100% of circle with chr.
              # ,circleCenter = 3          # X coordinate of circleCenter (affects legend pos.)
              # ,chrLabelSpacing = .9      # chr. names spacing
              # ,OTUsrt = 0                # angle for OTU name (or number)
              # ,OTUplacing = "number"     # Use number and legend instead of name
              # ,OTULabelSpacerx = -0.6    # modify position of OTU label, when OTUplacing="number" or "simple"
              # ,OTUlegendHeight = 1.5     # space among OTU names when in legend - OTUplacing
              # ,separFactor = 0.75        # alter separ. of kar.
); # # close svg()


Guerra M. 1986. Reviewing the chromosome nomenclature of Levan et al. Brazilian Journal of Genetics, 9(4): 741–743

Levan A, Fredga K, Sandberg AA. 1964. Nomenclature for centromeric position on chromosomes Hereditas, 52(2): 201–220.

Romero-Zarco C. 1986. A new method for estimating karyotype asymmetry Taxon, 35(3): 526–530.

Watanabe K, Yahara T, Denda T, Kosuge K. 1999. Chromosomal evolution in the genus Brachyscome (Asteraceae, Astereae): statistical tests regarding correlation between changes in karyotype and habit using phylogenetic information Journal of Plant Research, 112: 145–161.


Csárdi G. 2017. Crayon: Colored terminal output. R package version 1.3.4.

Kassambara A. 2019. Ggpubr: ’ggplot2’ based publication ready plots. R package version 0.2.3.

R Core Team. 2019. R: A language and environment for statistical computing R Foundation for Statistical Computing, Vienna, Austria.

Revell LJ. 2012. Phytools: An r package for phylogenetic comparative biology (and other things). Methods in Ecology and Evolution, 3: 217–223.

Roa F, PC Telles M. 2021. idiogramFISH: Shiny app. Idiograms with marks and karyotype indices Universidade Federal de Goiás, UFG, Goiânia. R-package. version 2.0.0.

Wickham H. 2011. The split-apply-combine strategy for data analysis Journal of Statistical Software, 40(1): 1–29.

Wickham H. 2016. ggplot2: Elegant graphics for data analysis Springer-Verlag New York.

Wickham H, François R, Henry L, Müller K. 2019a. Dplyr: A grammar of data manipulation. R package version 0.8.3.

Wickham H, Henry L. 2020. Tidyr: Tidy messy data. R package version 1.0.2.

Wickham H, Hester J, Chang W. 2019b. Devtools: Tools to make developing r packages easier. R package version 2.2.1.

Winter DJ. 2017. rentrez: An r package for the NCBI eUtils API The R Journal, 9: 520–526

Yu G, Lam TT-Y, Zhu H, Guan Y. 2018. Two methods for mapping and visualizing associated data on phylogeny using ggtree. Molecular Biology and Evolution, 35: 3041–3043.

Shiny App

Bihorel S. 2021. Rclipboard: Shiny/r wrapper for clipboard.js. R package version 0.1.3.

Chang W, Borges Ribeiro B. 2018. Shinydashboard: Create dashboards with shiny. R package version 0.7.1.

Chang W, Cheng J, Allaire J, Sievert C, Schloerke B, Xie Y, Allen J, McPherson J, Dipert A, Borges B. 2021. Shiny: Web application framework for r. R package version 1.6.0.

Owen J. 2018. Rhandsontable: Interface to the handsontable.js library. R package version 0.3.7.

Warnes GR, Bolker B, Lumley T. 2020. Gtools: Various r programming tools. R package version 3.8.2.


Barnier J. 2020. Rmdformats: HTML output formats and templates for ’rmarkdown’ documents. R package version 0.3.7.

Temple Lang D, CRAN team the. 2019. RCurl: General network (HTTP/FTP/…) Client interface for r. R package version 1.95-4.12.

Wickham H, Bryan J. 2019. Usethis: Automate package and project setup. R package version 1.5.1.

Wickham H, Danenberg P, Eugster M. 2018. roxygen2: In-line documentation for r. R package version 6.1.1.

Wickham H, Hesselberth J. 2019. Pkgdown: Make static HTML documentation for a package. R package version 1.4.1.

Xie Y. 2015. Dynamic documents with R and knitr Chapman; Hall/CRC, Boca Raton, Florida. ISBN 978-1498716963.

Xie Y. 2016. Bookdown: Authoring books and technical documents with R markdown Chapman; Hall/CRC, Boca Raton, Florida. ISBN 978-1138700109.

Xie Y, Allaire JJ, Grolemund G. 2018. R markdown: The definitive guide Chapman; Hall/CRC, Boca Raton, Florida. ISBN 9781138359338.

Yu G. 2019b. Badger: Badge for r package. R package version 0.0.6.

Yu G. 2019a. Rvcheck: R/package version check. R package version 0.1.6.

Zhu H. 2019. kableExtra: Construct complex table with ’kable’ and pipe syntax. R package version 1.1.0.