blob: 53c1cc21d1bb74b2f1ea4a9eb1f01b67a1137dcd [file] [log] [blame] [edit]
#!/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()