-
Notifications
You must be signed in to change notification settings - Fork 4
/
make_upset_plot.py
69 lines (62 loc) · 1.66 KB
/
make_upset_plot.py
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
from upsetplot import from_memberships
import sys
def membership_line_to_array(line: str, base_name: str):
"""
Fromm a line membership to an array membership:
eg : 1010 -> ['geno1', 'geno3'] (if base_name == 'geno')
"""
res = []
i=0
for char in line:
i+=1
if char == '1': res.append(f"{base_name}{i}")
return res
def load_venn_from_fredy(venn_file_name: str, base_name: str='geno'):
"""
From a venn file generated by fredy as :
#Venn:
0000 111875
1000 346
0100 357
1100 272
0010 398
1010 0
0110 31
1110 107
0001 362
1001 1
0101 9
1101 89
0011 199
1011 76
0111 54
1111 2057
generate a data usable by upsetplot:
venn_data = from_memberships(
[[],
['geno1'],
['geno2'],
['geno1', 'geno2'],
['geno3'],
['geno1', 'geno3'],
...
],
data=[111875,346,357,272,398,272,...]
)
"""
with open(venn_file_name) as venn_file:
members = [] # first array = arrays of membership, second array: corresponding counts
abundances = []
for line in venn_file.readlines():
if line[0]=='#': continue
sline = line.strip().split()
members.append(membership_line_to_array(sline[0], base_name))
abundances.append(int(sline[1]))
return from_memberships(members,data=abundances)
membership = load_venn_from_fredy(sys.argv[1])
from upsetplot import plot
plot(membership, show_percentages=True)
from matplotlib import pyplot
pyplot.show()
## TODO: deal with input files
## TODO: propose interactive way to select members