{ "cells": [ { "cell_type": "code", "execution_count": 371, "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": 372, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
startendnameordercommentsizeoverlapoverlap_with
00131072BootROMNaNNaN131072True0.0
1704708_jump_bl1NaNNaN4True0.0
22582425996_boot_usbNaNNaN172True0.0
37584876008auth_bl1NaNNaN160True0.0
43368944033689448_boot_usb_raNaNNaN8False4.0
53369369633701888BL1NaNNaN8192False5.0
63370188833849344BL31NaNNaN147456False6.0
73384934434008336BL2NaNNaN158992True7.0
83398451234009088DebuggerNaNNaN24576True7.0
93400833634013184End of readable memory space in bufferNaNNaN4848True8.0
103434086434369536Debugger relocatedNaNNaN28672True10.0
113434086434340868_frederic_dest_ptrNaNNaN4True10.0
\n", "
" ], "text/plain": [ " start end name order \\\n", "0 0 131072 BootROM NaN \n", "1 704 708 _jump_bl1 NaN \n", "2 25824 25996 _boot_usb NaN \n", "3 75848 76008 auth_bl1 NaN \n", "4 33689440 33689448 _boot_usb_ra NaN \n", "5 33693696 33701888 BL1 NaN \n", "6 33701888 33849344 BL31 NaN \n", "7 33849344 34008336 BL2 NaN \n", "8 33984512 34009088 Debugger NaN \n", "9 34008336 34013184 End of readable memory space in buffer NaN \n", "10 34340864 34369536 Debugger relocated NaN \n", "11 34340864 34340868 _frederic_dest_ptr NaN \n", "\n", " comment size overlap overlap_with \n", "0 NaN 131072 True 0.0 \n", "1 NaN 4 True 0.0 \n", "2 NaN 172 True 0.0 \n", "3 NaN 160 True 0.0 \n", "4 NaN 8 False 4.0 \n", "5 NaN 8192 False 5.0 \n", "6 NaN 147456 False 6.0 \n", "7 NaN 158992 True 7.0 \n", "8 NaN 24576 True 7.0 \n", "9 NaN 4848 True 8.0 \n", "10 NaN 28672 True 10.0 \n", "11 NaN 4 True 10.0 " ] }, "execution_count": 372, "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['start'] = data['start'].apply(convert_to_int)\n", "data['end'] = data['end'].apply(convert_to_int)\n", "data['size'] = data['end'] - data['start']\n", "\n", "data.sort_values(by=['size'], inplace=True, ascending=False)\n", "data.sort_values(by=['start'], inplace=True)\n", "data.reset_index(drop=True, inplace=True)\n", "\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", "\n", "# Send warnings if sizes are negative\n", "if (data['size'] < 0).any():\n", " print(f'Warning: Negative sizes detected at indices {data[data[\"size\"] < 0].index}')\n", "\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inherent stacked block diagram" ] }, { "cell_type": "code", "execution_count": 373, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": "#856446" }, "mode": "text", "name": "BootROM", "text": "BootROM", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 0.5 ] }, { "marker": { "color": "#856446" }, "mode": "text", "showlegend": false, "text": "0x20000", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 3.84 ] }, { "marker": { "color": "#856446" }, "mode": "text", "showlegend": false, "text": "0x0", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 0.14 ] }, { "marker": { "color": "#82f92f" }, "mode": "text", "name": "_jump_bl1", "text": "_jump_bl1", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 1.52 ] }, { "marker": { "color": "#82f92f" }, "mode": "text", "showlegend": false, "text": "0x2c4", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 1.7100000000000002 ] }, { "marker": { "color": "#82f92f" }, "mode": "text", "showlegend": false, "text": "0x2c0", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 1.1600000000000001 ] }, { "marker": { "color": "#bd73ad" }, "mode": "text", "name": "_boot_usb", "text": "_boot_usb", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 2.52 ] }, { "marker": { "color": "#bd73ad" }, "mode": "text", "showlegend": false, "text": "0x658c", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 2.71 ] }, { "marker": { "color": "#bd73ad" }, "mode": "text", "showlegend": false, "text": "0x64e0", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 2.16 ] }, { "marker": { "color": "#7e8007" }, "mode": "text", "name": "auth_bl1", "text": "auth_bl1", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 3.52 ] }, { "marker": { "color": "#7e8007" }, "mode": "text", "showlegend": false, "text": "0x128e8", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 3.71 ] }, { "marker": { "color": "#7e8007" }, "mode": "text", "showlegend": false, "text": "0x12848", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 3.16 ] }, { "marker": { "color": "#7c5233" }, "mode": "text", "name": "_boot_usb_ra", "text": "_boot_usb_ra", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 4.5 ] }, { "marker": { "color": "#7c5233" }, "mode": "text", "showlegend": false, "text": "0x2020f68", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 4.84 ] }, { "marker": { "color": "#7c5233" }, "mode": "text", "showlegend": false, "text": "0x2020f60", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 4.14 ] }, { "marker": { "color": "#6f6733" }, "mode": "text", "name": "BL1", "text": "BL1", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 5.5 ] }, { "marker": { "color": "#6f6733" }, "mode": "text", "showlegend": false, "text": "0x2024000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 5.84 ] }, { "marker": { "color": "#6f6733" }, "mode": "text", "showlegend": false, "text": "0x2022000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 5.14 ] }, { "marker": { "color": "#86ce48" }, "mode": "text", "name": "BL31", "text": "BL31", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 6.5 ] }, { "marker": { "color": "#86ce48" }, "mode": "text", "showlegend": false, "text": "0x2048000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 6.84 ] }, { "marker": { "color": "#86ce48" }, "mode": "text", "showlegend": false, "text": "0x2024000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 6.14 ] }, { "marker": { "color": "#de3ae2" }, "mode": "text", "name": "BL2", "text": "BL2", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 7.5 ] }, { "marker": { "color": "#de3ae2" }, "mode": "text", "showlegend": false, "text": "0x206ed10", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 8.34 ] }, { "marker": { "color": "#de3ae2" }, "mode": "text", "showlegend": false, "text": "0x2048000", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 7.14 ] }, { "marker": { "color": "#292d88" }, "mode": "text", "name": "Debugger", "text": "Debugger", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 8.52 ] }, { "marker": { "color": "#292d88" }, "mode": "text", "showlegend": false, "text": "0x206f000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 8.709999999999999 ] }, { "marker": { "color": "#292d88" }, "mode": "text", "showlegend": false, "text": "0x2069000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 8.16 ] }, { "marker": { "color": "#5d64be" }, "mode": "text", "name": "End of readable memory space in buffer", "text": "End of readable memory space in buffer", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 9.52 ] }, { "marker": { "color": "#5d64be" }, "mode": "text", "showlegend": false, "text": "0x2070000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 9.709999999999999 ] }, { "marker": { "color": "#5d64be" }, "mode": "text", "showlegend": false, "text": "0x206ed10", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 9.16 ] }, { "marker": { "color": "#1db55c" }, "mode": "text", "name": "Debugger relocated", "text": "Debugger relocated", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 10.5 ] }, { "marker": { "color": "#1db55c" }, "mode": "text", "showlegend": false, "text": "0x20c7000", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 11.84 ] }, { "marker": { "color": "#1db55c" }, "mode": "text", "showlegend": false, "text": "0x20c0000", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 10.14 ] }, { "marker": { "color": "#3d7e32" }, "mode": "text", "name": "_frederic_dest_ptr", "text": "_frederic_dest_ptr", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 11.52 ] }, { "marker": { "color": "#3d7e32" }, "mode": "text", "showlegend": false, "text": "0x20c0004", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 11.709999999999999 ] }, { "marker": { "color": "#3d7e32" }, "mode": "text", "showlegend": false, "text": "0x20c0000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 11.16 ] } ], "layout": { "autosize": true, "font": { "size": 18 }, "height": 1200, "legend": { "title": { "text": "Function/Locations" } }, "margin": { "b": 20, "l": 200, "r": 20, "t": 20 }, "shapes": [ { "fillcolor": "#856446", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.9, "x1": 4.1, "y0": 0.08, "y1": 3.92 }, { "fillcolor": "#82f92f", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 1.1, "y1": 1.79 }, { "fillcolor": "#bd73ad", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 2.1, "y1": 2.79 }, { "fillcolor": "#7e8007", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 3.1, "y1": 3.79 }, { "fillcolor": "#7c5233", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 4.08, "y1": 4.92 }, { "fillcolor": "#6f6733", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 5.08, "y1": 5.92 }, { "fillcolor": "#86ce48", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 6.08, "y1": 6.92 }, { "fillcolor": "#de3ae2", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.9, "x1": 4.1, "y0": 7.08, "y1": 8.42 }, { "fillcolor": "#292d88", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 8.1, "y1": 8.79 }, { "fillcolor": "#5d64be", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 9.1, "y1": 9.79 }, { "fillcolor": "#1db55c", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.9, "x1": 4.1, "y0": 10.08, "y1": 11.92 }, { "fillcolor": "#3d7e32", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 11.1, "y1": 11.79 } ], "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, 5 ], "showgrid": false, "showticklabels": false, "tickvals": [ 0, 1, 2, 3, 4, 5 ] }, "yaxis": { "gridcolor": "black", "griddash": "longdashdot", "gridwidth": 0, "showgrid": false, "showticklabels": true, "tickvals": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ] } } } }, "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.08\n", "horizontal_gap = 0.1\n", "labels = pd.DataFrame()\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=4\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", "\n", " if d['overlap_with'] == i:\n", " y0=i\n", " y1=overlaps+i\n", " if i != data.shape[0]+1:\n", " if d['end'] > data.iloc[i+1].start and d['end'] < data.iloc[i+1].end:\n", " y1=overlaps+i-0.5\n", " x0=x0-horizontal_gap\n", " x1=x1+horizontal_gap\n", " else:\n", " y0=0.02+i\n", " y1=0.87+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+vertical_gap_percentage,\n", " y1=y1-vertical_gap_percentage,\n", " line=dict(width=2),\n", " fillcolor=fillcolor,\n", " opacity=0.5,\n", " layer=\"below\",\n", " )\n", "\n", " # Add middle text\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", " # Add top-left text with d['end']\n", " fig.add_trace(go.Scatter\n", " (\n", " x=[(x0+0.14+horizontal_gap)],\n", " y=[y1-0.16],\n", " text=hex(d['end']),\n", " mode=\"text\",\n", " textposition=\"middle center\",\n", " marker=dict(\n", " color=fillcolor,\n", " ),\n", " showlegend=False,\n", " ))\n", "\n", " # Add bottom-left text with d['end']\n", " fig.add_trace(go.Scatter\n", " (\n", " x=[(x0+0.14+horizontal_gap)],\n", " y=[y0+0.14],\n", " text=hex(d['start']),\n", " mode=\"text\",\n", " textposition=\"middle center\",\n", " marker=dict(\n", " color=fillcolor,\n", " ),\n", " showlegend=False,\n", " ))\n", "\n", "fig.update_xaxes(\n", " range=[0, 5],\n", " tickvals=[0, 1, 2, 3, 4, 5],\n", ")\n", "\n", "start_values = data['start'].sort_values()\n", "end_values = data['end'].sort_values()\n", "\n", "labels = []\n", "\n", "for i, d in data.iterrows():\n", " if i == 0:\n", " labels.append(f'{hex(start_values.iloc[i])}')\n", " elif i == len(data)-1:\n", " labels.append(f'{hex(end_values.iloc[i])}')\n", " else:\n", " labels.append(f'{hex(start_values.iloc[i])}
{hex(end_values.iloc[i-1])}')\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 }