|  | #!/usr/bin/env python3 | 
|  | """ Plot a connection box delay matrix using matplotlib. """ | 
|  | import argparse | 
|  | from lib.connection_box_tools import load_connection_box, \ | 
|  | iterate_connection_box, connection_box_to_numpy | 
|  |  | 
|  | import matplotlib.pyplot as plt | 
|  | from matplotlib.colors import BoundaryNorm | 
|  | from matplotlib.ticker import MaxNLocator | 
|  |  | 
|  |  | 
|  | def get_connection_box(cost_map, segment, connection_box): | 
|  | for segment_idx, connection_box_idx, offset, m in iterate_connection_box( | 
|  | cost_map): | 
|  | if segment == segment_idx and connection_box_idx == connection_box: | 
|  | return offset, m | 
|  |  | 
|  |  | 
|  | def plot_connection_box(cost_map, segment, connection_box): | 
|  | offset, m = get_connection_box(cost_map, segment, connection_box) | 
|  |  | 
|  | x, y, delay, congestion = connection_box_to_numpy(offset, m) | 
|  |  | 
|  | print(delay) | 
|  |  | 
|  | # x and y are bounds, so z should be the value *inside* those bounds. | 
|  | # Therefore, remove the last value from the z array. | 
|  | delay_levels = MaxNLocator(nbins=50).tick_values(delay.min(), delay.max()) | 
|  |  | 
|  | # pick the desired colormap, sensible levels, and define a normalization | 
|  | # instance which takes data values and translates those into levels. | 
|  | cmap = plt.get_cmap('PiYG') | 
|  | norm = BoundaryNorm(delay_levels, ncolors=cmap.N, clip=True) | 
|  |  | 
|  | fig, (ax0, ax1) = plt.subplots(nrows=2) | 
|  |  | 
|  | im = ax0.pcolormesh(x, y, delay, cmap=cmap, norm=norm) | 
|  | ax0.autoscale(False)  # To avoid that the scatter changes limits | 
|  | inf_idx = delay == float('inf') | 
|  | ax0.scatter(x[inf_idx], y[inf_idx]) | 
|  | fig.colorbar(im, ax=ax0) | 
|  | ax0.set_title('pcolormesh with levels') | 
|  |  | 
|  | # contours are *point* based plots, so convert our bound into point | 
|  | # centers | 
|  | cf = ax1.contourf( | 
|  | x + 1. / 2., y + 1. / 2., delay, levels=delay_levels, cmap=cmap | 
|  | ) | 
|  | fig.colorbar(cf, ax=ax1) | 
|  | ax1.set_title('contourf with levels') | 
|  |  | 
|  | # adjust spacing between subplots so `ax1` title and `ax0` tick labels | 
|  | # don't overlap | 
|  | fig.tight_layout() | 
|  |  | 
|  | plt.show() | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = argparse.ArgumentParser(description=__doc__) | 
|  | parser.add_argument( | 
|  | '--schema_path', help='Path to connection map schema', required=True | 
|  | ) | 
|  | parser.add_argument('--lookahead_map', required=True) | 
|  | parser.add_argument('--segment', required=True, type=int) | 
|  | parser.add_argument('--connection_box', required=True, type=int) | 
|  |  | 
|  | args = parser.parse_args() | 
|  |  | 
|  | with open(args.lookahead_map, 'rb') as f: | 
|  | cost_map = load_connection_box(args.schema_path, f) | 
|  |  | 
|  | plot_connection_box(cost_map, args.segment, args.connection_box) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |