{ "cells": [ { "cell_type": "code", "execution_count": 180, "metadata": {}, "outputs": [], "source": [ "# Using plotly\n", "import plotly.graph_objects as go\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define data" ] }, { "cell_type": "code", "execution_count": 197, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
startendnameordercommentoverlapoverlap_withsize
00131072BootROMNaNNaNTrue0.0131072
170421184BL1 boot entry pointENTRYNaNTrue0.020480
22582446304Boot USB functionNaNNaNTrue0.020480
37584896328bootrom authentication functionNaNNaNTrue0.020480
4103184123664BL1 boot functionNaNNaNTrue0.020480
521463042166784Frederic Destination pointerNaNNaNFalse5.020480
63368944033689448Boot USB return addressNaNNaNFalse6.08
73369100033711480Event buffer pointerNaNNaNFalse7.020480
83398451234004992First debugger locationNaNNaNTrue9.020480
93399270434013184End of memory stackNaNNaNTrue8.020480
\n", "
" ], "text/plain": [ " start end name order comment \\\n", "0 0 131072 BootROM NaN NaN \n", "1 704 21184 BL1 boot entry point ENTRY NaN \n", "2 25824 46304 Boot USB function NaN NaN \n", "3 75848 96328 bootrom authentication function NaN NaN \n", "4 103184 123664 BL1 boot function NaN NaN \n", "5 2146304 2166784 Frederic Destination pointer NaN NaN \n", "6 33689440 33689448 Boot USB return address NaN NaN \n", "7 33691000 33711480 Event buffer pointer NaN NaN \n", "8 33984512 34004992 First debugger location NaN NaN \n", "9 33992704 34013184 End of memory stack NaN NaN \n", "\n", " overlap overlap_with size \n", "0 True 0.0 131072 \n", "1 True 0.0 20480 \n", "2 True 0.0 20480 \n", "3 True 0.0 20480 \n", "4 True 0.0 20480 \n", "5 False 5.0 20480 \n", "6 False 6.0 8 \n", "7 False 7.0 20480 \n", "8 True 9.0 20480 \n", "9 True 8.0 20480 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "data = pd.read_csv('stack_and_functions.csv')\n", "\n", "def convert_to_int(value):\n", " try:\n", " if isinstance(value, str) and value.startswith('0x'):\n", " return int(value, 16)\n", " else:\n", " return int(value)\n", " except ValueError:\n", " return value \n", "\n", "data.sort_values(by=['start'], inplace=True)\n", "data['start'] = data['start'].apply(convert_to_int)\n", "data['end'] = data['end'].apply(convert_to_int)\n", "data['overlap'] = False\n", "\n", "for i, row in data.iterrows():\n", " for j, row2 in data.iterrows():\n", " if i == j:\n", " continue\n", " if row['start'] < row2['end'] and row['end'] > row2['start']:\n", " if row['end'] - row['start'] > row2['end'] - row2['start']:\n", " continue\n", " data.at[i, 'overlap'] = True\n", " data.at[j, 'overlap'] = True\n", " data.at[i, 'overlap_with'] = j\n", "\n", "data['overlap_with'] = data['overlap_with'].fillna(data.index.to_series())\n", "data['overlap_with'] = data['overlap_with'].astype(float)\n", "data['size'] = data['end'] - data['start']\n", "\n", "data" ] }, { "cell_type": "code", "execution_count": 239, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.int64(34013184)" ] }, "execution_count": 239, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['end'].iloc[-1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inherent stacked block diagram" ] }, { "cell_type": "code", "execution_count": 242, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8.0\n", "1.25\n", "1.25\n", "1.25\n", "1.25\n", "inf\n", "inf\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_16763/1983735317.py:29: RuntimeWarning:\n", "\n", "divide by zero encountered in scalar divide\n", "\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": "#ce2c3c" }, "mode": "text", "name": "BootROM", "text": "BootROM", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 0.5 ] }, { "marker": { "color": "#ee6511" }, "mode": "text", "name": "BL1 boot entry point", "text": "BL1 boot entry point", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 1.52 ] }, { "marker": { "color": "#157424" }, "mode": "text", "name": "Boot USB function", "text": "Boot USB function", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 2.52 ] }, { "marker": { "color": "#879ab3" }, "mode": "text", "name": "bootrom authentication function", "text": "bootrom authentication function", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 3.52 ] }, { "marker": { "color": "#a4cd2c" }, "mode": "text", "name": "BL1 boot function", "text": "BL1 boot function", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 4.52 ] }, { "marker": { "color": "#1b44e8" }, "mode": "text", "name": "Frederic Destination pointer", "text": "Frederic Destination pointer", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 5.5 ] }, { "marker": { "color": "#8be123" }, "mode": "text", "name": "Boot USB return address", "text": "Boot USB return address", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 6.5 ] }, { "marker": { "color": "#d82002" }, "mode": "text", "name": "Event buffer pointer", "text": "Event buffer pointer", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 7.5 ] }, { "marker": { "color": "#b60e34" }, "mode": "text", "name": "First debugger location", "text": "First debugger location", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 8.52 ] }, { "marker": { "color": "#4c0da0" }, "mode": "text", "name": "End of memory stack", "text": "End of memory stack", "textposition": "middle center", "type": "scatter", "x": [ 2 ], "y": [ 9.52 ] } ], "layout": { "autosize": true, "font": { "size": 18 }, "height": 1200, "legend": { "title": { "text": "Function/Locations" } }, "margin": { "b": 20, "l": 200, "r": 20, "t": 20 }, "shapes": [ { "fillcolor": "#ce2c3c", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.9, "x1": 3.1, "y0": 0.05, "y1": 4.95 }, { "fillcolor": "#ee6511", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 1.07, "y1": 1.92 }, { "fillcolor": "#157424", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 2.07, "y1": 2.92 }, { "fillcolor": "#879ab3", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 3.07, "y1": 3.92 }, { "fillcolor": "#a4cd2c", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 4.069999999999999, "y1": 4.92 }, { "fillcolor": "#1b44e8", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 5.05, "y1": 5.95 }, { "fillcolor": "#8be123", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 6.05, "y1": 6.95 }, { "fillcolor": "#d82002", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 7.05, "y1": 7.95 }, { "fillcolor": "#b60e34", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 8.07, "y1": 8.92 }, { "fillcolor": "#4c0da0", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 3, "y0": 9.07, "y1": 9.92 } ], "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1200, "xaxis": { "range": [ 0, 4 ], "showgrid": false, "showticklabels": false, "tickvals": [ 0, 1, 2, 3, 4 ] }, "yaxis": { "gridcolor": "black", "griddash": "longdashdot", "gridwidth": 0, "showgrid": false, "showticklabels": true, "ticktext": [ "0x20000
0x0", "0x52c0
0x2c0", "0xb4e0
0x64e0", "0x17848
0x12848", "0x1e310
0x19310", "0x211000
0x20c000", "0x2020f68
0x2020f60", "0x2026578
0x2021578", "0x206e000
0x2069000", "0x2070000
0x206b000" ], "tickvals": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import plotly.graph_objects as go\n", "import random\n", "\n", "tickpointers = []\n", "vertical_len = len(data['overlap_with'].unique())\n", "vertical_gap_percentage = 0.05\n", "horizontal_gap = 0.1\n", "\n", "def random_color():\n", " return f'#{random.randint(0, 0xFFFFFF):06x}'\n", "\n", "fig = go.Figure()\n", "\n", "for i, d in data.iterrows():\n", " fillcolor = random_color()\n", " data.at[i, 'fillcolor'] = fillcolor\n", " \n", " x0=1\n", " x1=3\n", "\n", " if d['overlap'] == False:\n", " y0=d['overlap_with']\n", " y1=d['overlap_with']+1\n", " elif d['overlap'] == True:\n", " overlaps = data.loc[data['overlap_with'] == d['overlap_with']].shape[0]\n", "\n", " # Calculate relative size of the overlap\n", " overlap_sizes = data.loc[data['overlap_with'] == d['overlap_with']].iloc[1:]['size'].sum()\n", " print((d['size']/overlap_sizes)*overlaps)\n", "\n", " if d['overlap'] == i+1:\n", " y0=i\n", " y1=overlaps+i\n", " if y1 == vertical_len:\n", " y1 = vertical_len + vertical_gap_percentage\n", " x0=x0-horizontal_gap\n", " x1=x1+horizontal_gap\n", " else:\n", " y0=0.02+i\n", " y1=0.97+i\n", " else:\n", " print(f'Something went wrong with {d}. Skipping')\n", " continue\n", "\n", " fig.add_shape(\n", " type=\"rect\",\n", " x0=x0,\n", " x1=x1,\n", " y0=y0+gap_percentage,\n", " y1=y1-gap_percentage,\n", " line=dict(width=2),\n", " fillcolor=fillcolor,\n", " opacity=0.5,\n", " layer=\"below\",\n", " )\n", "\n", " fig.add_trace(go.Scatter\n", " (\n", " x=[(x0+x1)/2],\n", " y=[y0+0.5],\n", " text=d['name'],\n", " mode=\"text\",\n", " textposition=\"middle center\",\n", " name=d['name'],\n", " marker=dict(\n", " color=fillcolor,\n", " ),\n", " ))\n", "\n", "fig.update_xaxes(\n", " range=[0, 4],\n", " tickvals=[0, 1, 2, 3, 4],\n", ")\n", "\n", "labels = []\n", "for i, j in zip(data['start'], data['end']):\n", " labels.append(f'{hex(j)}
{hex(i)}')\n", "\n", "tickpointers = [i for i in range(len(data))]\n", "\n", "fig.update_yaxes(\n", " # tickvals=[i for i in range(len(data)+1)], \n", " tickvals = tickpointers,\n", " ticktext= labels,\n", " griddash=\"longdashdot\",\n", " gridwidth=0,\n", " gridcolor=\"black\",\n", " showgrid=False,\n", " showticklabels=True,\n", ")\n", "\n", "fig.update_xaxes(\n", " showgrid=False,\n", " showticklabels=False,\n", ")\n", "\n", "fig.update_layout(\n", " width=1200,\n", " height=1200,\n", " autosize=True,\n", " margin=dict(l=200, r=20, t=20, b=20),\n", " font=dict(\n", " size=18,\n", " ),\n", " # Legend being the name of the function\n", " legend_title_text=\"Function/Locations\",\n", ")\n", "\n", "fig.show()" ] } ], "metadata": { "kernelspec": { "display_name": "venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 2 }