{ "cells": [ { "cell_type": "code", "execution_count": 416, "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": 417, "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", " \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
43366050833689180Tried debugger spaceNaNNaN28672False4.0
53368944033689448_boot_usb_raNaNNaN8False5.0
63369369633701888BL1NaNNaN8192False6.0
73370188833849344BL31NaNNaN147456False7.0
83384934434008336BL2NaNNaN158992True8.0
93398451234009088DebuggerNaNNaN24576True8.0
103400833634013184End/Start peripheral space?NaNNaN4848True9.0
113434086434369536Debugger relocatedNaNNaN28672True11.0
123434086434340868_frederic_dest_ptrNaNNaN4True11.0
133437158434373632modem_interfaceNaNNaN2048False13.0
14346816512346836992mali@14AC0000NaNNaN20480False14.0
\n", "
" ], "text/plain": [ " start end name order comment size \\\n", "0 0 131072 BootROM NaN NaN 131072 \n", "1 704 708 _jump_bl1 NaN NaN 4 \n", "2 25824 25996 _boot_usb NaN NaN 172 \n", "3 75848 76008 auth_bl1 NaN NaN 160 \n", "4 33660508 33689180 Tried debugger space NaN NaN 28672 \n", "5 33689440 33689448 _boot_usb_ra NaN NaN 8 \n", "6 33693696 33701888 BL1 NaN NaN 8192 \n", "7 33701888 33849344 BL31 NaN NaN 147456 \n", "8 33849344 34008336 BL2 NaN NaN 158992 \n", "9 33984512 34009088 Debugger NaN NaN 24576 \n", "10 34008336 34013184 End/Start peripheral space? NaN NaN 4848 \n", "11 34340864 34369536 Debugger relocated NaN NaN 28672 \n", "12 34340864 34340868 _frederic_dest_ptr NaN NaN 4 \n", "13 34371584 34373632 modem_interface NaN NaN 2048 \n", "14 346816512 346836992 mali@14AC0000 NaN NaN 20480 \n", "\n", " overlap overlap_with \n", "0 True 0.0 \n", "1 True 0.0 \n", "2 True 0.0 \n", "3 True 0.0 \n", "4 False 4.0 \n", "5 False 5.0 \n", "6 False 6.0 \n", "7 False 7.0 \n", "8 True 8.0 \n", "9 True 8.0 \n", "10 True 9.0 \n", "11 True 11.0 \n", "12 True 11.0 \n", "13 False 13.0 \n", "14 False 14.0 " ] }, "execution_count": 417, "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", "\n", "# Inverse the order of the data\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": 418, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": "#c574e6" }, "mode": "text", "name": "BootROM", "text": "BootROM", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 0.5 ] }, { "marker": { "color": "#c574e6" }, "mode": "text", "showlegend": false, "text": "0x20000", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 3.84 ] }, { "marker": { "color": "#c574e6" }, "mode": "text", "showlegend": false, "text": "0x0", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 0.14 ] }, { "marker": { "color": "#094b47" }, "mode": "text", "name": "_jump_bl1", "text": "_jump_bl1", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 1.52 ] }, { "marker": { "color": "#094b47" }, "mode": "text", "showlegend": false, "text": "0x2c4", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 1.7100000000000002 ] }, { "marker": { "color": "#094b47" }, "mode": "text", "showlegend": false, "text": "0x2c0", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 1.1600000000000001 ] }, { "marker": { "color": "#f3ff4d" }, "mode": "text", "name": "_boot_usb", "text": "_boot_usb", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 2.52 ] }, { "marker": { "color": "#f3ff4d" }, "mode": "text", "showlegend": false, "text": "0x658c", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 2.71 ] }, { "marker": { "color": "#f3ff4d" }, "mode": "text", "showlegend": false, "text": "0x64e0", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 2.16 ] }, { "marker": { "color": "#7e3e97" }, "mode": "text", "name": "auth_bl1", "text": "auth_bl1", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 3.52 ] }, { "marker": { "color": "#7e3e97" }, "mode": "text", "showlegend": false, "text": "0x128e8", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 3.71 ] }, { "marker": { "color": "#7e3e97" }, "mode": "text", "showlegend": false, "text": "0x12848", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 3.16 ] }, { "marker": { "color": "#e36dac" }, "mode": "text", "name": "Tried debugger space", "text": "Tried debugger space", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 4.5 ] }, { "marker": { "color": "#e36dac" }, "mode": "text", "showlegend": false, "text": "0x2020e5c", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 4.84 ] }, { "marker": { "color": "#e36dac" }, "mode": "text", "showlegend": false, "text": "0x2019e5c", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 4.14 ] }, { "marker": { "color": "#9d6e7f" }, "mode": "text", "name": "_boot_usb_ra", "text": "_boot_usb_ra", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 5.5 ] }, { "marker": { "color": "#9d6e7f" }, "mode": "text", "showlegend": false, "text": "0x2020f68", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 5.84 ] }, { "marker": { "color": "#9d6e7f" }, "mode": "text", "showlegend": false, "text": "0x2020f60", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 5.14 ] }, { "marker": { "color": "#48e551" }, "mode": "text", "name": "BL1", "text": "BL1", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 6.5 ] }, { "marker": { "color": "#48e551" }, "mode": "text", "showlegend": false, "text": "0x2024000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 6.84 ] }, { "marker": { "color": "#48e551" }, "mode": "text", "showlegend": false, "text": "0x2022000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 6.14 ] }, { "marker": { "color": "#082a5a" }, "mode": "text", "name": "BL31", "text": "BL31", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 7.5 ] }, { "marker": { "color": "#082a5a" }, "mode": "text", "showlegend": false, "text": "0x2048000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 7.84 ] }, { "marker": { "color": "#082a5a" }, "mode": "text", "showlegend": false, "text": "0x2024000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 7.14 ] }, { "marker": { "color": "#12adbc" }, "mode": "text", "name": "BL2", "text": "BL2", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 8.5 ] }, { "marker": { "color": "#12adbc" }, "mode": "text", "showlegend": false, "text": "0x206ed10", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 9.34 ] }, { "marker": { "color": "#12adbc" }, "mode": "text", "showlegend": false, "text": "0x2048000", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 8.14 ] }, { "marker": { "color": "#afec87" }, "mode": "text", "name": "Debugger", "text": "Debugger", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 9.52 ] }, { "marker": { "color": "#afec87" }, "mode": "text", "showlegend": false, "text": "0x206f000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 9.709999999999999 ] }, { "marker": { "color": "#afec87" }, "mode": "text", "showlegend": false, "text": "0x2069000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 9.16 ] }, { "marker": { "color": "#680696" }, "mode": "text", "name": "End/Start peripheral space?", "text": "End/Start peripheral space?", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 10.52 ] }, { "marker": { "color": "#680696" }, "mode": "text", "showlegend": false, "text": "0x2070000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 10.709999999999999 ] }, { "marker": { "color": "#680696" }, "mode": "text", "showlegend": false, "text": "0x206ed10", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 10.16 ] }, { "marker": { "color": "#feeb63" }, "mode": "text", "name": "Debugger relocated", "text": "Debugger relocated", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 11.5 ] }, { "marker": { "color": "#feeb63" }, "mode": "text", "showlegend": false, "text": "0x20c7000", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 12.84 ] }, { "marker": { "color": "#feeb63" }, "mode": "text", "showlegend": false, "text": "0x20c0000", "textposition": "middle center", "type": "scatter", "x": [ 1.1400000000000001 ], "y": [ 11.14 ] }, { "marker": { "color": "#51c421" }, "mode": "text", "name": "_frederic_dest_ptr", "text": "_frederic_dest_ptr", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 12.52 ] }, { "marker": { "color": "#51c421" }, "mode": "text", "showlegend": false, "text": "0x20c0004", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 12.709999999999999 ] }, { "marker": { "color": "#51c421" }, "mode": "text", "showlegend": false, "text": "0x20c0000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 12.16 ] }, { "marker": { "color": "#a8b579" }, "mode": "text", "name": "modem_interface", "text": "modem_interface", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 13.5 ] }, { "marker": { "color": "#a8b579" }, "mode": "text", "showlegend": false, "text": "0x20c8000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 13.84 ] }, { "marker": { "color": "#a8b579" }, "mode": "text", "showlegend": false, "text": "0x20c7800", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 13.14 ] }, { "marker": { "color": "#521205" }, "mode": "text", "name": "mali@14AC0000", "text": "mali@14AC0000", "textposition": "middle center", "type": "scatter", "x": [ 2.5 ], "y": [ 14.5 ] }, { "marker": { "color": "#521205" }, "mode": "text", "showlegend": false, "text": "0x14ac5000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 14.84 ] }, { "marker": { "color": "#521205" }, "mode": "text", "showlegend": false, "text": "0x14ac0000", "textposition": "middle center", "type": "scatter", "x": [ 1.2400000000000002 ], "y": [ 14.14 ] } ], "layout": { "autosize": true, "font": { "size": 18 }, "height": 1200, "legend": { "title": { "text": "Function/Locations" } }, "margin": { "b": 20, "l": 200, "r": 20, "t": 20 }, "shapes": [ { "fillcolor": "#c574e6", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.9, "x1": 4.1, "y0": 0.08, "y1": 3.92 }, { "fillcolor": "#094b47", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 1.1, "y1": 1.79 }, { "fillcolor": "#f3ff4d", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 2.1, "y1": 2.79 }, { "fillcolor": "#7e3e97", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 3.1, "y1": 3.79 }, { "fillcolor": "#e36dac", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 4.08, "y1": 4.92 }, { "fillcolor": "#9d6e7f", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 5.08, "y1": 5.92 }, { "fillcolor": "#48e551", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 6.08, "y1": 6.92 }, { "fillcolor": "#082a5a", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 7.08, "y1": 7.92 }, { "fillcolor": "#12adbc", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.9, "x1": 4.1, "y0": 8.08, "y1": 9.42 }, { "fillcolor": "#afec87", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 9.1, "y1": 9.79 }, { "fillcolor": "#680696", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 10.1, "y1": 10.79 }, { "fillcolor": "#feeb63", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.9, "x1": 4.1, "y0": 11.08, "y1": 12.92 }, { "fillcolor": "#51c421", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 12.1, "y1": 12.79 }, { "fillcolor": "#a8b579", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 13.08, "y1": 13.92 }, { "fillcolor": "#521205", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 1, "x1": 4, "y0": 14.08, "y1": 14.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, 5 ], "showgrid": false, "showticklabels": false, "tickvals": [ 0, 1, 2, 3, 4, 5 ] }, "yaxis": { "autorange": "reversed", "gridcolor": "black", "griddash": "longdashdot", "gridwidth": 0, "showgrid": false, "showticklabels": true, "tickvals": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ] } } } }, "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", " autorange='reversed',\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 }