annotate tools/myTools/bin/sfa/plot/si.py @ 1:7e5c71b2e71f draft default tip

Uploaded
author laurenmarazzi
date Wed, 22 Dec 2021 16:00:34 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
2 from collections import Counter
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
3
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
4 import numpy as np
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
5 import pandas as pd
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
6 import matplotlib.gridspec as gridspec
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
7 import matplotlib.pyplot as plt
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
8 from matplotlib.patches import Rectangle
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
9 from matplotlib.ticker import FormatStrFormatter
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
10 from matplotlib import rcParams
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
11
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
12 rcParams['font.family'] = 'sans-serif'
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
13 rcParams['font.sans-serif'] = ['Arial']
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
14
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
15 def siplot(df_splo,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
16 df_inf,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
17 output,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
18 min_splo=None,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
19 max_splo=None,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
20 thr_inf=1e-10,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
21 fmt_inf='%f',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
22 fig=None,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
23 cnt_max=None,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
24 ncol=4,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
25 designated=None,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
26 color='silver',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
27 dcolor='red',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
28 zcolor='red',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
29 alpha=0.7,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
30 xfontsize=8,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
31 yfontsize=8):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
32
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
33 # SPLO-Influence Data
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
34 if not min_splo:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
35 min_splo = df_splo.min()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
36
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
37 if not max_splo:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
38 max_splo = df_splo.max()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
39
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
40 mask_splo = (min_splo <= df_splo) & (df_splo <= max_splo)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
41 df_splo = df_splo[mask_splo]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
42
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
43 df_splo = pd.DataFrame(df_splo)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
44 df_splo.columns = ['SPLO']
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
45
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
46
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
47 if output in df_splo.index:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
48 df_splo.drop(output, inplace=True)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
49
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
50 index_common = df_splo.index.intersection(df_inf.index)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
51 df_inf = pd.DataFrame(df_inf.loc[index_common])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
52
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
53 mark_drop = df_inf[output].abs() <= thr_inf
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
54 df_inf.drop(df_inf.loc[mark_drop, output].index,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
55 inplace=True)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
56
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
57
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
58 df_si = df_inf.join(df_splo.loc[index_common])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
59 df_si.index.name = 'Source'
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
60 df_si.reset_index(inplace=True)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
61
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
62 cnt_splo = Counter(df_si['SPLO'])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
63 if not cnt_max:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
64 cnt_max = max(cnt_splo.values())
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
65
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
66 splos = sorted(cnt_splo.keys())
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
67 nrow = int(np.ceil(len(splos)/ncol))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
68
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
69 # Plot
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
70 if not fig:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
71 fig = plt.figure()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
72
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
73 gs = gridspec.GridSpec(nrow, ncol)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
74
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
75 yvals = np.arange(1, cnt_max +1)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
76 for i, splo in enumerate(splos):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
77 idx_row = int(i / ncol)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
78 idx_col = int(i % ncol)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
79 ax = fig.add_subplot(gs[idx_row, idx_col])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
80 df_sub = df_si[df_si['SPLO'] == splo]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
81 df_sub = df_sub.sort_values(by=output)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
82 num_items = df_sub[output].count()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
83
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
84 influence = np.zeros((cnt_max,)) # Influence
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
85 num_empty = cnt_max - num_items
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
86 influence[num_empty:] = df_sub[output]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
87 names = df_sub['Source'].tolist()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
88 names = ['' ] *(num_empty) + names
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
89
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
90 # Plot bars
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
91 plt.barh(yvals, influence, align='center',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
92 alpha=alpha)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
93
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
94 ax.set_title('SPLO=%d'%(splo))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
95 ax.set_xlabel('')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
96
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
97 ax.xaxis.set_major_formatter(FormatStrFormatter(fmt_inf))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
98 ax.tick_params(axis='x',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
99 which='major',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
100 labelsize=xfontsize)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
101
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
102 ax.set_ylabel('')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
103 ax.yaxis.set_ticks_position('right')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
104 ax.tick_params(axis='y',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
105 which='major',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
106 labelsize=yfontsize)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
107
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
108 plt.yticks(yvals, names)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
109
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
110 # Draw zero line.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
111 if not((influence <= 0).all() or (influence >= 0).all()):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
112 ax.vlines(x=0.0, ymin=0, ymax=yvals[-1]+1, color=zcolor)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
113
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
114 # Set limitations
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
115 ax.set_ylim(0, cnt_max +1)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
116
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
117 if designated:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
118 # Filter bar graphics.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
119 bars = []
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
120 cnt_bars = 0
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
121 for obj in ax.get_children():
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
122 if cnt_bars == cnt_max:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
123 break
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
124 if isinstance(obj, Rectangle):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
125 bars.append(obj)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
126 obj.set_color(color)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
127 cnt_bars += 1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
128 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
129
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
130 # Change the bars of the designated names.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
131 for i, name in enumerate(names):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
132 if name in designated:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
133 bars[i].set_color(dcolor)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
134 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
135
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
136 # Change the text colors of the designated names.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
137 for obj in ax.get_yticklabels():
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
138 name = obj.get_text()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
139 if name in designated:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
140 obj.set_color(dcolor)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
141 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
142 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
143
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
144 # Make zero notation more simple.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
145 fig.canvas.draw()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
146 for ax in fig.axes:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
147 labels = []
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
148 for obj in ax.get_xticklabels():
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
149 try:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
150 text = obj.get_text()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
151 num = float(text)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
152 except ValueError:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
153 labels.append(text)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
154 continue
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
155
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
156 if num == 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
157 labels.append('0')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
158 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
159 labels.append(text)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
160 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
161 ax.set_xticklabels(labels)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
162 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
163 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
164
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
165 return fig