CSIT-1397: Create Heatmap graphs 24/16824/63
authorTibor Frank <tifrank@cisco.com>
Tue, 15 Jan 2019 10:55:43 +0000 (11:55 +0100)
committerTibor Frank <tifrank@cisco.com>
Mon, 21 Jan 2019 14:31:52 +0000 (15:31 +0100)
 - Heatmap is used

Change-Id: I33a8619ea4a346bde92d85da0bbb63f3d916cbc5
Signed-off-by: Tibor Frank <tifrank@cisco.com>
resources/tools/presentation/generator_plots.py
resources/tools/presentation/specification.yaml

index 21dd1a0..ca1cd9b 100644 (file)
@@ -1083,3 +1083,244 @@ def plot_http_server_performance_box(plot, input_data):
         logging.error("   Finished with error: {}".
                       format(str(err).replace("\n", " ")))
         return
+
+
+def plot_service_density_heatmap(plot, input_data):
+    """Generate the plot(s) with algorithm: plot_service_density_heatmap
+    specified in the specification file.
+
+    :param plot: Plot to generate.
+    :param input_data: Data to process.
+    :type plot: pandas.Series
+    :type input_data: InputData
+    """
+
+    # Example data in Mpps
+    txt_chains = ['1', '2', '4', '6', '8', '10']
+    txt_nodes = ['1', '2', '4', '6', '8', '10']
+    chains = [i + 1 for i in range(len(txt_chains))]
+    nodes = [i + 1 for i in range(len(txt_nodes))]
+    data = [
+        [6.3, 6.3, 6.3, 6.4, 6.5, 6.4],
+        [5.8, 5.6, 5.6, 5.6, 5.5, None],
+        [5.6, 5.5, 5.3, None, None, None],
+        [5.4, 5.3, None, None, None, None],
+        [5.4, 5.2, None, None, None, None],
+        [5.3, None, None, None, None, None]
+    ]
+
+    hovertext = list()
+    annotations = list()
+
+    text = "{name}"
+
+    for c in range(len(txt_chains)):
+        hover_line = list()
+        for n in range(len(txt_nodes)):
+            if data[c][n] is not None:
+                annotations.append(dict(
+                    x=n+1,
+                    y=c+1,
+                    xref="x",
+                    yref="y",
+                    xanchor="center",
+                    yanchor="middle",
+                    text=str(data[c][n]),
+                    font=dict(
+                        size=14,
+                    ),
+                    align="center",
+                    showarrow=False
+                ))
+                hover_line.append(text.format(name="Testcase Name"))
+        hovertext.append(hover_line)
+
+    traces = [
+        plgo.Heatmap(x=nodes,
+                     y=chains,
+                     z=data,
+                     colorbar=dict(
+                         title="Packet Throughput [Mpps]",
+                         titleside="right",
+                         titlefont=dict(
+                            size=14
+                         ),
+                     ),
+                     showscale=True,
+                     colorscale="Reds",
+                     text=hovertext,
+                     hoverinfo="text")
+    ]
+
+    for idx, item in enumerate(txt_nodes):
+        annotations.append(dict(
+            x=idx+1,
+            y=0,
+            xref="x",
+            yref="y",
+            xanchor="center",
+            yanchor="top",
+            text=item,
+            font=dict(
+                size=16,
+            ),
+            align="center",
+            showarrow=False
+        ))
+    for idx, item in enumerate(txt_chains):
+        annotations.append(dict(
+            x=0.3,
+            y=idx+1,
+            xref="x",
+            yref="y",
+            xanchor="right",
+            yanchor="middle",
+            text=item,
+            font=dict(
+                size=16,
+            ),
+            align="center",
+            showarrow=False
+        ))
+    # X-axis:
+    annotations.append(dict(
+        x=0.55,
+        y=1.05,
+        xref="paper",
+        yref="paper",
+        xanchor="center",
+        yanchor="middle",
+        text="<b>No. of Network Functions per Service Instance</b>",
+        font=dict(
+            size=16,
+        ),
+        align="center",
+        showarrow=False
+    ))
+    # Y-axis:
+    annotations.append(dict(
+        x=-0.04,
+        y=0.5,
+        xref="paper",
+        yref="paper",
+        xanchor="center",
+        yanchor="middle",
+        text="<b>No. of Service Instances</b>",
+        font=dict(
+            size=16,
+        ),
+        align="center",
+        textangle=270,
+        showarrow=False
+    ))
+    updatemenus = list([
+        dict(
+            x=1.0,
+            y=0.0,
+            xanchor='right',
+            yanchor='bottom',
+            direction='up',
+            buttons=list([
+                dict(
+                    args=[{"colorscale": "Reds", "reversescale": False}],
+                    label="Red",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Blues", "reversescale": True}],
+                    label="Blue",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Greys", "reversescale": True}],
+                    label="Grey",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Greens", "reversescale": True}],
+                    label="Green",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "RdBu", "reversescale": False}],
+                    label="RedBlue",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Picnic", "reversescale": False}],
+                    label="Picnic",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Rainbow", "reversescale": False}],
+                    label="Rainbow",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Portland", "reversescale": False}],
+                    label="Portland",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Jet", "reversescale": False}],
+                    label="Jet",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Hot", "reversescale": True}],
+                    label="Hot",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Blackbody", "reversescale": True}],
+                    label="Blackbody",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Earth", "reversescale": True}],
+                    label="Earth",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Electric", "reversescale": True}],
+                    label="Electric",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Viridis", "reversescale": True}],
+                    label="Viridis",
+                    method="update"
+                ),
+                dict(
+                    args=[{"colorscale": "Cividis", "reversescale": True}],
+                    label="Cividis",
+                    method="update"
+                ),
+            ])
+        )
+    ])
+
+    try:
+        layout = deepcopy(plot["layout"])
+    except KeyError as err:
+        logging.error("Finished with error: No layout defined")
+        logging.error(repr(err))
+        return
+
+    layout["annotations"] = annotations
+    layout['updatemenus'] = updatemenus
+
+    try:
+        # Create plot
+        plpl = plgo.Figure(data=traces, layout=layout)
+
+        # Export Plot
+        logging.info("    Writing file '{0}{1}'.".
+                     format(plot["output-file"], plot["output-file-type"]))
+        ploff.plot(plpl, show_link=False, auto_open=False,
+                   filename='{0}{1}'.format(plot["output-file"],
+                                            plot["output-file-type"]))
+    except PlotlyError as err:
+        logging.error("   Finished with error: {}".
+                      format(str(err).replace("\n", " ")))
+        return
index 832f54d..8dc4df7 100644 (file)
 
   data-sets:
 
