{ "cells": [ { "metadata": { "collapsed": true }, "cell_type": "markdown", "source": "# Simple Embedded Diagrams\n\nA wide variety of packages exist that support the creation of diagrams from written descriptions. Some of this operate at a low representation level, such as drawings defined using the LaTeX TikZ package, or the Graphviz dot language.\n\nThis notebook demonstrates a family of packages that can be used to generate a range of diagram types from simple representation languages defined to work with the packages.\n\nTypically, we would preinstall these packages into a custom environment to be used by module team members, students, or researchers so that they could be used directly and without any further installation requirements." }, { "metadata": { "trusted": true }, "cell_type": "code", "source": "#Scale SVG embeds\nfrom IPython.display import HTML\nstyle = \"\"\nHTML(style)", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "## `blockdiag` Family of figures\n\nRender the `blockdiag` family of figures using cell magic and figure descriptions written in a code cell.\n\n*The following cell may take some time to run as it installs the `blockdiag` package and IPython magic.*" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%capture\ntry:\n %load_ext blockdiag_magic\n #You only need to run this cell once per Azure Notebooks session\nexcept:\n !pip install blockdiag\n !pip install git+https://github.com/innovationOUtside/ipython_magic_blockdiag.git\n \n %load_ext blockdiag_magic", "execution_count": 2, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "*If you get an error after installing the packages when you try to run the `%%blockdiag` cell, restart the notebook kernel from the Kernel menu and then run the following cells again. You should not need to run the \"install\" cell above again.*\n\nIt would be handy if there was a `-s / --size` flag just to limit the size of the displayed image." }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "#%load_ext blockdiag_magic\n#For inline png - lower quality image if inkscape not available\n#%setdiagpng magic ", "execution_count": 18, "outputs": [] }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%blockdiag\n {\n A -> B -> C;\n B -> D;\n }", "execution_count": 3, "outputs": [ { "data": { "image/svg+xml": "\n \n \n \n \n \n blockdiag\n {\n A -> B -> C;\n B -> D;\n }\n\n \n \n \n \n \n A\n \n B\n \n C\n \n D\n \n \n \n \n \n \n \n \n", "text/plain": "" }, "metadata": {}, "output_type": "display_data" } ] }, { "metadata": {}, "cell_type": "markdown", "source": "As well as block diagrams, several other diagram types are supported. For example, *sequence diagrams*:" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%capture\n!pip install seqdiag", "execution_count": 4, "outputs": [] }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%seqdiag \n{\n browser -> webserver [label = \"GET /index.html\"];\n browser <-- webserver;\n browser -> webserver [label = \"POST /blog/comment\"];\n webserver -> database [label = \"INSERT comment\"];\n webserver <-- database;\n browser <-- webserver;\n}\n", "execution_count": 5, "outputs": [ { "data": { "image/svg+xml": "\n \n \n \n \n \n blockdiag\n {\n browser -> webserver [label = "GET /index.html"];\n browser <-- webserver;\n browser -> webserver [label = "POST /blog/comment"];\n webserver -> database [label = "INSERT comment"];\n webserver <-- database;\n browser <-- webserver;\n}\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n browser\n \n webserver\n \n database\n \n \n \n \n \n \n \n \n \n \n \n \n GET /index.html\n POST /blog/comment\n INSERT comment\n", "text/plain": "" }, "metadata": {}, "output_type": "display_data" } ] }, { "metadata": {}, "cell_type": "markdown", "source": "Or *activity diagrams*:" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%capture\n!pip install actdiag", "execution_count": 6, "outputs": [] }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%actdiag \n{\n A -> B -> C -> D;\n\n lane foo {\n A; B;\n }\n lane bar {\n C; D;\n }\n}", "execution_count": 7, "outputs": [ { "data": { "image/svg+xml": "\n \n \n \n \n \n blockdiag\n {\n A -> B -> C -> D;\n\n lane foo {\n A; B;\n }\n lane bar {\n C; D;\n }\n}\n\n \n \n \n \n \n foo\n \n bar\n \n \n \n \n A\n \n B\n \n C\n \n D\n \n \n \n \n \n \n \n \n", "text/plain": "" }, "metadata": {}, "output_type": "display_data" } ] }, { "metadata": {}, "cell_type": "markdown", "source": "Or communication *network diagrams*:" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%capture\n!pip install nwdiag", "execution_count": 8, "outputs": [] }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%nwdiag\n{\n network dmz {\n address = \"210.x.x.x/24\"\n\n web01 [address = \"210.x.x.1\"];\n web02 [address = \"210.x.x.2\"];\n }\n network internal {\n address = \"172.x.x.x/24\";\n\n web01 [address = \"172.x.x.1\"];\n db01;\n app01;\n }\n}", "execution_count": 9, "outputs": [ { "data": { "image/svg+xml": "\n \n \n \n \n \n blockdiag\n {\n network dmz {\n address = "210.x.x.x/24"\n\n web01 [address = "210.x.x.1"];\n web02 [address = "210.x.x.2"];\n }\n network internal {\n address = "172.x.x.x/24";\n\n web01 [address = "172.x.x.1"];\n db01;\n app01;\n }\n}\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n dmz\n 210.x.x.x/24\n internal\n 172.x.x.x/24\n \n 210.x.x.1\n \n 172.x.x.1\n \n web01\n \n 210.x.x.2\n \n web02\n \n \n db01\n \n \n app01\n", "text/plain": "" }, "metadata": {}, "output_type": "display_data" } ] }, { "metadata": {}, "cell_type": "markdown", "source": "Or *rack diagrams*:" }, { "metadata": { "scrolled": false, "trusted": false }, "cell_type": "code", "source": "%%rackdiag\n{\n // define 1st rack\n rack {\n 16U;\n\n // define rack items\n 1: UPS [2U];\n 3: DB Server\n 4: Web Server\n 5: Web Server\n 6: Web Server\n 7: Load Balancer\n 8: L3 Switch\n }\n\n // define 2nd rack\n rack {\n 12U;\n\n // define rack items\n 1: UPS [2U];\n 3: DB Server\n 4: Web Server\n 5: Web Server\n 6: Web Server\n 7: Load Balancer\n 8: L3 Switch\n }\n}", "execution_count": 13, "outputs": [ { "data": { "image/svg+xml": "\n \n \n \n \n \n blockdiag\n {\n // define 1st rack\n rack {\n 16U;\n\n // define rack items\n 1: UPS [2U];\n 3: DB Server\n 4: Web Server\n 5: Web Server\n 6: Web Server\n 7: Load Balancer\n 8: L3 Switch\n }\n\n // define 2nd rack\n rack {\n 12U;\n\n // define rack items\n 1: UPS [2U];\n 3: DB Server\n 4: Web Server\n 5: Web Server\n 6: Web Server\n 7: Load Balancer\n 8: L3 Switch\n }\n}\n\n \n \n \n 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n 10\n 11\n 12\n 13\n 14\n 15\n 16\n \n 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n 10\n 11\n 12\n \n UPS\n [2U]\n \n DB Server\n \n Web Server\n \n Web Server\n \n Web Server\n \n Load Balancer\n \n L3 Switch\n \n UPS\n [2U]\n \n DB Server\n \n Web Server\n \n Web Server\n \n Web Server\n \n Load Balancer\n \n L3 Switch\n", "text/plain": "" }, "metadata": {}, "output_type": "display_data" } ] }, { "metadata": {}, "cell_type": "markdown", "source": "## `tikz`\n\n`tikz` is a powerful *TeX* drawing package. See the notebook `3.2.0 Generating Embedded Diagrams.ipynb` for examples of various scientific diagrams that can be produced with this package." }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%capture\n#Try to load in the magic - if we can't, check everything we need is installed and try again\ntry:\n %load_ext tikz_magic\nexcept:\n !conda config --add channels conda-forge\n !conda install -y imagemagick\n !pip install --user git+https://github.com/innovationOUtside/ipython_magic_tikz\n %load_ext tikz_magic", "execution_count": 1, "outputs": [] }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%tikz -s 0.3\n\\draw[->](-5,0) -- (5,0); \n\\draw[->](0,-5) -- (0,5); \n\n\n\\draw[fill=blue!15,fill opacity=.25] (-3,-3) rectangle (3,3);\n\\draw[fill=green!15,fill opacity=.25] circle [radius=3cm]; \n\\draw[red,shift={(1,1)},rotate=45,fill=red!25,fill opacity=.5] %\n (1,1) -- (1,-1) -- (-1,-1) -- (-1,1) -- (1,1);\n\\draw[color=blue] plot (\\x,{sin(\\x r)}) node [draw] {$\\sin(x)$} ; \n", "execution_count": 7, "outputs": [ { "data": { "image/png": "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\n", "text/plain": "" }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ] }, { "metadata": {}, "cell_type": "markdown", "source": "The [tikz-penciline](https://github.com/renard/tikz-penciline) package (inspired by [this StackExchange answer?](https://tex.stackexchange.com/a/49961/151162); other XKCD-like styles available from that question) will do hand-drawn / sketch (almost XKCD) style drawings, but how do we install it in Azure notebooks?\n\nI've put a modified version of the file that can be loaded as a tex file in `./resources`, with usage as follows:" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "%%tikz --no-wrap -p ifthen,pgfplots -s 0.3\n%Note that we need to import the ifthen,pgfplotspackages, and \\input the modified tex file\n\\input{\"resources/penciline-tikz.tex\"}\n\n\\begin{tikzpicture}[penciline={jag ratio=10}]\n\\draw[penciline={jag ratio=5},->](-5,0) -- (5,0); \n\\draw[penciline={jag ratio=5},->](0,-5) -- (0,5); \n\n\\draw[decorate,fill=blue!15,fill opacity=.25] (-3,-3) rectangle (3,3);\n\\draw[penciline={jag ratio=0},fill=green!15,fill opacity=.25] circle [radius=3cm]; \n\\draw[decorate,red,shift={(1,1)},rotate=45,fill=red!25,fill opacity=.5] %\n (1,1) -- (1,-1) -- (-1,-1) -- (-1,1) -- (1,1);\n\\draw[penciline={jag ratio=0.1},color=blue] plot (\\x,{sin(\\x r)}) node [decorate,draw] {$\\sin(x)$} ; \n\\end{tikzpicture}", "execution_count": 11, "outputs": [ { "data": { "image/png": "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\n", "text/plain": "" }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ] }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "", "execution_count": null, "outputs": [] } ], "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3", "language": "python" }, "language_info": { "mimetype": "text/x-python", "nbconvert_exporter": "python", "name": "python", "pygments_lexer": "ipython3", "version": "3.5.4", "file_extension": ".py", "codemirror_mode": { "version": 3, "name": "ipython" } } }, "nbformat": 4, "nbformat_minor": 2 }