| #!/usr/bin/env python |
| # Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| # |
| # Use of this source code is governed by a BSD-style license |
| # that can be found in the LICENSE file in the root of the source |
| # tree. An additional intellectual property rights grant can be found |
| # in the file PATENTS. All contributing project authors may |
| # be found in the AUTHORS file in the root of the source tree. |
| |
| # This script is used to plot simulation dynamics. |
| # Able to plot each flow separately. Other plot boxes can be added, |
| # currently one for Throughput, one for Latency and one for Packet Loss. |
| |
| import matplotlib |
| import matplotlib.pyplot as plt |
| import numpy |
| import re |
| import sys |
| |
| # Change this to True to save the figure to a file. Look below for details. |
| save_figure = False |
| |
| class Variable(object): |
| def __init__(self, variable): |
| self._ID = variable[0] |
| self._xlabel = variable[1] |
| self._ylabel = variable[2] |
| self._subplot = variable[3] |
| self._y_max = variable[4] |
| self.samples = dict() |
| |
| def getID(self): |
| return self._ID |
| |
| def getXLabel(self): |
| return self._xlabel |
| |
| def getYLabel(self): |
| return self._ylabel |
| |
| def getSubplot(self): |
| return self._subplot |
| |
| def getYMax(self): |
| return self._y_max |
| |
| def getNumberOfFlows(self): |
| return len(self.samples) |
| |
| |
| def addSample(self, line): |
| groups = re.search(r'_(((\d)+((,(\d)+)*))_(\D+))#\d@(\S+)', line) |
| |
| # Each variable will be plotted in a separated box. |
| var_name = groups.group(1) |
| alg_name = groups.group(8) |
| |
| alg_name = alg_name.replace('_', ' ') |
| |
| if alg_name not in self.samples.keys(): |
| self.samples[alg_name] = {} |
| |
| if var_name not in self.samples[alg_name].keys(): |
| self.samples[alg_name][var_name] = [] |
| |
| sample = re.search(r'(\d+\.\d+)\t([-]?\d+\.\d+)', line) |
| |
| s = (sample.group(1), sample.group(2)) |
| self.samples[alg_name][var_name].append(s) |
| |
| def plotVar(v, ax, show_legend, show_x_label): |
| if show_x_label: |
| ax.set_xlabel(v.getXLabel(), fontsize='large') |
| ax.set_ylabel(v.getYLabel(), fontsize='large') |
| |
| for alg in v.samples.keys(): |
| |
| for series in v.samples[alg].keys(): |
| |
| x = [sample[0] for sample in v.samples[alg][series]] |
| y = [sample[1] for sample in v.samples[alg][series]] |
| x = numpy.array(x) |
| y = numpy.array(y) |
| |
| line = plt.plot(x, y, label=alg, linewidth=4.0) |
| |
| colormap = {'Available0':'#AAAAAA', |
| 'Available1':'#AAAAAA', |
| 'GCC0':'#80D000', |
| 'GCC1':'#008000', |
| 'GCC2':'#00F000', |
| 'GCC3':'#00B000', |
| 'GCC4':'#70B020', |
| 'NADA0':'#0000AA', |
| 'NADA1':'#A0A0FF', |
| 'NADA2':'#0000FF', |
| 'NADA3':'#C0A0FF', |
| 'NADA4':'#9060B0',} |
| |
| flow_id = re.search(r'(\d+(,\d+)*)', series) # One or multiple ids. |
| key = alg + flow_id.group(1) |
| |
| if key in colormap: |
| plt.setp(line, color=colormap[key]) |
| elif alg == 'TCP': |
| plt.setp(line, color='#AAAAAA') |
| else: |
| plt.setp(line, color='#654321') |
| |
| if alg.startswith('Available'): |
| plt.setp(line, linestyle='--') |
| plt.grid(True) |
| |
| # x1, x2, y1, y2 |
| _, x2, _, y2 = plt.axis() |
| if v.getYMax() >= 0: |
| y2 = v.getYMax() |
| plt.axis((0, x2, 0, y2)) |
| |
| if show_legend: |
| plt.legend(loc='upper center', bbox_to_anchor=(0.5, 1.40), |
| shadow=True, fontsize='large', ncol=len(v.samples)) |
| |
| def main(): |
| variables = [ |
| ('Throughput_kbps', "Time (s)", "Throughput (kbps)", 1, 4000), |
| ('Delay_ms', "Time (s)", "One-way Delay (ms)", 2, 500), |
| ('Packet_Loss', "Time (s)", "Packet Loss Ratio", 3, 1.0), |
| # ('Sending_Estimate_kbps', "Time (s)", "Sending Estimate (kbps)", |
| # 4, 4000), |
| ] |
| |
| var = [] |
| |
| # Create objects. |
| for variable in variables: |
| var.append(Variable(variable)) |
| |
| # Add samples to the objects. |
| for line in sys.stdin: |
| if line.startswith("[ RUN ]"): |
| test_name = re.search(r'\.(\w+)', line).group(1) |
| if line.startswith("PLOT"): |
| for v in var: |
| if v.getID() in line: |
| v.addSample(line) |
| |
| matplotlib.rcParams.update({'font.size': 48/len(variables)}) |
| |
| # Plot variables. |
| fig = plt.figure() |
| |
| # Offest and threshold on the same plot. |
| n = var[-1].getSubplot() |
| i = 0 |
| for v in var: |
| ax = fig.add_subplot(n, 1, v.getSubplot()) |
| plotVar(v, ax, i == 0, i == n - 1) |
| i += 1 |
| |
| if save_figure: |
| fig.savefig(test_name + ".png") |
| plt.show() |
| |
| if __name__ == '__main__': |
| main() |