def plot_pattern_info(pattern_id, data): # find the window corresponding to pattern sorted_data = sorted(data, key = lambda datum: datum.time) pattern_idxs = [i for (i, datum) in enumerate(sorted_data) if datum.which_pattern == pattern_id] pattern_start_idx, pattern_end_idx = min(pattern_idxs), max(pattern_idxs) pattern_window_data = sorted_data[pattern_start_idx:pattern_end_idx + 1] background_data = sorted_data[:pattern_start_idx] + sorted_data[pattern_end_idx + 1:] pattern_window_background_data = [datum for datum in pattern_window_data if datum.which_pattern != pattern_id] pattern_data = [datum for datum in pattern_window_data if datum.which_pattern == pattern_id] # plot spatial distribution of points inside pattern_window, with pattern points colored differently, as well as distribution in background window pattern_window_background_xys = [utils.latlng_to_xy(*datum.location) for datum in pattern_window_background_data] pattern_xys = [utils.latlng_to_xy(*datum.location) for datum in pattern_data] background_xys = [utils.latlng_to_xy(*datum.location) for datum in background_data] marker_size = 3 alpha = 0.8 spatial_fig, spatial_ax = plt.subplots() spatial_ax.scatter([xy[0] for xy in background_xys], [xy[1] for xy in background_xys], s = marker_size, alpha = alpha, color = background_color) spatial_ax.scatter([xy[0] for xy in pattern_window_background_xys], [xy[1] for xy in pattern_window_background_xys], s = marker_size, alpha = alpha, color = pattern_window_color) spatial_ax.scatter([xy[0] for xy in pattern_xys], [xy[1] for xy in pattern_xys], s = marker_size, alpha = alpha, color = pattern_color) pattern_start_time, pattern_end_time = pattern_data[0].time, pattern_data[-1].time spatial_ax.set_title('start: %.2f, end: %.2f, len/window: %d/%d' % (pattern_start_time, pattern_end_time, len(pattern_data), len(pattern_window_background_data))) """ hope that density of pattern_window is higher than that of background in region where the pattern is """ # for each feature, plot distribution of features indie pattern_window, with pattern counts overload differently, as well as background distribution feature_figs = [] background_feature_counts = get_data_feature_counts(background_data) pattern_window_feature_counts = get_data_feature_counts(pattern_window_data) pattern_feature_counts = get_data_feature_counts(pattern_data) num_features = len(iter(data).next().x) num_cats = [np.max([datum.x[k] for datum in data]) + 1 for k in range(num_features)] for background_feature_count, pattern_window_feature_count, pattern_feature_count, num_cat in itertools.izip(background_feature_counts, pattern_window_feature_counts, pattern_feature_counts, num_cats): feature_fig = plt.figure() feature_fig.suptitle(background_feature_count.name) non_pattern_ax = feature_fig.add_subplot(2,1,1) pattern_ax = feature_fig.add_subplot(2,1,2) expanded_background_feature_count = (pd.Series(np.zeros(num_cat)) + background_feature_count).fillna(0) / float(background_feature_count.sum()) expanded_pattern_window_feature_count = (pd.Series(np.zeros(num_cat)) + pattern_window_feature_count).fillna(0) / float(pattern_window_feature_count.sum()) expanded_pattern_feature_count = (pd.Series(np.zeros(num_cat)) + pattern_feature_count).fillna(0) / float(pattern_feature_count.sum()) utils.plot_bar_chart(non_pattern_ax, map(str, range(num_cat)), expanded_pattern_window_feature_count, label = 'pattern_window', alpha = 0.5, color = pattern_window_color, offset = 0.4, width = 0.35) utils.plot_bar_chart(non_pattern_ax, map(str, range(num_cat)), expanded_background_feature_count, label = 'background', alpha = 0.5, color = background_color, offset = 0.0, width = 0.35) non_pattern_ax.set_title('sizes: %d/%d' % (len(pattern_window_data), len(background_data))) non_pattern_ax.set_ylim((0,1)) non_pattern_ax.legend() utils.plot_bar_chart(pattern_ax, map(str, range(num_cat)), expanded_pattern_feature_count, label = 'pattern', alpha = 0.5, color = pattern_color, offset = 0.4, width = 0.35) pattern_ax.set_title('size: %d' % len(pattern_data)) pattern_ax.set_ylim((0,1)) pattern_ax.legend() feature_figs.append(feature_fig) return spatial_fig, feature_figs
def plot_pattern_helper(data): fig, ax = plt.subplots() data_xys = [utils.latlng_to_xy(*datum.location) for datum in data] ax.scatter([xy[0] for xy in data_xys], [xy[1] for xy in data_xys], color = 'black', s = 1) return fig, ax
return itertools.ifilter(lambda (background_data, foreground_data): len(background_data) != 0 and len(foreground_data) != 0 and len(foreground_data) < N / 2, itertools.starmap(start_end_idx_to_background_foreground, itertools.combinations(idx_boundaries,2))) def plot_pattern((background_data, foreground_data, pattern_data), test_data): """ plot true foreground patterns with x's, background blue, predicted pattern red, others green """ marker_size = 2 alpha = 0.8 not_pattern_data = foreground_data.difference(pattern_data) true_pattern_data = [datum for datum in foreground_data if datum.in_pattern] true_not_pattern_data = [datum for datum in foreground_data if not datum.in_pattern] pattern_xys = [utils.latlng_to_xy(*datum.location) for datum in pattern_data] not_pattern_xys = [utils.latlng_to_xy(*datum.location) for datum in not_pattern_data] true_pattern_xys = [utils.latlng_to_xy(*datum.location) for datum in true_pattern_data] true_not_pattern_xys = [utils.latlng_to_xy(*datum.location) for datum in true_not_pattern_data] background_xys = [utils.latlng_to_xy(*datum.location) for datum in background_data] predicted_fig, predicted_ax = plt.subplots() predicted_ax.scatter([xy[0] for xy in background_xys], [xy[1] for xy in background_xys], label = 'background crimes', color = 'black', s = marker_size, alpha = alpha) predicted_ax.scatter([xy[0] for xy in pattern_xys], [xy[1] for xy in pattern_xys], label = 'pattern crimes', color = 'green', s = marker_size, alpha = alpha) predicted_ax.scatter([xy[0] for xy in not_pattern_xys], [xy[1] for xy in not_pattern_xys], label = 'not pattern crimes', color = 'red', s = marker_size, alpha = alpha) predicted_fig.suptitle('predicted') predicted_ax.legend() true_fig, true_ax = plt.subplots() true_ax.scatter([xy[0] for xy in background_xys], [xy[1] for xy in background_xys], label = 'background crimes', color = 'black', s = marker_size, alpha = alpha)