1#!/usr/bin/env python 2 3import matplotlib.pyplot as plt 4#from pylab import * 5import cPickle 6import pylab as P 7import numpy as np 8from matplotlib.backends.backend_pdf import PdfPages 9from matplotlib.patches import Polygon 10import itertools 11import os 12 13 14 15def histplot(data,labels, colors, x_label, y_label, title, fig_name, cdf): 16 fig, ax = plt.subplots() 17 if cdf: 18 n, bins, patches = ax.hist(data, 20, weights=None, histtype='step', normed=True, cumulative=True, label= labels, color = colors) 19 legend = ax.legend(loc='lower left', shadow=False) 20 ax.grid(True) 21 22 else: 23 n, bins, patches = ax.hist( data, 20, weights=None, histtype='bar', label= labels, color = colors) 24 legend = ax.legend(loc='upper right', shadow=False) 25 26 for line in ax.get_lines(): 27 line.set_linewidth(1.5) 28 29 ax.set_xlabel(x_label) 30 ax.set_ylabel(y_label) 31 for label in legend.get_texts(): 32 label.set_fontsize('small') 33 34 for label in legend.get_lines(): 35 label.set_linewidth(1.5) # the legend line width 36 37 fig.suptitle(title, fontsize=12) 38 39 #plt.show() 40 pp = PdfPages(fig_name) 41 pp.savefig(fig) 42 pp.close() 43 return [n, bins, patches] 44 45def accplot(data, labels, colors, x_label, y_label, title, fig_name, annotation): 46 mean = np.zeros(len(data)) 47 for i in range(len(data)): 48 if len(data[i]) > 0: 49 mean[i] = len(data[i]) /(1.0*max(data[i])) 50 51 mean = round(mean) 52 53 fig, ax = plt.subplots() 54 for i in range(len(data)): 55 if len(data[i]) > 0: 56 ax.plot(data[i], range(len(data[i])), colors[i], label= labels[i]+', '+mean[i]+' adv/s, total nr. '+str(len(data[i]))) 57 58 ax.set_xlabel(x_label) 59 ax.set_ylabel(y_label) 60 for tl in ax.get_yticklabels(): 61 tl.set_color('k') 62 63 legend = ax.legend(loc='upper left', shadow=False) 64 65 for label in legend.get_texts(): 66 label.set_fontsize('small') 67 68 for label in legend.get_lines(): 69 label.set_linewidth(1.5) # the legend line width 70 71 for line in ax.get_lines(): 72 line.set_linewidth(1.5) 73 74 fig.suptitle(title, fontsize=12) 75 ax.text(400, 5000, annotation , style='italic', 76 bbox={'facecolor':'gray', 'alpha':0.5, 'pad':10}) 77 78 #plt.show() 79 pp = PdfPages(fig_name) 80 pp.savefig(fig) 81 pp.close() 82 83 return fig 84 85def mean_common_len(data): 86 mcl = 0 87 for i in range(len(data) - 1): 88 if len(data[i]) > 0: 89 if mcl == 0: 90 mcl = len(data[i]) 91 else: 92 mcl = min(mcl, len(data[i])) 93 return mcl 94 95def mean_common_time(data): 96 mct = 0 97 for i in range(len(data) - 1): 98 if len(data[i]) > 0: 99 if mct == 0: 100 mct = max(data[i]) 101 else: 102 mct = min(mct, max(data[i])) 103 return mct 104 105def normalize(s): 106 return map(lambda x: (x - s[0]), s) 107 108def delta(s): 109 rs = list() 110 for i in range(len(s)-1): 111 rs.append(s[i+1] - s[i]) 112 return rs 113 114def round(s): 115 return map(lambda x: "{0:.4f}".format(x), s) 116 117def cut(s, V): 118 r = list() 119 for i in range(len(s)): 120 if s[i] <= V: 121 r.append(s[i]) 122 return r 123 124def prepare_data(exp_name, sensor_name): 125 prefix = '../data/processed/' 126 127 scanning_type = exp_name+'_continuous' 128 mn = cPickle.load(open(prefix+scanning_type+'_mac_'+sensor_name+'.data', 'rb')) # mac nio, 129 mm = cPickle.load(open(prefix+scanning_type+'_mac_mac.data', 'rb')) # mac mac, 130 rn = cPickle.load(open(prefix+scanning_type+'_rug_'+sensor_name+'.data', 'rb')) # ruggear nio, 131 rm = cPickle.load(open(prefix+scanning_type+'_rug_mac.data', 'rb')) # ruggear mac, 132 133 scanning_type = exp_name+'_normal' 134 try: 135 normal_rn = cPickle.load(open(prefix + scanning_type+'_rug_'+sensor_name+'.data', 'rb')) # ruggear mac, normal 136 except: 137 normal_rn = list() 138 139 try: 140 normal_mn = cPickle.load(open(prefix + scanning_type+'_mac_'+sensor_name+'.data', 'rb')) # ruggear mac, normal 141 except: 142 normal_mn = list() 143 144 try: 145 normal_rm = cPickle.load(open(prefix + scanning_type+'_rug_mac.data', 'rb')) # ruggear mac, normal 146 except: 147 normal_rm = list() 148 149 try: 150 normal_mm = cPickle.load(open(prefix + scanning_type+'_mac_mac.data', 'rb')) # ruggear mac, normal 151 except: 152 normal_mm = list() 153 154 155 T = mean_common_time([mm, mn, rm, rn, normal_rm, normal_rn, normal_mm, normal_mn]) 156 L = mean_common_len([mm, mn, rm, rn, normal_rm, normal_rn, normal_mm, normal_mn]) 157 Z = 15 158 159 print "mct %d, mcl %d" % (T,L) 160 mac_mac = normalize(mm) 161 mac_nio = normalize(mn) 162 ruggeer_mac = normalize(rm) 163 ruggeer_nio = normalize(rn) 164 165 ruggeer_nio_normal = normalize(normal_rn) 166 ruggeer_mac_normal = normalize(normal_rm) 167 mac_mac_normal = normalize(normal_mm) 168 mac_nio_normal = normalize(normal_mn) 169 170 171 delta_mn = delta(mac_nio) 172 delta_mm = delta(mac_mac) 173 delta_rn = delta(ruggeer_nio) 174 delta_rm = delta(ruggeer_mac) 175 176 rn_delays = list() 177 for i in range(len(delta_rn)): 178 rn_delays.append(range(delta_rn[i])) 179 180 flattened_rn_delays = list(itertools.chain.from_iterable(rn_delays)) 181 182 plot_data = [cut(mac_mac,T), cut(mac_nio,T), cut(ruggeer_mac,T), cut(ruggeer_nio,T)] 183 plot_data_normal = [cut(mac_mac_normal,T), cut(mac_nio_normal,T), cut(ruggeer_mac_normal,T), cut(ruggeer_nio_normal,T)] 184 185 hist_data = [delta_mm[0:L], delta_mn[0:L], delta_rm[0:L], delta_rn[0:L]] 186 187 zoomed_hist_data = list() 188 if len(hist_data[0]) >= Z and len(hist_data[1]) >= Z and len(hist_data[2]) >= Z and len(hist_data[3]) >= Z : 189 zoomed_hist_data = [cut(hist_data[0],Z), cut(hist_data[1],Z), cut(hist_data[2],Z), cut(hist_data[3],Z)] 190 191 return [plot_data, hist_data, zoomed_hist_data, flattened_rn_delays, plot_data_normal] 192 193def plot(exp_name, sensor_name, sensor_title, prefix): 194 [plot_data, hist_data, zoomed_hist_data, rn_delays, plot_data_normal] = prepare_data(exp_name, sensor_name) 195 labels = ['Scan. BCM, Adv. BCM', 'Scan. BCM, Adv. '+ sensor_title, 'Scan. RugGear, Adv. BCM', 'Scan. RugGear, Adv. '+sensor_title] 196 plot_colors = ['r-','k-','b-','g-'] 197 hist_colors = ['red','black','blue','green'] 198 199 title = 'Continuous scanning over time' 200 annotation = 'scan window 30ms, scan interval 30ms' 201 202 x_label = 'Time [s]' 203 y_label = 'Number of advertisements' 204 accplot(plot_data, labels, plot_colors, x_label, y_label, title, prefix+sensor_name+'_acc_number_of_advertisements_continuous_scanning.pdf', annotation) 205 206 x_label = 'Time interval between two advertisements [s]' 207 title = 'Continuous scanning - interval distribution' 208 histplot(hist_data, labels, hist_colors, x_label, y_label, title, prefix+sensor_name+'_histogram_advertisements_time_delay.pdf', 0) 209 210 211 #if len(zoomed_hist_data) > 0: 212 # title = 'Continuous scanning - interval distribution [0-15s]' 213 # histplot(zoomed_hist_data, labels, hist_colors, x_label, y_label, title, prefix+sensor_name+'_histogram_advertisements_time_delay_zoomed.pdf', 0) 214 215 title = 'Continuous scanning - expected waiting time' 216 x_label = 'Expected waiting time until first scan [s]' 217 [n, bins, patches] = histplot([rn_delays], [labels[3]], [hist_colors[3]], x_label, y_label, title, prefix+sensor_name+'_ruggear_expected_scan_response.pdf', 0) 218 219 title = 'Continuous scanning - expected waiting time probability distribution' 220 y_label = 'Advertisement probability' 221 x_label = 'Time until first scan [s]' 222 [n, bins, patches] = histplot([rn_delays], [labels[3]], [hist_colors[3]], x_label, y_label, title, prefix+sensor_name+'_ruggear_cdf.pdf', 1) 223 224 225 title = 'Normal scanning over time' 226 annotation = 'scan window 30ms, scan interval 300ms' 227 228 x_label = 'Time [s]' 229 y_label = 'Number of advertisements' 230 accplot(plot_data_normal, labels, plot_colors, x_label, y_label, title, prefix+sensor_name+'_acc_number_of_advertisements_normal_scanning.pdf', annotation) 231 232 233picts_folder = "../picts_experiments/" 234if not os.access(picts_folder, os.F_OK): 235 os.mkdir(picts_folder) 236 237plot('exp1','nio', 'Nio', picts_folder) 238plot('exp2','xg2', 'XG', picts_folder) 239