/
PlotHeatmapPairwiseMatrix
executable file
·106 lines (93 loc) · 3.75 KB
/
PlotHeatmapPairwiseMatrix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8
"""
Plot an MDS from Pairwise Matrix
James B. Pease
"""
import os
import sys
import argparse
import numpy as np
from sklearn.manifold import MDS
from matplotlib import pyplot as plt
from mixcore import CSVfile
_LICENSE = """
http://www.github.org/jbpease/mixtape
MixTAPE: Mix of Tools for Analysis in Phylogenetics and Evolution
This file is part of MixTAPE.
MixTAPE is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MixTAPE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MixTAPE. If not, see <http://www.gnu.org/licenses/>.
"""
def generate_argparser():
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
epilog=_LICENSE)
parser.add_argument('pwdist', nargs='?', type=os.path.abspath,
default=sys.stdin,
help="input pairwise matrix")
parser.add_argument("--tsv", action="store_true",
help="tab-delimited (default:comma-delimited)")
parser.add_argument('--out', type=os.path.abspath,
default=sys.stdout, help="output fasta file")
parser.add_argument('--minscale', type=float,
help="fixed minimum value for scale")
parser.add_argument('--maxscale', type=float,
help="fixed maximum value for scale")
parser.add_argument('--figsize', type=float, nargs=2,
help="fixed height/width in inches for figure")
return parser
def main(arguments=None):
arguments = arguments if arguments is not None else sys.argv[1:]
parser = generate_argparser()
args = parser.parse_args(args=arguments)
csvfile = CSVfile(args.pwdist, delimiter="," if args.tsv is False else "\t")
nseqs = len(csvfile.colheaders) - 1
arr = np.zeros((nseqs, nseqs))
i = 0
if args.figsize is not None:
fig = plt.figure(figsize=(args.figsize[0], args.figsize[1]), )
else:
fig = plt.figure()
ax1 = fig.add_subplot(111)
for entry in csvfile:
#print(entry)
for j in range(1, len(entry)):
arr[i][j - 1] = float(entry[j])
arr[j - 1][i] = float(entry[j])
i += 1
ordering = np.argsort(arr)[0]
print(ordering)
#ordering = tuple(sorted([x, i] for i, x in enumerate(arr[0])))
#ordering = [x[1] for x in ordering]
newarr = arr[ordering]
newarr = newarr[:,ordering]
# mds = MDS(n_components=2, dissimilarity='precomputed', max_iter=10000)
# results = mds.fit(arr)
# coords = results.embedding_
# ax1.subplots_adjust(bottom=0.1)
heatmap = ax1.imshow(newarr, cmap='YlGnBu', interpolation='nearest',
vmin=args.minscale if args.minscale is not None else np.min(arr),
vmax=args.maxscale if args.maxscale is not None else np.max(arr),
)
ticklabels = ['-'.join(csvfile.colheaders[x+1].split("-")[:3]) for x in ordering]
plt.xticks(np.arange(nseqs) + 0.5, ticklabels, rotation='vertical', size=4)
plt.yticks(np.arange(nseqs) + 0.5, ticklabels, size=4)
# plt.show()
cb = plt.colorbar(heatmap, shrink=0.3)
cb.ax.tick_params(labelsize=4)
# plt.legend()
plt.tight_layout()
plt.savefig(args.out)
return ''
if __name__ == '__main__':
main()