{ "cells": [ { "cell_type": "markdown", "id": "8e279bf6", "metadata": {}, "source": [ "# Model visualization\n", "\n", "When visualizing a model using the `show` API, there are a lot of layout options. In this notebook we will show how to edit the way that a visualization looks, and how to export it in various formats. There are also visualization features that are specific to schedulers, results and the simulator. These will be explored in the respective notebooks on these topics.\n", "\n", "**Note:** This notebook does not render properly in the HTML docs." ] }, { "cell_type": "markdown", "id": "ded0b1d4", "metadata": {}, "source": [ "## Javascript visualization\n", "Remember the car model from the introduction? You will notice that it does not have the same colors as it had in the introduction notebook. The reason for this is that in the introduction, we specified a different **Layout**." ] }, { "cell_type": "code", "execution_count": 1, "id": "9ec4af8d", "metadata": { "execution": { "iopub.execute_input": "2026-03-26T10:47:25.028450Z", "iopub.status.busy": "2026-03-26T10:47:25.028248Z", "iopub.status.idle": "2026-03-26T10:47:25.421365Z", "shell.execute_reply": "2026-03-26T10:47:25.420796Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", " Network\n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " \n", " \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from stormvogel import *\n", "\n", "vis = show(examples.create_car_mdp())\n", "# vis = show(examples.create_car_mdp(), show_editor=True) # with layout editor" ] }, { "cell_type": "markdown", "id": "e513d6eb", "metadata": {}, "source": [ "### Basic editing\n", "Let's edit the layout! The first thing that you need to do is open the layout editor by adding `show_editor = True` to the call to `show`.\n", "A menu will open up with a lot of different sections that can be opened by clicking on them. First of all, let's try to alter the colors of states and actions. Click on 'states' or 'actions' and then adjust 'bg color' by clicking on the box with a color. A color picker will open up. You will notice that there are a lot of different options, feel free to play around with them and see the changes to the model in real time.\n", "\n", "### Dragging nodes\n", "You can also change the position of nodes by selecting them in the displayed network, and moving them around. This does not require the editor, but your changes here can only be saved if you are using it.\n", "\n", "### Exploring\n", "Go to 'misc', set 'explore' to True and press the 'Reload' button. Now you can explore the model. Clicking on a node reveals its successors.\n", "\n", "### Edit groups\n", "In the model in the introduction notebook, states with different labels had different colors, but right now we only have a single group for states, and a single group for actions. You can change this by going to 'edit_groups'. By default, there are two groups: one for states and one for actions.\n", "* Remove both of them from the list by pressing the cross next to them. Now press the reload button at the bottom, and you will see that 'states' and 'actions' are removed from the editing menu.\n", "* Now open 'edit_groups' again and press the empty box. It will give you some options that correspond to the labels of the states that are present. Select 'green_light', 'red_light' and 'accident'. Press reload again. Now you can edit these groups and create a similar layout to the introduction notebook.\n", "\n", "### Saving layouts (including node positions)\n", "It is always useful to save your layout so that it won't be gone once you re-execute the cell. An easy way of doing this is by going to 'saving', and providing a path to store the json file that contains your layout. Then press 'Save'. If you re-execute the cell, and go to saving, enter the same name, and press 'Load', your layout will be back. In practice, it is more useful to also be able to load a layout without having to go through the menu. You can do this easily by adding `layout=Layout(\"filename.json\")` the call to show.\n", "\n", "### Exporting visualizations\n", "Visualizations in stormvogel are rendered to HTML. This means that you can also export them and embed them in other web pages. You can also export it to a vector image in svg or pdf format. The latter is easy to include in your latex projects by `\\includegraphics{export.pdf}`.\n", "\n", "**Note:** There are additional model visualization features for schedulers and results, but they will be explained in their respective notebooks." ] }, { "cell_type": "code", "execution_count": 2, "id": "2dc1b691", "metadata": { "execution": { "iopub.execute_input": "2026-03-26T10:47:25.428631Z", "iopub.status.busy": "2026-03-26T10:47:25.428319Z", "iopub.status.idle": "2026-03-26T10:47:25.431063Z", "shell.execute_reply": "2026-03-26T10:47:25.430601Z" } }, "outputs": [], "source": [ "# vis = show(examples.create_car_mdp(), show_editor=True, layout=Layout(\"layouts/car.json\"))\n", "# This enables the layout in \"layouts/car.json\", and turns on the layout editor.\n", "\n", "# Export the visualization in different formats:\n", "# vis.export(\"html\", \"vis_html\")\n", "# vis.export(\"svg\", \"vis_svg\")\n", "# vis.export(\"pdf\", \"vis_pdf\")" ] }, { "cell_type": "markdown", "id": "d53bacb3", "metadata": {}, "source": [ "### Advanced editing\n", "If the layout editor does not provide a visualization option that you need, it is also possible to edit the layout manually. The following code shows you what the default layout looks like. `Layout.layout` is a dictionary that stores all the layout information. You could edit this directly, but this can get annoying because it is a nested dictionary. We provide a method `set_value` to make this easier. Alternatively, If you have a lot of options that you want to change at the same time, it is probably easier to overwrite `Layout.layout` directly.\n", "\n", "Try outcommenting the third line in the next cell, and see the changes. under \"groups\". Then see the changes in the model by re-executing the final cell.\n", "\n", "The structure of the layout is derived from the vis.js library (that is also used to display the models). There are many other options that can be changed but which are not in the layout editor. For more information, we refer to the [vis.js documentation](https://visjs.github.io/vis-network/docs/network/#options)." ] }, { "cell_type": "code", "execution_count": 3, "id": "5f732b6e", "metadata": { "execution": { "iopub.execute_input": "2026-03-26T10:47:25.432736Z", "iopub.status.busy": "2026-03-26T10:47:25.432570Z", "iopub.status.idle": "2026-03-26T10:47:25.438109Z", "shell.execute_reply": "2026-03-26T10:47:25.437633Z" } }, "outputs": [ { "data": { "text/plain": [ "{'__fake_macros': {'__group_macro': {'borderWidth': 1,\n", " 'color': {'background': 'white',\n", " 'border': 'black',\n", " 'highlight': {'background': 'white', 'border': 'red'}},\n", " 'shape': 'ellipse',\n", " 'mass': 1,\n", " 'font': {'color': 'black', 'size': 14}}},\n", " 'edit_groups': {'groups': ['states', 'actions']},\n", " 'groups': {'actions': {'shape': 'box', 'color': {'background': 'lightblue'}},\n", " 'scheduled_actions': {'shape': 'box',\n", " 'color': {'background': 'pink', 'border': 'red'}},\n", " 'states': {'color': {'background': 'orange'}}},\n", " 'reload_button': False,\n", " 'edges': {'arrows': 'to',\n", " 'font': {'color': 'black',\n", " 'size': 14,\n", " 'strokeColor': 'white',\n", " 'strokeWidth': 2},\n", " 'color': {'color': 'black'},\n", " 'width': 1},\n", " 'numbers': {'visible': True,\n", " 'fractions': True,\n", " 'digits': 5,\n", " 'denominator_limit': 1000},\n", " 'results': {'show_results': True,\n", " 'result_symbol': '☆',\n", " 'result_colors': True,\n", " 'min_result_color': '#ffffff',\n", " 'max_result_color': '#ff0000'},\n", " 'state_properties': {'show_ids': False,\n", " 'show_rewards': True,\n", " 'reward_symbol': '€',\n", " 'show_zero_rewards': True,\n", " 'show_observations': True,\n", " 'observation_symbol': 'ʘ'},\n", " 'layout': {'randomSeed': 5},\n", " 'misc': {'enable_physics': True,\n", " 'width': 800,\n", " 'height': 600,\n", " 'explore': False},\n", " 'saving': {'relative_path': True,\n", " 'filename': 'layouts/NAME.json',\n", " 'save_button': False,\n", " 'load_button': False},\n", " 'positions': {},\n", " 'physics': True,\n", " 'autoResize': True}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_layout = layout.DEFAULT()\n", "my_layout.layout[\"groups\"][\"states\"] = {}\n", "my_layout.set_value([\"groups\", \"states\", \"color\", \"background\"], \"orange\")\n", "my_layout.layout" ] }, { "cell_type": "code", "execution_count": 4, "id": "1314362a", "metadata": { "execution": { "iopub.execute_input": "2026-03-26T10:47:25.439654Z", "iopub.status.busy": "2026-03-26T10:47:25.439483Z", "iopub.status.idle": "2026-03-26T10:47:25.466449Z", "shell.execute_reply": "2026-03-26T10:47:25.465898Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", " Network\n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " \n", " \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "vis = show(examples.create_car_mdp(), layout=my_layout)" ] }, { "cell_type": "markdown", "id": "1f8651a0", "metadata": {}, "source": [ "### Javascript injection\n", "If you want to customize the visualization even more, you can modify the source code, or you can use Javascript injection from a notebook. Yous can always use `IPython.display` to execute JavaScript code, and `f\"{vis.network_wrapper}.network\"` to retrieve the `vis.js` Network object. Also see `html_generation.py` and the documentation of `vis.js`.\n", "\n", "Here is a small example of javascript injection that destroys the network." ] }, { "cell_type": "code", "execution_count": 5, "id": "f1dacfea", "metadata": { "execution": { "iopub.execute_input": "2026-03-26T10:47:25.473610Z", "iopub.status.busy": "2026-03-26T10:47:25.473433Z", "iopub.status.idle": "2026-03-26T10:47:25.475749Z", "shell.execute_reply": "2026-03-26T10:47:25.475306Z" } }, "outputs": [], "source": [ "# import IPython.display as ipd\n", "# ipd.display(ipd.Javascript(\n", "# f\"\"\"{vis.network_wrapper}.network.destroy()\"\"\"))" ] }, { "cell_type": "markdown", "id": "8733f140", "metadata": {}, "source": [ "## Positioning algorithms\n", "We can use positioning algorithms from `networkx` to set the positions of nodes in the visualization, or create our own. Check out the [networkx documentation](https://networkx.org/documentation/stable/reference/drawing.html#module-networkx.drawing.layout) for a list of positioning algorithms." ] }, { "cell_type": "code", "execution_count": 6, "id": "decf4958", "metadata": { "execution": { "iopub.execute_input": "2026-03-26T10:47:25.477425Z", "iopub.status.busy": "2026-03-26T10:47:25.477219Z", "iopub.status.idle": "2026-03-26T10:47:25.505926Z", "shell.execute_reply": "2026-03-26T10:47:25.505388Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", " Network\n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " \n", " \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from stormvogel import *\n", "import networkx as nx\n", "\n", "\n", "def positioning(G):\n", " # return nx.bfs_layout(G, start=0) # Good for DAGs, we have to specify start=0\n", " # return nx.kamada_kawai_layout(G) # Good overal\n", " return nx.circular_layout(G)\n", "\n", "\n", "vis = show(\n", " examples.create_car_mdp(),\n", " pos_function=positioning,\n", " pos_function_scaling=300,\n", " layout=Layout(\"layouts/car.json\"),\n", ")" ] }, { "cell_type": "markdown", "id": "3b822680", "metadata": {}, "source": [ "## Matplotlib visualization\n", "Alternatively, we can also use matplotlib to display our models if we tell stormvogel to use \"mpl\" as the engine. The support for this is more limited." ] }, { "cell_type": "code", "execution_count": 7, "id": "85c26090", "metadata": { "execution": { "iopub.execute_input": "2026-03-26T10:47:25.513010Z", "iopub.status.busy": "2026-03-26T10:47:25.512827Z", "iopub.status.idle": "2026-03-26T10:47:26.649194Z", "shell.execute_reply": "2026-03-26T10:47:26.648631Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "vis = show(examples.create_car_mdp(), engine=\"mpl\", layout=Layout(\"layouts/car.json\"))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.13" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "2ae5c49e2b8246a382b769d413582511": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "49a6698c2e5d41ab8bb4292d1e3ccaf9": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_96741d8beacf43db8a4ef04223eaf6df", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "65e82fa5f58442ed8526921bf3258ad1": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_f3e4b2524a2c423f8a8523a0c4873e2f", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "86505a4320fd4d39bc10040dc1a71b38": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8919f1805e3b465b9a3c4c9c1ce45b00": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8c359055639445bfa815ffb1863de0a4": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_2ae5c49e2b8246a382b769d413582511", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "96741d8beacf43db8a4ef04223eaf6df": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b428335543e54fbba00093bbb088173b": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_8919f1805e3b465b9a3c4c9c1ce45b00", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "c0f5edf673dd4ef29830af2d7aaaa9f2": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_e51cc467133e4c229843480adb4e32af", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "dd7a9319f340419292a595f660a23198": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_86505a4320fd4d39bc10040dc1a71b38", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "e51cc467133e4c229843480adb4e32af": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f3e4b2524a2c423f8a8523a0c4873e2f": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }