##############################################################################
# PyLipID: A python module for analysing protein-lipid interactions
#
# Author: Wanling Song
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
##############################################################################
"""This module contains functions for 2D plot.
"""
import os
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
__all__ = ["plot_corrcoef"]
[docs]def plot_corrcoef(corrcoef, residue_index, cmap="Reds", vmin=None, vmax=None,
fn=None, title=None, fig_close=False):
"""Plot correlation coefficient matrix.
Parameters
----------
corrcoef : array_like
A scalar 2D array of correlation coefficient matrix.
residue_index : array_list, optional, default=None
A 1D array of residue index.
cmap : str or `matplotlib.colors.Colormap`, optional, default="coolwarm"
A Colormap instance or matplotlib register colormap name. The
colormap maps *corrcoef* to colors.
fn : str, optional, default=None
Figure name. By default the figure is saved as "Figure_corrcoef.pdf" as the current
working directory.
title : str, optional, default=None
Figure title.
fig_close : bool, optional, default=False
Use plt.close() to close the figure. Can be used to save memory if many figures are opened.
"""
plt.rcParams["font.size"] = 10
plt.rcParams["font.weight"] = "bold"
if fn is None:
fn = os.path.join(os.getcwd(), "Figure_Correlation_Matrix.pdf")
if len(corrcoef) <= 20:
fig, ax = plt.subplots(1, 1, figsize=(2.5, 1.8))
majorlocator = 5
minorlocator = 1
elif 20 < len(corrcoef) <= 50:
fig, ax = plt.subplots(1, 1, figsize=(2.9, 2.0))
majorlocator = 10
minorlocator = 1
elif 50 < len(corrcoef) <= 500:
fig, ax = plt.subplots(1, 1, figsize=(4.9, 3.5))
majorlocator = 50
minorlocator = 10
elif 500 <= len(corrcoef) < 1000:
fig, ax = plt.subplots(1, 1, figsize=(5.9, 4.5))
majorlocator = 100
minorlocator = 10
elif 1000 <= len(corrcoef) < 2000:
fig, ax = plt.subplots(1, 1, figsize=(7.9, 6.5))
majorlocator = 200
minorlocator = 20
elif len(corrcoef) >= 2000:
fig, ax = plt.subplots(1, 1, figsize=(8.9, 7.5))
majorlocator = 500
minorlocator = 100
# sort index, check duplicates in residue index.
majorticks = []
minorticks = []
ticklabels = []
breaks = []
for idx, resi in enumerate(residue_index):
if not resi%majorlocator:
majorticks.append(idx-0.5)
ticklabels.append(resi)
elif not resi%minorlocator:
minorticks.append(idx-0.5)
if idx > 0 and resi - residue_index[idx-1] != 1:
breaks.append(idx-0.5)
x = y = np.arange(len(residue_index)+1, dtype=float)
x -= 0.5
y -= 0.5
corrcoef = np.nan_to_num(corrcoef)
if vmax is None:
vmax = np.percentile(np.unique(np.ravel(corrcoef)), 99)
if vmin is None:
vmin = np.percentile(np.unique(np.ravel(corrcoef)), 1)
pcm = ax.pcolormesh(x, y, corrcoef, cmap=cmap,
norm=colors.LogNorm(vmax=vmax, vmin=vmin))
fig.colorbar(pcm, ax=ax)
# set ticks
ax.set_xticks(majorticks)
ax.set_xticks(minorticks, minor=True)
ax.xaxis.set_ticklabels(ticklabels, fontsize=10, weight="bold")
ax.set_yticks(majorticks)
ax.set_yticks(minorticks, minor=True)
ax.yaxis.set_ticklabels(ticklabels, fontsize=10, weight="bold")
ax.tick_params(which='both', direction='out')
ax.set_xlabel("Residue Index", fontsize=10, weight="bold")
ax.set_ylabel("Residue Index", fontsize=10, weight="bold")
if len(breaks) > 0:
for break_line in breaks:
ax.axhline(break_line, linewidth=0.8, color="black", linestyle="--")
ax.axvline(break_line, linewidth=0.8, color="black", linestyle="--")
if title is not None:
ax.set_title(title, fontsize=8, weight="bold")
plt.tight_layout()
fig.savefig(fn, dpi=200)
if fig_close:
plt.close()
return