Matrix plots

After importing fanc.plotting as fancplot, we have access to a range of Hi-C (and related) matrix plots. We already used the TriangularHicPlot as an example in Plotting API basics. In total there are four types of matrix visualisation built in to FAN-C:

  • SquareHicPlot, which shows a square matrix, with colors typically representing contact strength between the two genomic regions on the X, and Y axes, respectively.
  • TriangularHicPlot, which rotates the matrix by 45 degrees, so instead of a square, it now becomes a triangle. This can be particularly useful if features close to the matrix diagonal, such as TADs, are of interest, and if additional genomic tracks, such as CTCF binding, should be shown underneath
  • SplitMatrixPlot, which is similar to the SquareHicPlot, but the values above and below the diagonal are from different matrices. This is a great way for direct matrix feature comparisons in the same plot.
  • MirrorMatrixPlot, which can be used to show two matrix plots, particularly of the type TriangularHicPlot, mirrored at the X axis

All of these are built on the base class BasePlotterMatrix, so they share of lot of options and functionality. Let’s look at each of them in turn.

Square matrix

To generate a basic square matrix plot, run

hp = fancplot.SquareMatrixPlot(hic)
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_square.png

Currently, the diagonal is about the only thing visible in this example, so let’s adjust the saturation of the plot with vmax (vmin can be used to set a lower bound)

To generate a basic square matrix plot, run

hp = fancplot.SquareMatrixPlot(hic, vmax=0.05)
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_square_vmax.png

FAN-C uses the custom “germany” colormap as a default, built using the colormap scripts from Stéfan van der Walt and Nathaniel Smith, which have also been used to generate the default matplotlib colormaps. It is “perceptually uniform”, and thus well-suited to represent contact intensities. We are also including a colormap called “white_red”, for a more classic Hi-C matrix look, but equally perceptually uniform:

hp = fancplot.SquareMatrixPlot(hic, vmax=0.05, colormap='white_red')
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_square_cmap.png

Any Matplotlib-compatible colormap can be used to change the look of your matrix. You can remove the colorbar, for example if you want to add your own on a different axis, using show_colorbar=False. Alternatively, if you have set up your axes manually, you can move the colorbar to an axis of your choice using cax=<your axis> in the constructor.

The exponential decay of contact intensities with distance between any two loci can sometimes make it difficult to visualise features close to the diagonal and far fro it simultaneously. Sometimes showing colors on a log scale can improve this:

hp = fancplot.SquareMatrixPlot(hic, vmax=0.05, norm='log')
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_square_log.png

You can show uncorrected values using matrix_norm=False (note the color scale change):

hp = fancplot.SquareMatrixPlot(hic, vmax=30, matrix_norm=False)
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_square_uncorrected.png

We can also show log2 observed/expected values using oe=True and log=True When not setting the colorbar limit explicitly, you can also make the colorbar symmetrical around 0 using colorbar_symmetry=0. We will also use a divergent colormap:

hp = fancplot.SquareMatrixPlot(hic, vmin=-2, vmax=2, oe=True, log=True,
                               colormap='RdBu_r')
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_square_oe.png

Triangular matrix

Any of the above customisations also work for the triangular version of the matrix plot, TriangularHicPlot.

hp = fancplot.TriangularMatrixPlot(hic, vmax=0.05)
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_triangular.png

Additionally, we can control the height, at which the triangle is cut off, and therefore the maximum distance at which contacts are shown between two regions, with max_dist. This value is expressed in base pairs, but supports strings in genomic format:

hp = fancplot.TriangularMatrixPlot(hic, vmax=0.05, max_dist='2mb')
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_triangular_maxdist.png

Split matrix

The SplitMatrixPlot requires two Hi-C objects, one for above, and one for below the diagonal. Unless you explicitly set scale_matrices to False, the plot will first scale both matrices to the same sequencing depth, in order to make them more comparable. Depending on your normalisation, this may not be necessary.

Mirrored plot

To showcase the MirrorMatrixPlot, we can plot the Hi-C matrix, and its O/E transformation at the same time:

# first create two triangular plots
top_plot = fancplot.TriangularMatrixPlot(hic, vmax=0.05, max_dist='2mb')
bottom_plot = fancplot.TriangularMatrixPlot(hic, vmin=-2, vmax=2, oe=True, log=True, colormap='RdBu_r', max_dist='2mb')
# then merge them
hp = fancplot.MirrorMatrixPlot(top_plot, bottom_plot)
hp.plot('chr18:6mb-10mb')
hp.show()
../../_images/plot_mirror.png

Opposed to Split matrix, it is also possible to combine matrices of different resolution, or from different Hi-C experiments, as long as they are from the same organism.