Sequence dotplots in R

By: Avril Coghlan.

Adapted, edited and expanded: Nathan Brouwer under the Creative Commons 3.0 Attribution License (CC BY 3.0).

NOTE: I’ve added some new material that is rather terse and lacks explication.

Good sources of more info: https://omicstutorials.com/interpreting-dot-plot-bioinformatics-with-an-example/

http://resources.qiagenbioinformatics.com/manuals/clcgenomicsworkbench/650/Examples_interpretations_dot_plots.html

As a first step in comparing two protein, RNA or DNA sequences, it is a good idea to make a dotplot. A dotplot is a graphical method that allows the comparison of two protein or DNA sequences and identify regions of close similarity between them. A dotplot is essentially a two-dimensional matrix (like a grid), which has the sequences of the proteins being compared along the vertical and horizontal axes.

In order to make a simple dotplot to represent of the similarity between two sequences, individual cells in the matrix can be shaded black if residues are identical, so that matching sequence segments appear as runs of diagonal lines across the matrix. Identical proteins will have a line exactly on the main diagonal of the dotplot, that spans across the whole matrix.

For proteins that are not identical, but share regions of similarity, the dotplot will have shorter lines that may be on the main diagonal, or off the main diagonal of the matrix. In essence, a dotplot will reveal if there are any regions that are clearly very similar in two protein (or DNA) sequences.

Preliminaries

library(compbio4all)
library(rentrez)

Visualzing two identical sequences

To help build our intuition about dotplots we’ll first look at some artificial examples. First, we’ll see what happens when we make a dotplot comparing the alphabet versus itself. The build-in LETTERS object in R contains the alphabet from A to Z. This is a sequence with no repeats.

#LETTERS
seqinr::dotPlot(LETTERS ,  LETTERS ) # add code

What we get is a perfect diagonal line.

Visualizing repeats

TODO: explain this Expanding the dot plot by making an object that is double the size of the previous chunk and using that as the parameters for the new plot.

LETTERS.2.times  <- c(LETTERS, LETTERS)# add code
length(LETTERS.2.times)
## [1] 52
seqinr::dotPlot(LETTERS.2.times, 
                LETTERS.2.times)

TODO: explain this Once again expanding the plot but this time by 3 times. The axis’ length went from 52 to now 78 and we see even more off diagnols.

LETTERS.3.times  <- c(LETTERS, LETTERS, LETTERS) # add code

seqinr::dotPlot(LETTERS.3.times, 
                LETTERS.3.times) # add code

TODO: explain this Creating another object that is essentially the seq.repeat but is pasted multiple times over

seq.repeat <- c("A","C","D","E","F","G","H","I")

# add code
# rep() function ; 2 arguments: vector and # of repeats
seq1 <- rep(seq.repeat, 3)

Make the dotplot:

# add code
seqinr::dotPlot(seq1, seq1)

TODO: Add title

TODO: explain this

“invert” means “inversion” We are making a dot plot with 1 normal alphabet sequence, 1 reversed full alphabet sequence, and then another normal full alphabet sequence. All of those get put into one plot and this causes a different looking tandem repeat.

LETTERS.3.times.with.invert <- c(LETTERS, rev(LETTERS), LETTERS) # add code

seqinr::dotPlot(LETTERS.3.times.with.invert, LETTERS.3.times.with.invert)# add code

TODO: explain this

TODO: explain this Making a dot plot with translocation within the data of the letters by selecting specific parts of the alphabet for the different segments of the sequence.

seg1 <- LETTERS[1:8]
seg2 <- LETTERS[9:18] # add code
seg3 <- LETTERS[18:26] # add code

# wt c(seg1, seg2, seg3)
#translocation
LETTERS.with.transloc <-  c(seg1, seg3, seg2)# add  code

seqinr::dotPlot(LETTERS.with.transloc, LETTERS.with.transloc)  # add code

TODO: add title

TODO: explain this This is going through the aplhabet and choosing one random letter. This happens 26 times for the sample and in the chunk right below this, we have replacement, so that means some letters will be randomly chosen more than once while others may not even get chosen at all since not every letter has to be represented.

sample(x = LETTERS, size = 26, replace = T)
##  [1] "H" "M" "J" "O" "G" "Z" "U" "I" "X" "V" "A" "Y" "H" "M" "I" "G" "Q" "E" "M"
## [20] "I" "W" "V" "A" "U" "H" "O"
letters.rand1 <- sample(x = LETTERS, size = 26, replace = F)# add code
letters.rand2 <- sample(x = LETTERS, size = 26, replace = F)# add code


seqinr::dotPlot(letters.rand1, letters.rand2
                )# add code

Download sequences

Now we’ll make a real dotplot of the chorismate lyase proteins from two closely related species, Mycobacterium leprae and Mycobacterium ulcerans.

Note - these are protein sequences so db = “protein”

TODO: briefly summarize these steps Getting the sequences for two different proteins and then cleaning them using fasta_cleaner

# sequence 1: Q9CD83
leprae_fasta <- rentrez::entrez_fetch(db = "protein",# add code
                        id = "Q9CD83",
                         rettype = "fasta")
# sequence 2: OIN17619.1
ulcerans_fasta <- rentrez::entrez_fetch(db ="protein", # add code
                         id = "OIN17619.1",
                         rettype = "fasta")

# add code
leprae_vector   <- compbio4all::fasta_cleaner(leprae_fasta) # add code
ulcerans_vector <- compbio4all::fasta_cleaner(ulcerans_fasta) # add code

TODO: Mycobacterium leprae v. Mycobacterium ulcerans Dot Plot

We can create a dotplot for two sequences using the dotPlot() function in the seqinr package.

First, let’s look at a dotplot created using only a single sequence. This is frequently done to investigate a sequence for the presence of repeats.

(Note - and older version of this exercise stated this kind of anlysis wasn’t normally done; this was written last year before I knew of the use of dotplots for investigating sequence repeats.)

seqinr::dotPlot(leprae_vector, leprae_vector)

seqinr::dotPlot(leprae_vector, ulcerans_vector)# add code

TODO: briefly explain the main pattern Main pattern is a line of identity between the proteins showing that they have a very similar base structure.

In the dotplot above, the M. leprae sequence is plotted along the x-axis (horizontal axis), and the M. ulcerans sequence is plotted along the y-axis (vertical axis). The dotplot displays a dot at points where there is an identical amino acid in the two sequences.

For example, if amino acid 53 in the M. leprae sequence is the same amino acid (eg. “W”) as amino acid 70 in the M. ulcerans sequence, then the dotplot will show a dot the position in the plot where x =50 and y =53.

In this case you can see a lot of dots along a diagonal line, which indicates that the two protein sequences contain many identical amino acids at the same (or very similar) positions along their lengths. This is what you would expect, because we know that these two proteins are homologs (related proteins) because they share a close evolutionary history.