+    # Example
+    plot-vpp-service-density-3n-hsw:
+      csit-vpp-perf-verify-1810-3n-hsw:
+      - 28
+
     # Denverton:
     intel-dnv-vpp:
       intel-dnv-vpp-release-1810:
       width: 700
       height: 900
 
+    plot-service-density:
+      titlefont:
+        size: 18
+      xaxis:
+        side: "top"
+        autorange: True
+        fixedrange: False
+        showgrid: False
+        showline: False
+        showticklabels: False
+        ticks: ""
+        ticklen: 0
+        tickwidth: 0
+        zeroline: False
+      yaxis:
+        autorange: "reversed"
+        showgrid: False
+        showline: False
+        showticklabels: False
+        ticks: ""
+        ticklen: 0
+        tickwidth: 0
+        zeroline: False
+      autosize: True
+      showlegend: False
+      width: 700
+      height: 700
+
     plot-cps:
       titlefont:
         size: 18
     title: "example-30min-bars"
     layout: "plot-soak-throughput"
 
+# Heatmap - example
+-
+  type: "plot"
+  title: "Service Density: l2sw-3n-hsw-x520-64b-1t1c-base_and_scale-ndr"
+  algorithm: "plot_service_density_heatmap"
+  output-file-type: ".html"
+  output-file: "{DIR[STATIC,VPP]}/l2sw-3n-hsw-x520-64b-1t1c-base_and_scale-sd-ndr"
+  data: "plot-vpp-service-density-3n-hsw"
+  filter: "'NIC_Intel-X520-DA2' and
+           '64B' and
+           ('BASE' or 'SCALE') and
+           'NDRPDR' and
+           'ETH' and
+           '1T1C' and
+           ('L2BDMACSTAT' or 'L2BDMACLRN' or 'L2XCFWD' or 'L2PATCH') and
+           not 'VHOST' and
+           not 'MEMIF'"
+  parameters:
+  - "throughput"
+  - "parent"
+  - "tags"
+  layout:
+    title: "<b>Network Service Density Matrix: Packet Throughput View</b>"
+    layout: "plot-service-density"
+
 ################################################################################
 # Plots VPP HTTP Server Performance
 -