{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "KoHzO0q06_8W" }, "source": [ "# Introduction to Plotly\n", "\n", "## Introduction\n", "\n", "This notebook and accompanying webinar was developed and released by the [enDAQ team](https://endaq.com/). This is the third \"chapter\" of our series on *Python for Mechanical Engineers*:\n", "\n", "1. [Get Started with Python](https://colab.research.google.com/drive/1_pcGtgJleapV9tz5WfuRuqfWryjqhPHy#scrollTo=ikUJITDDIp19)\n", " * Blog: [Get Started with Python: Why and How Mechanical Engineers Should Make the Switch](https://blog.endaq.com/get-started-with-python-why-how-mechanical-engineers-should-make-the-switch)\n", "2. [Introduction to Numpy & Pandas for Data Analysis](https://colab.research.google.com/drive/1O-VwAdRoSlcrineAk0Jkd_fcw7mFGHa4#scrollTo=ce97q1ZcBiwj)\n", "3. **Introduction to Plotly for Plotting Data**\n", " * [Watch Recording of This](https://info.endaq.com/generate-beautiful-interactive-plots-using-plotly)\n", "4. [Introduction of the enDAQ Library](https://colab.research.google.com/drive/1WAtQ8JJC_ny0fki7eUABACMA-isZzKB6)\n", "\n", "To sign up for future webinars and watch previous ones, [visit our webinars page](https://endaq.com/pages/shock-vibration-webinars). " ] }, { "cell_type": "markdown", "metadata": { "id": "ajSFjHST7SQi" }, "source": [ "### Recap of Python Introduction\n", "\n", "1. Python is popular for good reason\n", "2. There are many ways to interact with Python\n", " * Here we are in Google Colab based on Jupyter Notebooks\n", "3. There are many open source libraries to use\n", " * Today we are covering Plotly for plotting\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "id": "qaGiLfTegy9y" }, "source": [ "## Why Do We Plot?\n", "\n", "- To Understand Relationships, Make an Observation\n", " - Interactivity Matters!\n", "- To Share & Present\n", " - Beautiful Matters!\n", "\n", "![all-plotly-images.png](https://info.endaq.com/hubfs/all-plotly-images.png)" ] }, { "cell_type": "markdown", "metadata": { "id": "QSrFA2gC6ZqF" }, "source": [ "## Overview of Python Plotting Libraries\n", "Like everything in Python, there are a few options for plotting data! We'll focus on Plotly but quickly cover:\n", "\n", "- Matplotlib \n", "- Seaborn \n", "- ggplot \n", "- bokeh\n", "- Plotly\n" ] }, { "cell_type": "markdown", "metadata": { "id": "uYc_2Ty26kr2" }, "source": [ "### Data Source\n", "For some shock data, we'll use the motorcycle crash test data discussed in our [blog post on pseudo velocity](https://blog.endaq.com/shock-analysis-response-spectrum-srs-pseudo-velocity-severity). This was filtered with a 150 low pass filter first to clean the signal using the endaq library (which uses SciPy under the hood)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YnuR0UR8A1Qk" }, "outputs": [], "source": [ "import pandas as pd\n", "\n", "df = pd.read_csv('https://info.endaq.com/hubfs/data/motorcycle-crash.csv',index_col=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 455 }, "id": "ucde1spPO4Z-", "outputId": "b1326ff5-b46c-4f8f-9fdf-06357944f499" }, "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", "
X (500g)Y (500g)Z (500g)
timestamp
0.00000-0.0555820.0333370.032217
0.00010-0.0567310.0415130.032720
0.00020-0.0569720.0498880.033106
0.00030-0.0562730.0583990.033419
0.00040-0.0546050.0669820.033706
............
0.199520.3836100.117662-0.292337
0.199620.4112700.135782-0.275515
0.199720.4383240.153832-0.258591
0.199820.4646400.171657-0.241783
0.199920.4900980.189112-0.225302
\n", "

2000 rows × 3 columns

\n", "
" ], "text/plain": [ " X (500g) Y (500g) Z (500g)\n", "timestamp \n", "0.00000 -0.055582 0.033337 0.032217\n", "0.00010 -0.056731 0.041513 0.032720\n", "0.00020 -0.056972 0.049888 0.033106\n", "0.00030 -0.056273 0.058399 0.033419\n", "0.00040 -0.054605 0.066982 0.033706\n", "... ... ... ...\n", "0.19952 0.383610 0.117662 -0.292337\n", "0.19962 0.411270 0.135782 -0.275515\n", "0.19972 0.438324 0.153832 -0.258591\n", "0.19982 0.464640 0.171657 -0.241783\n", "0.19992 0.490098 0.189112 -0.225302\n", "\n", "[2000 rows x 3 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": { "id": "zaiE4Vt9ArAz" }, "source": [ "### [Matplotlib](https://matplotlib.org/)\n", "The most popular plotting library and the default go-to. But... there is a new game in town!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 295 }, "id": "vMKn11JbBk-D", "outputId": "27d4925d-5999-4256-c7ef-76d68eaa5f3a" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.plot(df)\n", "plt.title('Motorcycle Crash Data')\n", "plt.ylabel('Acceleration (g)')\n", "plt.xlabel('Time (s)')\n", "plt.legend(df.columns)\n", "plt.grid(color='grey')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "FsPI2hk5CVvO" }, "source": [ "### [Seaborn](https://seaborn.pydata.org/)\n", "A wrapper around Matplotlib to simplify the interface, beautify the plots, and support more stats-based analysis. Here is their [documentation specifically on aesthetics](http://seaborn.pydata.org/tutorial/aesthetics.html), they care too!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 319 }, "id": "QPUM2ccqDrPD", "outputId": "e7442402-2bb9-4649-8fbb-b4b1f81da9ed" }, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'Time (s)')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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5+czffp0Nm/ejMFgaPL4P/3pT8TExHD77be3Q3RCdySarQShBcaPH8+2bdsAW6Gf+++/nz/+8Y8kJyczY8YMMjIyePvtt7nssssYO3YsW7ZssZ9bUVHBY489xujRo0lNTeXll1+2r110oW3bttG3b996ieOdd94hNTWV5ORkJk+ezPbt2+37hg0bxoYNG9rmQwsCInkIQqtav349s2bNYteuXSQmJnL77bejKAqbNm3id7/7HU8++aT92IULF6LValm9ejXLli1j69atjVYJPHLkSL01kI4fP87HH3/MkiVL2Lt3L++99169JbXj4uI4cuRI231QodsTyUMQWlFKSgqpqalotVqmTJlCSUkJd911FzqdjiuvvJKsrCzKy8spLCxk48aNPPbYY3h4eBAYGMitt97KypUrHb5uRUUFnp6e9p81Gg0mk4n09HTMZjORkZFER0fb93t6elJRUdHmn1fovkQ9D0FoRed3ULu5ueHv72/vYHdzcwOgurqa/Px8LBYLo0ePth+vKEqjS3/7+PhQVVVl/7lHjx489thjvP766xw7dozRo0ezcOFC+4q2VVVVeHt7t/rnE4SzxJOHIHSA0NBQ9Ho9O3bsYPfu3ezevZs9e/Y0+uSRkJBAZmZmvW0zZszg008/Zf369UiSxAsvvGDfl56eTkJCQlt+BKGbE8lDEDpAcHAwo0aN4tlnn6WyshJFUTh58iQ7d+50ePyoUaM4dAnoa5MAAADjSURBVOgQdXV1gK3PY/v27ZhMJvR6PQaDwV6UCWDXrl2MGTOmXT6L0D2J5CEIHeS5557DbDZz5ZVXMnToUO6//34KCgocHhsUFMTw4cNZt24dYKuP/eKLLzJ8+HBGjx5NcXExf/jDHwDbPI+NGzcye/bsdvssQvcj5nkIwiXi2LFjPPLIIyxZsgRJkho9bvHixeTk5PDwww+3Y3RCdyOShyAIgtBsotlKEARBaDaRPARBEIRmE8lDEARBaDaRPARBEIRmE8lDEARBaDaRPARBEIRmE8lDEARBaDaRPARBEIRm+38GGJZCJs+rlwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "\n", "sns.set_theme()\n", "\n", "p = sns.lineplot(data=df)\n", "p.set_title('Motorcycle Crash Data')\n", "p.set_ylabel('Acceleration (g)')\n", "p.set_xlabel('Time (s)')" ] }, { "cell_type": "markdown", "metadata": { "id": "HGNRmPT8CobM" }, "source": [ "### [ggplot](https://plotnine.readthedocs.io/en/stable/)\n", "Introduces a \"grammar of graphics\" logic to plotting data which allows explicit mapping of data to the visual representation. This is something plotly express excels at." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 519 }, "id": "3SPQ-2uHHmlP", "outputId": "9247ddbf-e5e9-4c52-d743-0bc80316099a" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/plotnine/utils.py:1246: FutureWarning: is_categorical is deprecated and will be removed in a future version. Use is_categorical_dtype instead\n", " if pdtypes.is_categorical(arr):\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from plotnine import ggplot, aes, geom_line\n", "\n", "df_ggplot = df.copy()\n", "df_ggplot['time'] = df.index\n", "df_ggplot = pd.melt(df_ggplot, id_vars='time')\n", "df_ggplot\n", "\n", "(\n", " ggplot(df_ggplot) # What data to use\n", " + aes(x=\"time\", y='value',color='variable') # What variable to use\n", " + geom_line() # Geometric object to use for drawing\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "GlKjxtvKCXze" }, "source": [ "### [Bokeh](https://bokeh.org/)\n", "Finally, we have interactivity!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 617 }, "id": "aOCCgBOjF3z4", "outputId": "2dc46091-dbb7-4eb2-a520-36c94e8c56be" }, "outputs": [ { "data": { "application/javascript": [ "\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", " var JS_MIME_TYPE = 'application/javascript';\n", " var HTML_MIME_TYPE = 'text/html';\n", " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " var CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " var script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " var cell = handle.cell;\n", "\n", " var id = cell.output_area._bokeh_element_id;\n", " var server_id = cell.output_area._bokeh_server_id;\n", " // Clean up Bokeh references\n", " if (id != null && id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd, {\n", " iopub: {\n", " output: function(msg) {\n", " var id = msg.content.text.trim();\n", " if (id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " var output_area = handle.output_area;\n", " var output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " var bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " var script_attrs = bk_div.children[0].attributes;\n", " for (var i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " var toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " var events = require('base/js/events');\n", " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", "\n", " \n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"
    \\n\"+\n", " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " var el = document.getElementById(null);\n", " if (el != null) {\n", " el.textContent = \"BokehJS is loading...\";\n", " }\n", " if (root.Bokeh !== undefined) {\n", " if (el != null) {\n", " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", "\n", " function on_error(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " }\n", "\n", " const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\": \"dM3QQsP+wXdHg42wTqW85BjZQdLNNIXqlPw/BgKoExPmTG7ZLML4EGqLMfqHT6ON\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\": \"8x57I4YuIfu8XyZfFo0XVr2WAT8EK4rh/uDe3wF7YuW2FNUSNEpJbsPaB1nJ2fz2\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\": \"3QTqdz9LyAm2i0sG5XTePsHec3UHWwVsrOL68SYRoAXsafvfAyqtQ+h440+qIBhS\"};\n", "\n", " for (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.async = false;\n", " element.src = url;\n", " if (url in hashes) {\n", " element.crossOrigin = \"anonymous\";\n", " element.integrity = \"sha384-\" + hashes[url];\n", " }\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " \n", " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\"];\n", " var css_urls = [];\n", " \n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " function(Bokeh) {\n", " \n", " \n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if (root.Bokeh !== undefined || force === true) {\n", " \n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", "\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(css_urls, js_urls, function() {\n", " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\": \"dM3QQsP+wXdHg42wTqW85BjZQdLNNIXqlPw/BgKoExPmTG7ZLML4EGqLMfqHT6ON\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\": \"8x57I4YuIfu8XyZfFo0XVr2WAT8EK4rh/uDe3wF7YuW2FNUSNEpJbsPaB1nJ2fz2\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\": \"3QTqdz9LyAm2i0sG5XTePsHec3UHWwVsrOL68SYRoAXsafvfAyqtQ+h440+qIBhS\"};\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n if (url in hashes) {\n element.crossOrigin = \"anonymous\";\n element.integrity = \"sha384-\" + hashes[url];\n }\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n \n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\"];\n var css_urls = [];\n \n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {\n \n \n }\n ];\n\n function run_inline_js() {\n \n if (root.Bokeh !== undefined || force === true) {\n \n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"df61d87b-06a4-4b92-bdc5-158ec0c046cd\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1013\"}],\"center\":[{\"id\":\"1016\"},{\"id\":\"1020\"},{\"id\":\"1050\"}],\"left\":[{\"id\":\"1017\"}],\"renderers\":[{\"id\":\"1038\"},{\"id\":\"1055\"},{\"id\":\"1073\"}],\"title\":{\"id\":\"1003\"},\"toolbar\":{\"id\":\"1028\"},\"x_range\":{\"id\":\"1005\"},\"x_scale\":{\"id\":\"1009\"},\"y_range\":{\"id\":\"1007\"},\"y_scale\":{\"id\":\"1011\"}},\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"text\":\"Motorcycle Crash Data\"},\"id\":\"1003\",\"type\":\"Title\"},{\"attributes\":{\"data_source\":{\"id\":\"1035\"},\"glyph\":{\"id\":\"1036\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1037\"},\"view\":{\"id\":\"1039\"}},\"id\":\"1038\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"data_source\":{\"id\":\"1070\"},\"glyph\":{\"id\":\"1071\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1072\"},\"view\":{\"id\":\"1074\"}},\"id\":\"1073\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"PanTool\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1027\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"source\":{\"id\":\"1070\"}},\"id\":\"1074\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"label\":{\"value\":\"Z (500g)\"},\"renderers\":[{\"id\":\"1073\"}]},\"id\":\"1089\",\"type\":\"LegendItem\"},{\"attributes\":{\"source\":{\"id\":\"1035\"}},\"id\":\"1039\",\"type\":\"CDSView\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"blue\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1072\",\"type\":\"Line\"},{\"attributes\":{\"overlay\":{\"id\":\"1027\"}},\"id\":\"1023\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1086\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data_source\":{\"id\":\"1052\"},\"glyph\":{\"id\":\"1053\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1054\"},\"view\":{\"id\":\"1056\"}},\"id\":\"1055\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1087\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1044\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis_label\":\"Time (s)\",\"formatter\":{\"id\":\"1041\"},\"major_label_policy\":{\"id\":\"1043\"},\"ticker\":{\"id\":\"1014\"}},\"id\":\"1013\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1011\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1041\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"red\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1037\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1026\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1005\",\"type\":\"DataRange1d\"},{\"attributes\":{\"axis\":{\"id\":\"1017\"},\"dimension\":1,\"ticker\":null},\"id\":\"1020\",\"type\":\"Grid\"},{\"attributes\":{\"label\":{\"value\":\"Y (500g)\"},\"renderers\":[{\"id\":\"1055\"}]},\"id\":\"1069\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"AllLabels\"},{\"attributes\":{\"line_color\":\"green\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1053\",\"type\":\"Line\"},{\"attributes\":{\"items\":[{\"id\":\"1051\"},{\"id\":\"1069\"},{\"id\":\"1089\"}]},\"id\":\"1050\",\"type\":\"Legend\"},{\"attributes\":{\"line_color\":\"red\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1036\",\"type\":\"Line\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"green\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1054\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1014\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1046\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"Selection\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]}},\"selected\":{\"id\":\"1087\"},\"selection_policy\":{\"id\":\"1086\"}},\"id\":\"1070\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"axis\":{\"id\":\"1013\"},\"ticker\":null},\"id\":\"1016\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1009\",\"type\":\"LinearScale\"},{\"attributes\":{\"label\":{\"value\":\"X (500g)\"},\"renderers\":[{\"id\":\"1038\"}]},\"id\":\"1051\",\"type\":\"LegendItem\"},{\"attributes\":{\"source\":{\"id\":\"1052\"}},\"id\":\"1056\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1018\",\"type\":\"BasicTicker\"},{\"attributes\":{\"axis_label\":\"Acceleration (g)\",\"formatter\":{\"id\":\"1044\"},\"major_label_policy\":{\"id\":\"1046\"},\"ticker\":{\"id\":\"1018\"}},\"id\":\"1017\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1066\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]}},\"selected\":{\"id\":\"1048\"},\"selection_policy\":{\"id\":\"1047\"}},\"id\":\"1035\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1067\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1007\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_color\":\"blue\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1071\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1047\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]}},\"selected\":{\"id\":\"1067\"},\"selection_policy\":{\"id\":\"1066\"}},\"id\":\"1052\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"active_multi\":null,\"tools\":[{\"id\":\"1021\"},{\"id\":\"1022\"},{\"id\":\"1023\"},{\"id\":\"1024\"},{\"id\":\"1025\"},{\"id\":\"1026\"}]},\"id\":\"1028\",\"type\":\"Toolbar\"}],\"root_ids\":[\"1002\"]},\"title\":\"Bokeh Application\",\"version\":\"2.3.3\"}};\n", " var render_items = [{\"docid\":\"df61d87b-06a4-4b92-bdc5-158ec0c046cd\",\"root_ids\":[\"1002\"],\"roots\":{\"1002\":\"42fb1006-c1ea-4bd4-894c-290148cf461e\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1002" } }, "output_type": "display_data" } ], "source": [ "from bokeh.plotting import figure, show\n", "from bokeh.io import output_notebook\n", "\n", "output_notebook()\n", "\n", "p = figure(title='Motorcycle Crash Data',\n", " x_axis_label='Time (s)',\n", " y_axis_label='Acceleration (g)')\n", "\n", "colors = ['red','green','blue']\n", "for c,color in zip(df.columns,colors):\n", " p.line(df.index, df[c], legend_label = c, line_color = color, line_width = 2)\n", "\n", "show(p)" ] }, { "cell_type": "markdown", "metadata": { "id": "p2XIvZx8CaZj" }, "source": [ "### [Plotly](https://plotly.com/python/)\n", "Interactive, beautiful, easy!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "e3JVBASvgw3K", "outputId": "715fcb36-41ff-4987-a15b-ebebd605218a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[K |████████████████████████████████| 23.9 MB 1.5 MB/s \n", "\u001b[?25h" ] } ], "source": [ "!pip install -U -q plotly" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "pIG_1OtRKKMJ", "outputId": "35c2fe20-dea4-43ee-e889-23596500704f" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import plotly.express as px\n", "import plotly.io as pio; pio.renderers.default = \"iframe\"\n", "\n", "fig = px.line(df)\n", "fig.update_layout(\n", " title_text = 'Motorcycle Crash Data',\n", " xaxis_title_text = \"Time (s)\",\n", " yaxis_title_text = \"Acceleration (g)\")\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "txW-MRL4Gt_n" }, "source": [ "## How Does Plotly Work?\n", "\n", "There are three main components to how/why Plotly works:\n", "\n", "1. [Python Library](https://plotly.com/python/)\n", "2. [Figure Objects](https://plotly.com/python/figure-structure/)\n", "3. [JavaScript Library](https://plotly.com/javascript/)\n", "\n", "To illustrate this relationship, let's make a Plotly Treemap!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "t94vcvp6u8cM" }, "outputs": [], "source": [ "df_tree = pd.DataFrame({\n", " 'names': [\"Plotly\",\"Python\", \"Figure Object\", \"JavaScript\", \"Express\", \"Graph Objects\",\"Data\",\"Layout\",'Frames',\"Plotly.js\"],\n", " 'parents' : [\"\", \"Plotly\", \"Plotly\", \"Plotly\", \"Python\",'Express',\"Figure Object\",\"Figure Object\",\"Figure Object\",\"JavaScript\"]\n", "})" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "cvEVck2qZMN8", "outputId": "3f8d61f3-4d4b-4a80-b4f3-a2351007cbce" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.treemap(\n", " names = df_tree.names,\n", " parents = df_tree.parents\n", ")\n", "fig.update_traces(root_color=\"lightgrey\")\n", "fig.update_layout(\n", " font_family='Open Sans',\n", " font_size=32)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "el78zq4XFs_O" }, "source": [ "Plotly Express was introduced in May 2019 and is a GAME CHANGER! [Here is the introduction article](https://medium.com/plotly/introducing-plotly-express-808df010143d):\n", "\n", "![plotly-introduces-express.png](https://info.endaq.com/hubfs/plotly-introduces-express.png)" ] }, { "cell_type": "markdown", "metadata": { "id": "ofrZT194DHtc" }, "source": [ "## Shoutout to Plotly's Docs\n", "\n", "Before we proceed, I want to really stress how good the docs are from Plotly. They have a TON of examples, and very good documentation. We'll be focusing on [Plotly Express](https://plotly.com/python/plotly-express/).\n", "\n", "![plotly-express-plot-types.gif](https://info.endaq.com/hubfs/plotly-express-plot-types.gif)\n", "\n", "They also have their own [community forum](https://community.plotly.com/c/graphing-libraries/python/10) that is pretty rich with examples and people helping each other out." ] }, { "cell_type": "markdown", "metadata": { "id": "XDg7wf-Lnz_P" }, "source": [ "## Styling Figures" ] }, { "cell_type": "markdown", "metadata": { "id": "5BylLEINjbax" }, "source": [ "### Example Data\n", "Here, to mix it up, we'll calculate a shock response spectrum from the acceleration data to then be plotting on a log log scale to help show how to style that." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "_9II23tqUTEH" }, "outputs": [], "source": [ "!pip install -q endaq\n", "import endaq\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "58q1IUwOgz-8" }, "outputs": [], "source": [ "def get_log_freqs(df,init_freq=1,bins_per_octave=12):\n", " \"\"\"Given a timebased dataframe, return a log spaced frequency array up to the Nyquist frequency\"\"\"\n", " fs = (df.shape[0]-1)/(df.index[-1]-df.index[0])\n", " return 2 ** np.arange(np.log2(init_freq),\n", " np.log2(fs/2),\n", " 1/bins_per_octave)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "PSvthpCVUSA4" }, "outputs": [], "source": [ "df_pvss = endaq.calc.shock.pseudo_velocity(df, \n", " get_log_freqs(df,init_freq=1,bins_per_octave=12),\n", " damp=0.05, two_sided=False)\n", "df_pvss = df_pvss*9.81*39.37 #convert to in/s" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 454 }, "id": "hrcT3dXiG_3O", "outputId": "efbc591e-f172-4504-f3b5-0c17eb717c94" }, "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", "
X (500g)Y (500g)Z (500g)
frequency (Hz)
1.00000047.804683473.402407148.658683
1.05946349.240508493.307994154.812945
1.12246250.532563513.039780160.893921
1.18920751.637517532.374454166.829370
1.25992152.551121551.046158172.533775
............
3866.1091850.4378521.0258650.681822
4096.0000000.4132560.9682760.643536
4339.5608340.3900470.9139230.607404
4597.6045500.3681450.8626230.573305
4870.9923430.3474780.8142050.541124
\n", "

148 rows × 3 columns

\n", "
" ], "text/plain": [ " X (500g) Y (500g) Z (500g)\n", "frequency (Hz) \n", "1.000000 47.804683 473.402407 148.658683\n", "1.059463 49.240508 493.307994 154.812945\n", "1.122462 50.532563 513.039780 160.893921\n", "1.189207 51.637517 532.374454 166.829370\n", "1.259921 52.551121 551.046158 172.533775\n", "... ... ... ...\n", "3866.109185 0.437852 1.025865 0.681822\n", "4096.000000 0.413256 0.968276 0.643536\n", "4339.560834 0.390047 0.913923 0.607404\n", "4597.604550 0.368145 0.862623 0.573305\n", "4870.992343 0.347478 0.814205 0.541124\n", "\n", "[148 rows x 3 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_pvss" ] }, { "cell_type": "markdown", "metadata": { "id": "UHtmCtgwjmZP" }, "source": [ "### Manually Defining the Theme\n", "First let's start by plotting with the standard theme, modifying only the titles. We'll also define the scale on the x and y axis to be a log scale." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "CBUorCv5i8i0", "outputId": "b02f5468-f8cb-4cd5-ea50-17a770d9cca1" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_pvss)\n", "fig.update_layout(\n", " title_text = 'Motorcycle Crash Data',\n", " xaxis_title_text = \"Natural Frequency (Hz)\",\n", " yaxis_title_text = \"Pseudo Velocity (in/s)\",\n", " xaxis_type = \"log\",\n", " yaxis_type = \"log\")\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "u_pZeZ5An8PG" }, "source": [ "Now let's get crazy and customize all the \"common\" settings. But note that there are a LOT of different parameters that can be explicitly defined. Remember, Plotly has very thorough documentation, so check it out!\n", "* [Figure Layout](https://plotly.com/python/reference/layout/)\n", "* [X Axis](https://plotly.com/python/reference/layout/xaxis/)\n", "* [Y Axis](https://plotly.com/python/reference/layout/yaxis/)\n", "\n", "You will need to [download Open Sans](https://fonts.google.com/specimen/Open+Sans) if you like the font like me too! To pick colors, I suggest [Color Hex](https://www.colorhexa.com/)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 617 }, "id": "xt7fDuSVjz98", "outputId": "f7594969-4aa1-49ca-d7f2-abe20d51d8a2" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_pvss)\n", "fig.update_layout(\n", " font_family='Open Sans',\n", " font_size=16,\n", " font_color='#404041',\n", "\n", " title_text = 'Motorcycle Crash Data',\n", " title_font_family = 'Showcard Gothic',\n", " title_font_size = 32,\n", " title_font_color = '#e77025',\n", " title_x = 0.5,\n", "\n", " xaxis_title_text = \"Natural Frequency (Hz)\",\n", " xaxis_title_font_family = 'Algerian',\n", " xaxis_title_font_size = 24,\n", " xaxis_title_font_color = '#7f3f98',\n", " xaxis_type = 'log',\n", "\n", " yaxis_title_text =\"Pseudo Velocity (in/s)\",\n", " yaxis_title_font_family = 'Playbill',\n", " yaxis_title_font_size = 24,\n", " yaxis_title_font_color = '#be1e2d',\n", " yaxis_type = 'log',\n", "\n", " legend_bgcolor = 'yellow',\n", " legend_title_text = 'Legend',\n", " legend_title_font_size = 24,\n", " legend_orientation = 'v',\n", " legend_y = 1.0,\n", " legend_yanchor = 'top',\n", " legend_x = 1.0,\n", " legend_xanchor = 'right',\n", "\n", " plot_bgcolor = '#f3f3f3',\n", "\n", " width = 800,\n", " height = 600)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "Qb2fkhQ4o4Xw" }, "source": [ "One thing that Plotly does which is REALLY cool is that they use [\"magic underscore notation\"](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation) which means that this:\n", "\n", "```\n", "yaxis_title_font_family = 'Open Sans ExtraBold'\n", "```\n", "\n", "is the equivalent of this:\n", "\n", "```\n", "{'yaxis': \n", " {'title': \n", " {'font': \n", " {'family': 'Open Sans ExtraBold'}\n", " }\n", " }\n", "}\n", "```\n", "\n", "Now I am particular about my plots and how they look, I think aesthetics matter! So I can create a few custom themes that can be added to figures when making them." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "HByhpT7Us6zE" }, "outputs": [], "source": [ "template_light = dict(\n", " template=\"presentation\",\n", "\n", " font_family='Open Sans',\n", " font_size=16,\n", " font_color='#404041',\n", "\n", " title_font_family = 'Open Sans ExtraBold',\n", " title_font_size = 24,\n", " title_x = 0.5,\n", "\n", " xaxis_title_font_family = 'Open Sans ExtraBold',\n", " xaxis_title_font_size = 20,\n", "\n", " yaxis_title_font_family = 'Open Sans ExtraBold',\n", " yaxis_title_font_size = 20,\n", "\n", " legend_title='',\n", " legend_orientation='h',\n", " legend_y = -0.2,\n", " \n", " plot_bgcolor = '#f3f3f3',\n", " yaxis_gridcolor = '#dad9d8',\n", " yaxis_linecolor = '#404041',\n", " yaxis_mirror = True,\n", " xaxis_gridcolor = '#dad9d8',\n", " xaxis_linecolor = '#404041',\n", " xaxis_mirror = True, \n", " )\n", "\n", "template_dark = template_light.copy()\n", "template_dark['template'] = \"plotly_dark\"\n", "template_dark['font_color'] = '#f3f3f3'\n", "template_dark['plot_bgcolor'] = \"#111111\"\n", "template_dark['yaxis_linecolor'] = \"#404041\"\n", "template_dark['xaxis_linecolor'] = \"#404041\"\n", "template_dark['yaxis_gridcolor'] = \"#404041\"\n", "template_dark['xaxis_gridcolor'] = \"#404041\"\n" ] }, { "cell_type": "markdown", "metadata": { "id": "h8a0t-zOhqU3" }, "source": [ "I also tend to make a lot of similar plots, so it can be helpful to define some axes labels and types as variables." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "aFVj6ui3hqrq" }, "outputs": [], "source": [ "template_pvss = dict(\n", " xaxis_title_text = \"Natural Frequency (Hz)\",\n", " xaxis_type = 'log',\n", " yaxis_title_text =\"Pseudo Velocity (in/s)\",\n", " yaxis_type = 'log'\n", ")\n", "\n", "template_psd = dict(\n", " xaxis_title_text = \"Frequency (Hz)\",\n", " xaxis_type = 'log',\n", " yaxis_title_text =\"Acceleration (g^2/Hz)\",\n", " yaxis_type = 'log'\n", " )\n", "\n", "template_accel = dict(\n", " xaxis_title_text = \"Time (s)\",\n", " yaxis_title_text =\"Acceleration (g)\",\n", " )" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "Tnhsk_KEt9la", "outputId": "412f9f03-5364-4b95-c69b-6c4ccf03e330" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_pvss)\n", "fig.update_layout(\n", " {**template_light, **template_pvss}, \n", " title_text = 'Custom Light Theme')\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "vp4V4Rdttp_U", "outputId": "eeadf11e-2fd7-4610-a618-e2d991788962" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_pvss)\n", "fig.update_layout(\n", " {**template_dark, **template_pvss}, \n", " title_text = 'Custom Dark Theme')\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "U1pXcpwYn3jr" }, "source": [ "### Themes\n", "As you may have noticed, I used some templates in my custom theme. There are a few to pick from and you can make your own as well. This is [well documented with examples on Plotly's website](https://plotly.com/python/templates/)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "g7Aoulh-x7Q4", "outputId": "72756053-ce8c-41f2-f594-d9633b5f7e7e" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "themes = [\"plotly\", \"plotly_white\", \"plotly_dark\", \"ggplot2\", \"seaborn\", \"simple_white\", 'presentation', \"none\"]\n", "\n", "for theme in themes:\n", " fig = px.line(df_pvss)\n", " fig.update_layout(\n", " template_pvss,\n", " template = theme,\n", " title_text = theme,\n", " )\n", " fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "QGRcNy7D8byt" }, "source": [ "### Colors\n", "\n", "Plotly also supports a whole range of different color schemes you can implement. There are a lot of built in ones and remember, [great documentation](https://plotly.com/python/discrete-color/)!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 777 }, "id": "iKGjZOrF8dmV", "outputId": "d096552e-cb4c-4578-f6d8-5188fc92ef52" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "px.colors.qualitative.swatches().show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "OgnSo_jz5wEi", "outputId": "c8e86dbe-11bc-4e6f-f65d-130c0eb6b71c" }, "outputs": [ { "data": { "text/plain": [ "['#AA0DFE',\n", " '#3283FE',\n", " '#85660D',\n", " '#782AB6',\n", " '#565656',\n", " '#1C8356',\n", " '#16FF32',\n", " '#F7E1A0',\n", " '#E2E2E2',\n", " '#1CBE4F',\n", " '#C4451C',\n", " '#DEA0FD',\n", " '#FE00FA',\n", " '#325A9B',\n", " '#FEAF16',\n", " '#F8A19F',\n", " '#90AD1C',\n", " '#F6222E',\n", " '#1CFFCE',\n", " '#2ED9FF',\n", " '#B10DA1',\n", " '#C075A6',\n", " '#FC1CBF',\n", " '#B00068',\n", " '#FBE426',\n", " '#FA0087']" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "px.colors.qualitative.Alphabet" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "AgqG2Q5tbuuA", "outputId": "d6281df6-24f1-49f8-eeee-2ed95d3ea7c1" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "px.colors.sequential.swatches_continuous().show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jjjDRkU1cDPc", "outputId": "467da770-b222-4549-efd2-a6d8cf67bd3c" }, "outputs": [ { "data": { "text/plain": [ "['rgb(0,0,0)',\n", " 'rgb(230,0,0)',\n", " 'rgb(230,210,0)',\n", " 'rgb(255,255,255)',\n", " 'rgb(160,200,255)']" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "px.colors.sequential.Blackbody" ] }, { "cell_type": "markdown", "metadata": { "id": "wHps2P-sIdLn" }, "source": [ "Here I'm going to make my own swatch of some kind with a custom color scale." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 217 }, "id": "_9Snv7DQ-3bP", "outputId": "da254e8d-f523-4098-e7a3-8fe588ec0249" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "colors = ['#EE7F27', '#6914F0', '#2DB473', '#D72D2D', '#3764FF', '#FAC85F','#27eec0','#b42d4d','#82d72d','#e35ffa']\n", "fig = px.bar(x=np.arange(10),\n", " y=np.zeros(10)+1,\n", " color=colors,\n", " color_discrete_sequence=colors,\n", " height=200)\n", "fig.update_layout(template_dark,\n", " font_color=\"#111111\",\n", " legend_font_color=\"white\")\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "Uxehj8NVJG7a" }, "source": [ "When creating a figure you can specify the color sequence you'd like as a parameter. You can use a custom list like what I'm showing here or you can call one of the `px.colors.qualitative.` lists." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "vZFByyb_-9T_", "outputId": "1ec21b65-907f-4a01-911d-415d39eb2a28" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_pvss,\n", " color_discrete_sequence=colors)\n", "\n", "fig.update_layout(\n", " {**template_dark, **template_pvss}, \n", " title_text = 'Custom Colors & Dashes')\n", "\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "13xNBqIGqFxa" }, "source": [ "## Saving Figures\n", "\n", "To save static images, first you need to install kaleido." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "VdmYIDkjqiXY", "outputId": "ea6117de-e427-4b76-c63b-ebc1d83da716" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting kaleido\n", " Downloading kaleido-0.2.1-py2.py3-none-manylinux1_x86_64.whl (79.9 MB)\n", "\u001b[K |████████████████████████████████| 79.9 MB 85 kB/s \n", "\u001b[?25hInstalling collected packages: kaleido\n", "Successfully installed kaleido-0.2.1\n" ] } ], "source": [ "!pip install -U kaleido" ] }, { "cell_type": "markdown", "metadata": { "id": "Wzx2d_eMr53f" }, "source": [ "In colab only you'll also need to do this install." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "j4402HnKrfnl" }, "outputs": [], "source": [ "!wget https://github.com/plotly/orca/releases/download/v1.2.1/orca-1.2.1-x86_64.AppImage -O /usr/local/bin/orca\n", "!chmod +x /usr/local/bin/orca\n", "!apt-get install xvfb libgtk2.0-0 libgconf-2-4" ] }, { "cell_type": "markdown", "metadata": { "id": "0YBL_pPds41u" }, "source": [ "Now saving an image is easy and they support a few types. More information and options available in their [docs](https://plotly.com/python/static-image-export/)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "VrJ0rET8qXlw" }, "outputs": [], "source": [ "fig.write_image(\"fig.png\")\n", "fig.write_image(\"fig.jpeg\")\n", "fig.write_image(\"fig.svg\")\n", "fig.write_image(\"fig.pdf\")" ] }, { "cell_type": "markdown", "metadata": { "id": "ucPvHfwytHgc" }, "source": [ "You can also keep the interactivity by downloading an HTML file, either with or without the plotly javascript library. You'll need the library if you want to view the plots when you don't have internet access. For more, see their [docs on saving HTML files](https://plotly.github.io/plotly.py-docs/generated/plotly.io.write_html.html)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "2ZJ77bSYsd4A" }, "outputs": [], "source": [ "fig.write_html('fig-full.html') \n", "fig.write_html('fig-small.html',full_html=False,include_plotlyjs='cdn') " ] }, { "cell_type": "markdown", "metadata": { "id": "FEaStjQs4926" }, "source": [ "## Plot Types\n", "\n", "Remember Plotly has [GREAT documentation](https://plotly.com/python/), and LOTS of plot types. Below is a GIF of their main page on all the different plot types:\n", "\n", "![plotly-python-plot-types.gif](https://info.endaq.com/hubfs/plotly-python-plot-types.gif)\n", "\n", "Now here are the gallery of plots all in plotly.express meaning they are super easy to create! Again, [check out the docs](https://plotly.com/python/plotly-express/):\n", "\n", "![plotly-express-plot-types.gif](https://info.endaq.com/hubfs/plotly-express-plot-types.gif)\n", "\n", "Now we'll go through a few relevant examples for mechanical engineers and vibration analysis." ] }, { "cell_type": "markdown", "metadata": { "id": "qrX0zTrWSjIm" }, "source": [ "### Bubble" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "-BmhP4VaZ32C", "outputId": "88e0d2d1-46e6-480d-976f-737681c7172c" }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
serial_number_idfile_namefile_sizerecording_lengthrecording_tsaccelerationPeakFullpsuedoVelocityPeakFullaccelerationRMSFullvelocityRMSFulldisplacementRMSFullpressureMeanFulltemperatureMeanFull
111145650_Joules_900_lbs-1629315312.ide159775020.2017522021-07-26 19:56:39231.2122907.6502.42354.5071.06698.74524.175
1011456100_Joules_900_lbs-1629315313.ide159671420.2006232021-07-26 19:21:55218.6342961.2562.87753.8751.05398.75124.180
229695Tilt_000000-1625156721.IDE71940323.3551632021-07-01 16:21:010.378330.9460.04411.0420.34599.51026.410
711162Calibration-Shake-1632515140.IDE221813027.8826902021-05-17 19:16:108.7831142.2822.71246.3460.617102.25124.545
1711071surgical-instrument-1625829182.ide5419946.9511722021-04-22 16:53:105.739387.3121.56824.4180.24299.87921.889
810916FUSE_HSTAB_000005-1632515139.ide53756218.4917912021-04-22 16:13:240.20253.3750.0111.5040.03690.70618.874
210118Bolted-1632515144.ide614922929.3961182021-04-21 21:44:0715.343148.2762.39814.1010.15499.65223.172
209680LOC__6__DAQ41551_25_01-1625170793.IDE866423863.8789372021-03-25 04:53:27564.9662357.59954.408145.2233.088102.87526.031
199680LOC__4__DAQ41551_15_05-1625170794.IDE692795864.4860542021-03-25 04:22:10585.8632153.02046.528148.5912.615105.75032.202
189680LOC__3__DAQ41551_11_01_02-1625170795.IDE234329228.4568182021-03-25 04:06:19622.0408907.94994.197372.0499.580105.68233.452
219680LOC__2__DAQ38060_06_03_05-1625170793.IDE151917227.0576472021-03-25 02:54:22995.6705845.241131.087323.2873.144104.47325.616
1211046Drive-Home_07-1626805222.ide36225758634.7320562021-03-19 19:35:5723.805356.1280.0976.1170.135101.98828.832
511046Drive-Home_01-1632515142.ide363279961.7553712021-03-19 18:35:550.47940.1970.0211.0810.023100.28429.061
1410030200922_Moto_Max_Run5_Control_Larry-1626297441.ide478089399.3251342020-09-22 23:47:3529.8641280.3493.52855.5691.060NaNNaN
09695train-passing-1632515146.ide1049260273.6123352020-04-29 18:20:367.513419.9440.3726.9690.061104.62023.432
159695ford_f150-1626296561.ide960970591207.6783442020-03-13 23:35:08NaNNaNNaNNaNNaNNaNNaN
49295Seat-Base_21-1632515142.ide524883683.0922552019-12-08 10:16:501.085251.0090.1307.3180.19098.93017.820
19316Seat-Top_09-1632515145.ide10491986172.7045592019-12-08 10:14:311.10586.5950.0821.5350.04098.73320.133
167530Motorcycle-Car-Crash-1626277852.ide10489262151.0693362019-07-03 17:02:52480.73712831.5901.732143.4373.988100.36326.989
60HiTest-Shock-1632515141.ide265589420.3318482018-12-04 15:22:54619.1786058.09311.645167.8354.055101.1269.538
135120Mining-SSX28803_06-1626457584.IDE4029206863238.1192022018-09-14 19:28:24NaNNaNNaNNaNNaNNaNNaN
99874Coffee_002-1631722736.IDE60959516769.2998962000-03-03 20:02:242.6981338.3960.0595.6060.104100.33924.540
310309RMI-2000-1632515143.ide590963260.2508551970-01-01 00:00:240.33217.2870.0791.2470.005100.46721.806
\n", "
" ], "text/plain": [ " serial_number_id ... temperatureMeanFull\n", "11 11456 ... 24.175\n", "10 11456 ... 24.180\n", "22 9695 ... 26.410\n", "7 11162 ... 24.545\n", "17 11071 ... 21.889\n", "8 10916 ... 18.874\n", "2 10118 ... 23.172\n", "20 9680 ... 26.031\n", "19 9680 ... 32.202\n", "18 9680 ... 33.452\n", "21 9680 ... 25.616\n", "12 11046 ... 28.832\n", "5 11046 ... 29.061\n", "14 10030 ... NaN\n", "0 9695 ... 23.432\n", "15 9695 ... NaN\n", "4 9295 ... 17.820\n", "1 9316 ... 20.133\n", "16 7530 ... 26.989\n", "6 0 ... 9.538\n", "13 5120 ... NaN\n", "9 9874 ... 24.540\n", "3 10309 ... 21.806\n", "\n", "[23 rows x 12 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_table = pd.read_csv('https://info.endaq.com/hubfs/data/endaq-cloud-table.csv')\n", "df_table = df_table[['serial_number_id', 'file_name', 'file_size', 'recording_length', 'recording_ts',\n", " 'accelerationPeakFull', 'psuedoVelocityPeakFull', 'accelerationRMSFull',\n", " 'velocityRMSFull', 'displacementRMSFull', 'pressureMeanFull', 'temperatureMeanFull']].copy()\n", "\n", "df_table['recording_ts'] = pd.to_datetime(df_table['recording_ts'], unit='s') \n", "df_table = df_table.sort_values(by=['recording_ts'], ascending=False) \n", "df_table " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "3C2LUCj4aLjq", "outputId": "6ecb3d38-f87d-4e99-c73a-c0b8f2614a9e" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.scatter(df_table, \n", " x=\"recording_ts\", \n", " y=\"accelerationRMSFull\",\n", " size=\"recording_length\", \n", " color=\"serial_number_id\",\n", " hover_name=\"file_name\", \n", " log_y=True, \n", " size_max=60)\n", "\n", "fig.update_layout(\n", " template_dark, \n", " title_text ='Scatter Plot with Numeric \"Color\"',\n", " xaxis_title_text =\"Date of Recording\",\n", " yaxis_title_text =\"Acceleration RMS (g)\"\n", ")\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "WIX6ZWcfaI6Z", "outputId": "e2d3781b-3bb0-43ce-f4be-b9230067acf1" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_table['device'] = df_table[\"serial_number_id\"].astype(str)\n", "\n", "fig = px.scatter(df_table, \n", " x=\"accelerationPeakFull\", \n", " y=\"velocityRMSFull\",\n", " size=\"recording_length\", \n", " color=\"device\",\n", " color_discrete_sequence=px.colors.qualitative.Light24, #I'll want to use a list with as many discrete values as I can\n", " hover_name=\"file_name\", \n", " log_y=True, \n", " log_x=True,\n", " size_max=60)\n", "\n", "fig.update_layout(\n", " template_dark, \n", " title_text ='Scatter Plot with Text \"Color\"',\n", " xaxis_title_text =\"Acceleration RMS (g)\",\n", " yaxis_title_text =\"Velocity RMS (mm/s)\"\n", ")\n", "\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "0vFYxT2TrzIi" }, "source": [ "#### Drop Downs to Define X & Y Axis Columns\n", "This function (thanks Sam!) highlights another layer of interactivity in Plotly." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Ob0sSaHKqrok" }, "outputs": [], "source": [ "def get_correlation_figure_please(merged_df):\n", " cols = [col for col, t in zip(merged_df.columns, merged_df.dtypes) if t != object]\n", "\n", " start_dropdown_indices = [0, 0]\n", "\n", " # Create the scatter plot of the initially selected variables\n", " fig = px.scatter(\n", " merged_df,\n", " x=cols[start_dropdown_indices[0]],\n", " y=cols[start_dropdown_indices[1]]\n", " )\n", "\n", " # Create the drop-down menus which will be used to choose the desired file characteristics for comparison\n", " drop_downs = []\n", " for axis in ['x', 'y']:\n", " drop_downs.append([\n", " dict(\n", " method = 'update', \n", " args = [\n", " {axis : [merged_df[cols[k]]]},\n", " {'%saxis.title.text'%axis: cols[k]},\n", " # {'color':[merged_df['serial_number_id']],'color_discrete_map':SERIALS_TO_INDEX},\n", " ],\n", " label = cols[k]) for k in range(len(cols))\n", " ])\n", " \n", " # Sets up various apsects of the Plotly figure that is currently being produced. This ranges from \n", " # aethetic things, to setting the dropdown menues as part of the figure\n", " fig.update_layout(\n", " title_x=0.4,\n", " updatemenus=[{\n", " 'active': start_j,\n", " 'buttons': drop_down,\n", " 'x': 1.125,\n", " 'y': y_height,\n", " 'xanchor': 'left',\n", " 'yanchor': 'top',\n", " } for drop_down, start_j, y_height in zip(drop_downs, start_dropdown_indices, [1, .85])])\n", " \n", " return fig" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "Sf2wnDItsZ5B", "outputId": "a282bc38-bdf8-4b07-e0f8-aa1f5ca0c3e3" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = get_correlation_figure_please(df_table)\n", "fig.update_layout(\n", " template_light, \n", " title_text='Selectable Drop Downs',\n", ")\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "Ff5YaEAwSdKc" }, "source": [ "### Map" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "UarJOq3JSwx5", "outputId": "1a9cabfe-7fd3-49a7-810d-3eb110fc3a2b" }, "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", "
timestampLatitudeLongitudeDateGround Speed
04436.39538542.369258-71.0195921.619789e+091.014
14437.39535542.369257-71.0196001.619789e+090.511
24438.39532442.369257-71.0196031.619789e+090.184
34439.39529442.369256-71.0196081.619789e+090.413
44440.39526342.369259-71.0196051.619789e+090.341
..................
19056343.33707342.496331-71.1399501.619791e+090.170
19066344.33704142.496331-71.1399491.619791e+090.025
19076345.33700842.496330-71.1399491.619791e+090.166
19086346.33697642.496329-71.1399501.619791e+090.117
19096347.33694442.496330-71.1399521.619791e+090.100
\n", "

1910 rows × 5 columns

\n", "
" ], "text/plain": [ " timestamp Latitude Longitude Date Ground Speed\n", "0 4436.395385 42.369258 -71.019592 1.619789e+09 1.014\n", "1 4437.395355 42.369257 -71.019600 1.619789e+09 0.511\n", "2 4438.395324 42.369257 -71.019603 1.619789e+09 0.184\n", "3 4439.395294 42.369256 -71.019608 1.619789e+09 0.413\n", "4 4440.395263 42.369259 -71.019605 1.619789e+09 0.341\n", "... ... ... ... ... ...\n", "1905 6343.337073 42.496331 -71.139950 1.619791e+09 0.170\n", "1906 6344.337041 42.496331 -71.139949 1.619791e+09 0.025\n", "1907 6345.337008 42.496330 -71.139949 1.619791e+09 0.166\n", "1908 6346.336976 42.496329 -71.139950 1.619791e+09 0.117\n", "1909 6347.336944 42.496330 -71.139952 1.619791e+09 0.100\n", "\n", "[1910 rows x 5 columns]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map_data = pd.read_csv('https://info.endaq.com/hubfs/data/mide-map-gps-data.csv')\n", "map_data" ] }, { "cell_type": "markdown", "metadata": { "id": "J-OhcJqIeZDP" }, "source": [ "You need a [mapbox token](https://www.mapbox.com/) here, which is free up to 50,000 \"loads\" per month." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "m7wmhAN7jPIL" }, "outputs": [], "source": [ "import os\n", "from dotenv import load_dotenv\n", "\n", "load_dotenv()\n", "\n", "MAPBOX_ACCESS_TOKEN = os.getenv('MAPBOX_ACCESS_TOKEN')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "K0cFFnHMhdjN", "outputId": "63a6a67c-7ea7-4076-a42b-e3657bee12a8" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "px.set_mapbox_access_token(MAPBOX_ACCESS_TOKEN)\n", "fig = px.scatter_mapbox(map_data, \n", " lat=\"Latitude\", \n", " lon=\"Longitude\", \n", " color=\"Ground Speed\",\n", " zoom=10)\n", "fig.update_layout(\n", " template_dark, \n", " title_text ='Mide to Airport Drive',\n", " coloraxis_showscale=False)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "Wnf6gh-SSbtf" }, "source": [ "### 3D Line" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "MK7wDhkyTBzR", "outputId": "4d22d620-d7a6-499f-e906-ac9dc0fba27b" }, "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", "
frequency (Hz)X (40g)Y (40g)Z (40g)ResultantTime
01.0000001.021500e-041.632998e-046.043786e-053.258877e-0465.0
11.2599211.267597e-041.210042e-047.970037e-053.274643e-0465.0
21.5874011.159243e-041.182557e-046.159546e-052.957754e-0465.0
32.0000002.432255e-049.195336e-058.133421e-054.165131e-0465.0
42.5198421.447308e-042.526833e-055.100299e-052.210021e-0465.0
.....................
20101.5936673.904692e-077.823465e-074.461462e-065.634277e-066285.0
21128.0000001.520778e-075.739868e-085.433635e-077.528400e-076285.0
22161.2698946.667854e-082.399063e-084.284568e-081.335149e-076285.0
23203.1873351.048538e-089.798779e-098.675933e-092.896009e-086285.0
24256.0000006.308070e-095.694253e-093.668721e-091.567104e-086285.0
\n", "

1250 rows × 6 columns

\n", "
" ], "text/plain": [ " frequency (Hz) X (40g) ... Resultant Time\n", "0 1.000000 1.021500e-04 ... 3.258877e-04 65.0\n", "1 1.259921 1.267597e-04 ... 3.274643e-04 65.0\n", "2 1.587401 1.159243e-04 ... 2.957754e-04 65.0\n", "3 2.000000 2.432255e-04 ... 4.165131e-04 65.0\n", "4 2.519842 1.447308e-04 ... 2.210021e-04 65.0\n", ".. ... ... ... ... ...\n", "20 101.593667 3.904692e-07 ... 5.634277e-06 6285.0\n", "21 128.000000 1.520778e-07 ... 7.528400e-07 6285.0\n", "22 161.269894 6.667854e-08 ... 1.335149e-07 6285.0\n", "23 203.187335 1.048538e-08 ... 2.896009e-08 6285.0\n", "24 256.000000 6.308070e-09 ... 1.567104e-08 6285.0\n", "\n", "[1250 rows x 6 columns]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_rolling_psd = pd.read_csv('https://info.endaq.com/hubfs/data/rolling-psd.csv',index_col=0)\n", "df_rolling_psd" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "Sg9mKVi-YF1_", "outputId": "69042d30-a2bb-471d-8047-b40be66a70f8" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line_3d(df_rolling_psd,\n", " x='frequency (Hz)',\n", " y='Time',\n", " z='Resultant',\n", " color='Time',\n", " log_x=True,\n", " log_z=True,\n", " color_discrete_sequence=['#EE7F27']\n", " )\n", "\n", "fig.update_layout(\n", " template_dark, \n", " title_text ='3D PSD',\n", " legend_orientation='v',\n", " legend_y = 0.0,\n", " )\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "GtQMMz7nSaQq" }, "source": [ "### Animation" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "Qh_P1Bf4SQYW", "outputId": "ae2466c7-f7c6-43ca-b045-165afe3fa227" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(\n", " df_rolling_psd,\n", " x=\"frequency (Hz)\",\n", " y=\"Resultant\",\n", " animation_frame=\"Time\",\n", " color_discrete_sequence=['#EE7F27']\n", ")\n", "\n", "fig.update_layout(\n", " {**template_dark, **template_psd}, \n", " title_text = 'Animation of Moving PSD',\n", " legend_orientation = 'v',\n", " legend_y = 1.0,\n", " legend_yanchor = 'top',\n", " legend_x = 1.0,\n", " legend_xanchor = 'right')\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "09C5QZ2_TSIl", "outputId": "f6b9686d-6744-4f0a-c0bd-18010ad6fc6b" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import plotly.graph_objects as go\n", "\n", "def quantile_from_rolling_psd(rolling_psd,column,quantile):\n", " \"\"\"Get the respective quantile of the defined column for all frequencies in the rolling psd\"\"\"\n", " freqs = rolling_psd[\"frequency (Hz)\"].drop_duplicates().to_numpy()\n", " df = pd.Series(index=freqs,name='Quantile',dtype='float64')\n", " df['Quantile'] = 0\n", " for f in freqs:\n", " df_quant = rolling_psd[rolling_psd['frequency (Hz)'] == f].quantile(quantile)\n", " df.loc[f,'Quantile'] = df_quant[column]\n", " return df\n", " \n", "def add_quantile(rolling_psd,column,quantile,name,color,dash):\n", " quant = quantile_from_rolling_psd(rolling_psd,column,quantile)\n", " fig.add_trace(\n", " go.Scatter(\n", " x=quant.index,\n", " y=quant.values,\n", " name=name,\n", " line=dict(color=color, dash=dash),\n", " )\n", " )\n", "\n", "add_quantile(df_rolling_psd,'Resultant',1.0,\"Max\",\"#6914F0\",\"solid\")\n", "add_quantile(df_rolling_psd,'Resultant',0.5,\"Median\",\"#6914F0\",\"dash\")\n", "add_quantile(df_rolling_psd,'Resultant',0.0,\"Min\",\"#6914F0\",\"solid\")\n", "fig.write_html('psd-animation.html',full_html=False,include_plotlyjs='cdn') \n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "NBlhWU8cyV0k" }, "source": [ "### Large Time Series\n", "The one bad thing about plotly is that it makes your browser load all the data points into memory. It therefore can crash if you are trying to plot too many data points." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 455 }, "id": "6asmJWD8xWrV", "outputId": "ea48c080-2903-41da-a9ac-199ab3f3fd6f" }, "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", "
X (40g)Y (40g)Z (40g)
timestamp
0.402069-0.3906910.017191-0.847865
0.402318-0.1729130.071447-0.826096
0.4025671.0898471.2847860.356687
0.4028160.2960121.093866-0.054382
0.403066-0.1111240.318515-0.624797
............
99.7262030.260407-0.161978-0.047653
99.726453-0.552108-0.073261-0.077179
99.726703-0.280525-0.001577-0.057706
99.7269530.819221-0.1960460.157842
99.7272030.523529-0.3147300.136786
\n", "

397386 rows × 3 columns

\n", "
" ], "text/plain": [ " X (40g) Y (40g) Z (40g)\n", "timestamp \n", "0.402069 -0.390691 0.017191 -0.847865\n", "0.402318 -0.172913 0.071447 -0.826096\n", "0.402567 1.089847 1.284786 0.356687\n", "0.402816 0.296012 1.093866 -0.054382\n", "0.403066 -0.111124 0.318515 -0.624797\n", "... ... ... ...\n", "99.726203 0.260407 -0.161978 -0.047653\n", "99.726453 -0.552108 -0.073261 -0.077179\n", "99.726703 -0.280525 -0.001577 -0.057706\n", "99.726953 0.819221 -0.196046 0.157842\n", "99.727203 0.523529 -0.314730 0.136786\n", "\n", "[397386 rows x 3 columns]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_vibe = pd.read_csv('https://info.endaq.com/hubfs/data/motorcycle-vibration-moving-frequency.csv',index_col=0)\n", "df_vibe = df_vibe - df_vibe.median()\n", "df_vibe" ] }, { "cell_type": "markdown", "metadata": { "id": "4Sflb335PjXk" }, "source": [ "#### Render an Image\n", "To get around this we can render the figure as an image ([see docs for more information](https://plotly.com/python/renderers/))." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 521 }, "id": "86pgiTw6xcnK", "outputId": "274cbfbe-9138-48f7-9d7c-4d5abbd06be2" }, "outputs": [ { "data": { "image/svg+xml": [ "20406080−30−20−1001020X (40g)Y (40g)Z (40g)Large Time Series, Render as ImageTime (s)Acceleration (g)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_vibe)\n", "\n", "fig.update_layout(\n", " {**template_dark, **template_accel}, \n", " title_text = 'Large Time Series, Render as Image')\n", "\n", "fig.show(renderer=\"svg\")" ] }, { "cell_type": "markdown", "metadata": { "id": "vxhHAzQyTfoh" }, "source": [ "The other issue I have is that the order in which we plot matters with how we view and understand the data which isn't good!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 521 }, "id": "4sfMM8x7TGG6", "outputId": "48481574-2eea-448c-f0ad-9a6b17d2c27b" }, "outputs": [ { "data": { "image/svg+xml": [ "20406080−30−20−1001020Z (40g)Y (40g)X (40g)Large Time Series, Render as ImageTime (s)Acceleration (g)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_vibe[df_vibe.columns[::-1]],\n", " color_discrete_sequence=['#00CC96','#EF553B','#636EFA'])\n", "\n", "fig.update_layout(\n", " {**template_dark, **template_accel}, \n", " title_text = 'Large Time Series, Render as Image')\n", "\n", "fig.show(renderer=\"svg\")" ] }, { "cell_type": "markdown", "metadata": { "id": "WxfCj-aCupsT" }, "source": [ "#### Moving Metrics\n", "\n", "One option is to plot the moving max, min, and mean or standard deviation. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "c723ZB2HusEy" }, "outputs": [], "source": [ "def add_metric(fig,df_rolling,colors,dash,names,label):\n", " for var,color in zip(names,colors):\n", " fig.add_trace(go.Scatter(\n", " x=df_rolling.index,\n", " y=df_rolling[var].to_numpy(),\n", " mode=\"lines\",\n", " line = dict(color=color, width=1,dash=dash),\n", " name=var+label\n", " ))\n", " return fig\n", "\n", "def moving_window_plot(df,n_steps=100):\n", " \"\"\"Generate a plotly figure with the moving peak and standard deviation.\"\"\"\n", " n = int(df.shape[0]/n_steps) #number of data points to use in windowing\n", "\n", " df_rolling_max = df.rolling(n).max().iloc[::n] \n", " df_rolling_min = df.rolling(n).min().iloc[::n] \n", " df_rolling_rms = df.rolling(n).std().iloc[::n] \n", "\n", " df_rolling_max.columns = [col+': Max' for col in df.columns]\n", " fig = px.line(df_rolling_max,\n", " color_discrete_sequence=colors)\n", "\n", " fig = add_metric(fig,df_rolling_min,colors,None,df.columns,': Min')\n", " fig = add_metric(fig,df_rolling_rms,colors,'dash',df.columns,': STD')\n", "\n", " return fig" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "HquqRKBdwMPe", "outputId": "153698b6-ee5e-4189-fcc8-79084b210508" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = moving_window_plot(df_vibe,1000)\n", "\n", "fig.update_layout(\n", " {**template_dark, **template_accel}, \n", " title_text = 'Rolling Peak & RMS')\n", "\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "NIoD0JOP1XAq" }, "source": [ "#### Using Datashader\n", "There is a library for this (there is one for everything in Python!) to create large datasets into pixels for easy visualization called Datashader.\n", "\n", "I modified the code from their [example on time series](https://datashader.org/user_guide/Timeseries.html)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TYdaFYxz2VjR", "outputId": "c1f8eef7-98bd-4e6e-93f5-f91e57f65f97" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[K |████████████████████████████████| 15.8 MB 1.3 kB/s \n", "\u001b[K |████████████████████████████████| 76 kB 3.5 MB/s \n", "\u001b[K |████████████████████████████████| 786 kB 38.9 MB/s \n", "\u001b[K |████████████████████████████████| 125 kB 47.3 MB/s \n", "\u001b[K |████████████████████████████████| 779 kB 38.6 MB/s \n", "\u001b[K |████████████████████████████████| 778 kB 51.1 MB/s \n", "\u001b[K |████████████████████████████████| 776 kB 60.8 MB/s \n", "\u001b[K |████████████████████████████████| 769 kB 59.3 MB/s \n", "\u001b[K |████████████████████████████████| 766 kB 51.8 MB/s \n", "\u001b[K |████████████████████████████████| 1.0 MB 27.9 MB/s \n", "\u001b[K |████████████████████████████████| 722 kB 57.1 MB/s \n", "\u001b[K |████████████████████████████████| 722 kB 40.9 MB/s \n", "\u001b[K |████████████████████████████████| 715 kB 50.7 MB/s \n", "\u001b[K |████████████████████████████████| 705 kB 47.4 MB/s \n", "\u001b[K |████████████████████████████████| 699 kB 46.8 MB/s \n", "\u001b[K |████████████████████████████████| 696 kB 44.2 MB/s \n", "\u001b[K |████████████████████████████████| 684 kB 56.4 MB/s \n", "\u001b[K |████████████████████████████████| 679 kB 59.6 MB/s \n", "\u001b[K |████████████████████████████████| 675 kB 48.9 MB/s \n", "\u001b[K |████████████████████████████████| 675 kB 47.6 MB/s \n", "\u001b[K |████████████████████████████████| 672 kB 57.3 MB/s \n", "\u001b[K |████████████████████████████████| 671 kB 50.6 MB/s \n", "\u001b[K |████████████████████████████████| 669 kB 57.3 MB/s \n", "\u001b[K |████████████████████████████████| 656 kB 37.9 MB/s \n", "\u001b[?25h Building wheel for datashape (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "gym 0.17.3 requires cloudpickle<1.7.0,>=1.2.0, but you have cloudpickle 2.0.0 which is incompatible.\u001b[0m\n" ] } ], "source": [ "!pip install -q datashader" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ET-837ew1a9o" }, "outputs": [], "source": [ "import datashader as ds\n", "import datashader.transfer_functions as tf\n", "import xarray as xr\n", "from collections import OrderedDict\n", "\n", "def datashader_large_time(df,time_col,colors,height=300,width=900):\n", " \"\"\"Use datashader to render an image off a large time series\"\"\"\n", " x_range = (df.index[0], df.index[-1])\n", " y_range = (df.min(axis=1).min(), 1.2*df.max(axis=1).max())\n", "\n", " cvs = ds.Canvas(x_range=x_range, y_range=y_range, plot_height=height, plot_width=width)\n", " \n", " cols = df.columns\n", " aggs= OrderedDict((c, cvs.line(df.reset_index(), time_col, c)) for c in cols)\n", "\n", " imgs = [tf.shade(aggs[i], cmap=[c]) for i, c in zip(cols, colors)]\n", " \n", " renamed = [aggs[key].rename({key: 'value'}) for key in aggs]\n", " merged = xr.concat(renamed, 'cols')\n", " total = tf.shade(merged.sum(dim='cols'), how='linear')\n", "\n", " return imgs, total" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 323 }, "id": "cbAJxJL92dl9", "outputId": "a458883b-98d6-48c2-fc7c-5cf6eba2e3c4" }, "outputs": [ { "data": { "image/png": "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\n", "text/html": [ "" ], "text/plain": [ "\n", "array([[0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0]], dtype=uint32)\n", "Coordinates:\n", " * timestamp (timestamp) float64 0.4572 0.5676 0.678 ... 99.45 99.56 99.67\n", " * X (40g) (X (40g)) float64 -29.01 -28.84 -28.66 ... 23.37 23.55 23.72" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imgs, total = datashader_large_time(df_vibe,'timestamp',colors)\n", "tf.stack(*imgs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "iqkIc9mf4k0Y" }, "outputs": [], "source": [ "def display_all_imgs(imgs,names,colors):\n", " for i in range(len(imgs)):\n", " fig = px.imshow(imgs[i],\n", " color_continuous_scale = [ [0, 'rgba(255,255,255,0)'], [1, colors[i]] ],\n", " origin='lower')\n", " fig.update_layout(\n", " {**template_dark, **template_accel}, \n", " title_text = 'Large Time Series with Datashader - '+names[i],\n", " coloraxis_showscale = False)\n", " fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "UXPIfuNvQRDk", "outputId": "64f531fa-9e49-4e7f-a683-77a2984f6aaa" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display_all_imgs(imgs,df_vibe.columns,colors)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "BgxUw907Cbyg", "outputId": "8db8de8b-92eb-41ca-be4b-b22db2538557" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.imshow(total,\n", " color_continuous_scale = [ [0, colors[0]], [1, 'rgba(255,255,255,0)'] ],\n", " origin='lower')\n", "fig.update_layout(\n", " {**template_dark, **template_accel}, \n", " title_text = 'Large Time Series with Datashader - Merged',\n", " coloraxis_showscale = False)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "G0qYtQBDgNQq" }, "source": [ "That last example was a meager 400,000 data points, what happens when we have 6 million!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 455 }, "id": "76BlwVmSQyNf", "outputId": "85aa6a0e-ae40-48d4-9e87-4aac17513a89" }, "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", "
X (100g)Y (100g)Z (100g)
timestamp
0.7154846.0547973.714581-1.500087
0.7156845.6577613.765466-1.354917
0.7158845.4592433.612812-1.500087
0.7160845.7570203.969005-1.645257
0.7162846.2036854.070774-2.032376
............
1207.5746690.6451831.984502-1.306527
1207.5748690.8437012.086272-1.306527
1207.5750690.4962952.086272-1.064578
1207.5752690.8933311.730079-1.161358
1207.5754690.8933311.831848-1.064578
\n", "

6034260 rows × 3 columns

\n", "
" ], "text/plain": [ " X (100g) Y (100g) Z (100g)\n", "timestamp \n", "0.715484 6.054797 3.714581 -1.500087\n", "0.715684 5.657761 3.765466 -1.354917\n", "0.715884 5.459243 3.612812 -1.500087\n", "0.716084 5.757020 3.969005 -1.645257\n", "0.716284 6.203685 4.070774 -2.032376\n", "... ... ... ...\n", "1207.574669 0.645183 1.984502 -1.306527\n", "1207.574869 0.843701 2.086272 -1.306527\n", "1207.575069 0.496295 2.086272 -1.064578\n", "1207.575269 0.893331 1.730079 -1.161358\n", "1207.575469 0.893331 1.831848 -1.064578\n", "\n", "[6034260 rows x 3 columns]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "doc = endaq.ide.get_doc('https://info.endaq.com/hubfs/ford_f150.ide',quiet=True)\n", "df_long = endaq.ide.to_pandas(doc.channels[8],time_mode='seconds')\n", "df_long = df_long - df_long.median()\n", "df_long" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "f-Q7Z2shRS99", "outputId": "b4c46329-a31f-4719-83be-19551013a7ef" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "imgs, total = datashader_large_time(df_long,'timestamp',colors)\n", "\n", "fig = px.imshow(total,\n", " color_continuous_scale = [ [0, colors[0]], [1, 'rgba(255,255,255,0)'] ],\n", " origin='lower')\n", "fig.update_layout(\n", " {**template_dark, **template_accel}, \n", " title_text = 'Large Time Series with Datashader - Merged',\n", " coloraxis_showscale = False)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "hvobuMH5iFMI" }, "source": [ "Now let's get crazy and do a VERY large file with 64 million samples, the file is 385 MB. Note that the free version of Colab will run out of memory if you try this file..." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 455 }, "id": "zPLGArCLhh5_", "outputId": "e0ad4c7b-aaa5-4e53-99fc-0962e8d6054e" }, "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", "
XYZ
timestamp
22562.056030-3.604027-4.5767280.000000
22562.0560801.201342-1.1441822.341676
22562.0561302.4026850.000000-5.854189
22562.0561803.6040270.0000000.000000
22562.056230-2.4026850.000000-3.512513
............
25785.220503-6.006712-1.1441820.000000
25785.220553-9.6107400.000000-3.512513
25785.220603-12.0134252.2883640.000000
25785.220653-7.208055-2.2883643.512513
25785.220703-2.402685-6.8650925.854189
\n", "

64464451 rows × 3 columns

\n", "
" ], "text/plain": [ " X Y Z\n", "timestamp \n", "22562.056030 -3.604027 -4.576728 0.000000\n", "22562.056080 1.201342 -1.144182 2.341676\n", "22562.056130 2.402685 0.000000 -5.854189\n", "22562.056180 3.604027 0.000000 0.000000\n", "22562.056230 -2.402685 0.000000 -3.512513\n", "... ... ... ...\n", "25785.220503 -6.006712 -1.144182 0.000000\n", "25785.220553 -9.610740 0.000000 -3.512513\n", "25785.220603 -12.013425 2.288364 0.000000\n", "25785.220653 -7.208055 -2.288364 3.512513\n", "25785.220703 -2.402685 -6.865092 5.854189\n", "\n", "[64464451 rows x 3 columns]" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "doc = endaq.ide.get_doc('https://info.endaq.com/hubfs/data/Mining-Data.ide',quiet=True)\n", "df_very_long = endaq.ide.to_pandas(doc.channels[8],time_mode='seconds')\n", "df_very_long = df_very_long - df_very_long.median()\n", "df_very_long" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "6EflurGQh10Q", "outputId": "0c853552-2f71-4090-87ac-60d6d9e38df4" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "imgs, total = datashader_large_time(df_very_long,'timestamp',colors)\n", "\n", "fig = px.imshow(total,\n", " color_continuous_scale = [ [0, colors[0]], [1, 'rgba(255,255,255,0)'] ],\n", " origin='lower')\n", "fig.update_layout(\n", " {**template_dark, **template_accel}, \n", " title_text = 'VERY Large (64M) Time Series with Datashader - Merged',\n", " coloraxis_showscale = False)\n", "fig.write_html('large-time-image.html',full_html=False,include_plotlyjs='cdn') \n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "9bo3Q_1qGzcX" }, "source": [ "## Wait, What're Graph Objects?\n" ] }, { "cell_type": "markdown", "metadata": { "id": "1T864_6Qzdn0" }, "source": [ "### Adding to a Figure\n", "Because Plotly Express has become so versatile you really only need to use graph_objects when adding to a figure already created by express. Let's demonstrate by adding half sine best fits to our shock response spectrum." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "4wbpWM59n6VJ", "outputId": "880fc9c2-39d1-4578-b09c-405a129f86ce" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_pvss,\n", " color_discrete_sequence=colors)\n", "\n", "fig.update_layout(\n", " {**template_dark, **template_pvss}, \n", " title_text = 'Motorcyle Crash Test with Best Fit Half Sine Pulses')\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "COs-E00PnUBb" }, "outputs": [], "source": [ "damp=0.05\n", "t = np.linspace(0,0.5,num=int(10000)) # NOTE: if there aren't enough samples, low-frequency artifacts will appear!\n", "\n", "def half_sine_pulse(t, T):\n", " \"\"\"Given a pulse width (T) and total time (t) generate a time series of the pulse with an amplitude of 1.\"\"\"\n", " result = np.zeros_like(t)\n", " result[(t > 0) & (t < T)] = np.sin(np.pi*t[(t > 0) & (t < T)] / T)\n", " df_result = pd.DataFrame({'Time':t,\n", " 'Pulse':result}).set_index('Time')\n", " return df_result " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "upF3KHepniJc", "outputId": "ec9985f4-6d4d-4a1b-ca06-43fe1849ce31" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for var,color in zip(df_pvss.columns,colors):\n", " half_sine_params = endaq.calc.shock.enveloping_half_sine(df_pvss[var]/9.81/39.37, damp=damp)\n", " \n", " df_pvss_pulse = endaq.calc.shock.pseudo_velocity(half_sine_params[0] * half_sine_pulse(t, T=half_sine_params[1]),\n", " freqs=df_pvss.index, damp=damp) \n", " \n", " fig.add_trace(go.Scatter(\n", " x=df_pvss_pulse.index,\n", " y=df_pvss_pulse['Pulse'].to_numpy()*9.81*39.37,\n", " mode=\"lines\",\n", " line = dict(color=color, width=1,dash='dash'),\n", " name=var+': Half Sine ('+str(np.round(half_sine_params[1],5))+'s, '+str(np.round(half_sine_params[0],1))+'g)'\n", " ))\n", "\n", "fig.show() " ] }, { "cell_type": "markdown", "metadata": { "id": "6EKYE2kszmpf" }, "source": [ "### Creating a Heatmap" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "pWwsBotEzox_" }, "outputs": [], "source": [ "from scipy import signal\n", "\n", "def spectrogram(df,win,max_freq):\n", " \"\"\"Generate a Spectrogram with a defined frequency window size and maximum frequency\"\"\"\n", " fs = len(df)/(df.index[-1]-df.index[0])\n", " N = int(fs*win) #Number of points in the fft\n", " w = signal.blackman(N)\n", " output = []\n", " figs = []\n", " for c in df.columns:\n", " freqs, bins, Pxx = signal.spectrogram(df[c].to_numpy(), fs,window = w,nfft=N,axis=0)\n", " Pxx = Pxx[:max_freq,:]\n", " freqs = freqs[:max_freq]\n", " output.append(Pxx)\n", "\n", " #Generate Figures\n", " trace = [go.Heatmap(\n", " x= bins,\n", " y= freqs,\n", " z= 10*np.log10(Pxx),\n", " colorscale='Jet',\n", " )]\n", " layout = go.Layout(\n", " yaxis = dict(title = 'Frequency (Hz)'), # x-axis label\n", " xaxis = dict(title = 'Time (s)'), # y-axis label\n", " )\n", " fig = go.Figure(data=trace, layout=layout)\n", " figs.append(fig)\n", "\n", " return freqs,bins,output,figs" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "OXstq3U2zw6_", "outputId": "3ccc5625-952a-43e6-e666-b8a0fa115383" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs,bins,output,figs = spectrogram(df_vibe,0.5,200)\n", "\n", "figs[1].update_layout(template_dark,\n", " title_text = 'Spectrogram with Graph Objects')\n", "figs[1].write_html('spectrogram.html',full_html=False,include_plotlyjs='cdn') \n", "figs[1].show()" ] }, { "cell_type": "markdown", "metadata": { "id": "ebJ_Niupn6U-" }, "source": [ "### 4-Coordinate or Tripartite Plot\n", "\n", "Let's say I want to make a 4-coordinate plot for shock response spectrums like what I showed in [the blog](https://blog.endaq.com/shock-analysis-response-spectrum-srs-pseudo-velocity-severity):\n", "\n", "![motorcycle-collision-pseudo-velocity-filtering-response-4cp.svg](https://blog.endaq.com/hubfs/motorcycle-collision-pseudo-velocity-filtering-response-4cp.svg)\n", "\n", "This would be a great example of when to use graph_objects to add all these diagonal lines." ] }, { "cell_type": "markdown", "metadata": { "id": "0D3y6shTAxtW" }, "source": [ "### Supporting Functions\n", "This will be updated and included in our open enDAQ Library." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8cqfNiGqpL9s" }, "outputs": [], "source": [ "def log_ticks(start,stop):\n", " \"\"\"Create an array of values that would be the equivalent of tick marks in a log scaled plot\"\"\"\n", " start = np.floor(np.log10(start))\n", " stop = np.ceil(np.log10(stop))\n", " ones = np.linspace(1,9,9)\n", " output = ones*(10**start)\n", " for i in np.arange(start+1,stop,1):\n", " output = np.concatenate((output,\n", " ones*(10**i)))\n", " return np.concatenate((output,np.array([10**stop])))\n", "\n", "def build_mult_df(rows,columns,scalar=1,row_exp=1,col_exp=1):\n", " \"\"\"Multiply two arrays by each other to form a matrix with defined scalar and exponents\"\"\"\n", " rows2 = np.reshape(rows,(len(rows),1))\n", " columns2 = np.reshape(columns,(1,len(columns)))\n", " return pd.DataFrame(data=(rows2**row_exp)*(columns2**col_exp)*scalar,\n", " index=rows,\n", " columns=columns)\n", " \n", "def add_df(fig,df,units):\n", " \"\"\"Add lines for each column in a dataframe to an existing figure\"\"\"\n", " for col in df.columns:\n", " fig.add_trace(go.Scatter(\n", " x=df.index,\n", " y=df[col].to_numpy(),\n", " mode=\"lines\",\n", " line = dict(color='#404041', width=1,dash='dot'),\n", " showlegend=False,\n", " name=str(col)+units\n", " ))\n", " return fig " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "R3wLmYn6y4Dq" }, "outputs": [], "source": [ "def add_4cp_pvss(fig,df_pvss):\n", " \"\"\"Given a figure and the dataframe of pseudo velocity (in/s) add the 4 coordinate plot diagonals\"\"\"\n", " max_vel = np.ceil(np.log10(df_pvss.max(axis=1).max()))\n", " min_vel = np.floor(np.log10(df_pvss.min(axis=1).min()))\n", "\n", " min_disp = (10**min_vel)/df_pvss.index[-1]/(2*np.pi)\n", " max_disp = (10**max_vel)/df_pvss.index[0]/(2*np.pi)\n", "\n", " disps = build_mult_df(df_pvss.index,\n", " log_ticks(min_disp,max_disp),\n", " scalar=(2*np.pi))\n", " disps = disps[(disps<(10**max_vel)) & (disps>(10**min_vel))]\n", "\n", " major_disps = disps.columns[np.remainder(np.log10(disps.columns),1)==0]\n", " for disp in major_disps:\n", " disp_str = str(disp) + \" in\"\n", " if disp>=1:\n", " disp_str = f\"{disp:.0f}\" + \" in\" \n", " x = (10**max_vel)/(disp*2*np.pi)\n", " if (x < df_pvss.index[-1]) & (x > df_pvss.index[0]):\\\n", " fig.add_annotation(x=np.log10(x)-.1, y=max_vel,\n", " text=disp_str,\n", " textangle=-45,\n", " showarrow=False)\n", "\n", " min_accel = (10**min_vel)*df_pvss.index[0]*(2*np.pi)/(9.81*39.37)\n", " max_accel = (10**max_vel)*df_pvss.index[-1]*(2*np.pi)/(9.81*39.37)\n", "\n", " accels = build_mult_df(df_pvss.index,\n", " log_ticks(min_accel,max_accel),\n", " scalar=9.81*39.37/(2*np.pi),\n", " row_exp=-1)\n", " accels = accels[(accels<(10**max_vel)) & (accels>(10**min_vel))]\n", "\n", " major_accels = accels.columns[np.remainder(np.log10(accels.columns),1)==0]\n", " for accel in major_accels:\n", " accel_str = str(accel) + \" g\"\n", " if accel>=1:\n", " accel_str = f\"{accel:.0f}\" + \" g\" \n", " y = accel / (df_pvss.index[-1] * 2 * np.pi) * (9.81*39.37)\n", " if (y < 10**max_vel) & (y > 10**min_vel):\n", " fig.add_annotation(x=np.log10(df_pvss.index[-1]), y=np.log10(y)+.1,\n", " text=accel_str,\n", " textangle=45,\n", " showarrow=False) \n", "\n", " add_df(fig,disps,' in') \n", " add_df(fig,accels,' g') \n", "\n", " fig.update_yaxes(range=[min_vel,max_vel])\n", " fig.update_xaxes(range=np.log10([df_pvss.index[0],df_pvss.index[-1]]))\n", "\n", " return fig" ] }, { "cell_type": "markdown", "metadata": { "id": "TpWYR3BUA4Oy" }, "source": [ "#### Motorcycle Crash" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 617 }, "id": "rE6cD4OH-Km3", "outputId": "ba0a3beb-c6dc-4073-b0f5-88dee3d7b559" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_pvss,\n", " color_discrete_sequence=colors)\n", "\n", "fig = add_4cp_pvss(fig,df_pvss)\n", "\n", "fig.update_layout(\n", " {**template_light, **template_pvss}, \n", " title_text = 'Motorcyle Crash Test in 4CP',\n", " width=600,\n", " height=600)\n", "fig.write_html('4cp.html',full_html=False,include_plotlyjs='cdn') \n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "7I1ESdso3F9R" }, "source": [ "#### El Centro Earthquake\n", "[Data credit of good ol' Tom Irvine](http://www.vibrationdata.com/elcentro.htm), the El Centro earthquake in 1940.\n", "\n", "![](http://www.vibrationdata.com/Resources/elc3.jpg)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "1H98Dvd_ztP4", "outputId": "fdb3abb6-5b83-4584-dd74-1677e270c945" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_elcentro = pd.read_csv('https://info.endaq.com/hubfs/elcentro_earthquake.csv',index_col=0)\n", "\n", "fig = px.line(df_elcentro)\n", "fig.update_layout(\n", " {**template_light, **template_accel}, \n", " title_text = 'El Centro Earthquake Acceleration')\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YOJs9JFF3Ner" }, "outputs": [], "source": [ "df_pvss_elcentro = endaq.calc.shock.pseudo_velocity(df_elcentro, \n", " get_log_freqs(df_elcentro,init_freq=.1,bins_per_octave=12),\n", " damp=0.05, two_sided=False)\n", "df_pvss_elcentro = df_pvss_elcentro*9.81*39.37 #convert to in/s" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 617 }, "id": "qbAlbhXh4P-w", "outputId": "879b26bc-1a75-4d94-8b74-92a2d138b5f5" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_pvss_elcentro,\n", " color_discrete_sequence=colors)\n", "\n", "fig = add_4cp_pvss(fig,df_pvss_elcentro)\n", "\n", "fig.update_layout(\n", " {**template_light, **template_pvss}, \n", " title_text = 'El Centro Earthquake in 4CP',\n", " showlegend = False,\n", " width=600,\n", " height=600)\n", "\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "GVHxg1xLwvjS" }, "source": [ "## Sub Plots" ] }, { "cell_type": "markdown", "metadata": { "id": "1dCAvg8uIiFC" }, "source": [ "### Install & Load Libraries" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "NCYGR-YxzimH", "outputId": "9752aa47-9e18-4a9f-da8c-9e616b750e65" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[K |████████████████████████████████| 15.7 MB 5.1 MB/s \n", "\u001b[K |████████████████████████████████| 28.5 MB 56.8 MB/s \n", "\u001b[K |████████████████████████████████| 11.3 MB 24.4 MB/s \n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "tensorflow 2.6.0 requires numpy~=1.19.2, but you have numpy 1.21.2 which is incompatible.\n", "gym 0.17.3 requires cloudpickle<1.7.0,>=1.2.0, but you have cloudpickle 2.0.0 which is incompatible.\n", "google-colab 1.0.0 requires pandas~=1.1.0; python_version >= \"3.0\", but you have pandas 1.3.3 which is incompatible.\n", "datascience 0.10.6 requires folium==0.2.1, but you have folium 0.8.3 which is incompatible.\n", "albumentations 0.1.12 requires imgaug<0.2.7,>=0.2.5, but you have imgaug 0.2.9 which is incompatible.\u001b[0m\n", "\u001b[?25h" ] } ], "source": [ "!pip install -U -q numpy scipy plotly pandas\n", "exit()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "KFO63Bmr0MMd" }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import scipy\n", "\n", "import plotly.express as px\n", "import plotly.graph_objects as go\n", "\n", "import endaq\n", "\n", "def get_dfs_from_doc(doc, display_table=True, time_mode='seconds'):\n", " \"\"\"Extract dataframes from all channels, separating subchannels to their own dataframe if they have different units\"\"\"\n", " table = endaq.ide.get_channel_table(doc)\n", " if display_table:\n", " display(table)\n", " for i in table.data.index:\n", " table.data.loc[i, 'parent'] = table.data['channel'].loc[i].parent.id\n", "\n", " dfs = []\n", " labels = []\n", " for ch in doc.channels:\n", " df = endaq.ide.to_pandas(doc.channels[ch],time_mode=time_mode)\n", " units = table.data[table.data.parent == doc.channels[ch].id].units.unique()\n", " types = table.data[table.data.parent == doc.channels[ch].id].type.unique()\n", " for unit,d_type in zip(units,types):\n", " columns = table.data[(table.data.parent == doc.channels[ch].id) & (table.data.units == unit)].name\n", " dfs.append(df[columns])\n", " labels.append(d_type + ' (' + unit + ')')\n", " \n", " return dfs, labels \n", "\n", "def merge_dfs(dfs,labels,plot_points=500,mean_thresh=100):\n", " \"\"\"Combine dataframes into one merged one, but downsample to moving RMS for datasets with fast sampling rates, and moving mean for slower data sets\"\"\"\n", " master_df = pd.DataFrame()\n", " for df, label in zip(dfs,labels):\n", " f_s = dt = (len(df.index) - 1) / (df.index[-1] - df.index[0])\n", " n = int(df.shape[0]/plot_points) #number of data points to use in windowing\n", " if n>0:\n", " if f_s > mean_thresh:\n", " df = df.rolling(n).std().iloc[::n] \n", " else:\n", " df = df.rolling(n).mean().iloc[::n] \n", "\n", " for col in df.columns:\n", " df_temp = df[col].to_frame()\n", " df_temp.columns = ['Value']\n", " df_temp['Name'] = label + ': ' + col\n", " df_temp['Units'] = label\n", " df_temp = df_temp.reset_index()\n", " master_df = pd.concat([master_df,df_temp])\n", " return master_df " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "L7lzJhe4RmJd" }, "outputs": [], "source": [ "template_light = dict(\n", " template=\"presentation\",\n", "\n", " font_family='Open Sans',\n", " font_size=16,\n", " font_color='#404041',\n", "\n", " title_font_family = 'Open Sans ExtraBold',\n", " title_font_size = 24,\n", " title_x = 0.5,\n", "\n", " xaxis_title_font_family = 'Open Sans ExtraBold',\n", " xaxis_title_font_size = 20,\n", "\n", " yaxis_title_font_family = 'Open Sans ExtraBold',\n", " yaxis_title_font_size = 20,\n", "\n", " legend_title='',\n", " legend_orientation='h',\n", " legend_y = -0.2,\n", " \n", " plot_bgcolor = '#f3f3f3',\n", " yaxis_gridcolor = '#dad9d8',\n", " yaxis_linecolor = '#404041',\n", " yaxis_mirror = True,\n", " xaxis_gridcolor = '#dad9d8',\n", " xaxis_linecolor = '#404041',\n", " xaxis_mirror = True, \n", " )\n", "\n", "template_dark = template_light.copy()\n", "template_dark['template'] = \"plotly_dark\"\n", "template_dark['font_color'] = '#f3f3f3'\n", "template_dark['plot_bgcolor'] = \"#111111\"\n", "template_dark['yaxis_linecolor'] = \"#404041\"\n", "template_dark['xaxis_linecolor'] = \"#404041\"\n", "template_dark['yaxis_gridcolor'] = \"#404041\"\n", "template_dark['xaxis_gridcolor'] = \"#404041\"\n", "\n", "colors = ['#EE7F27', '#6914F0', '#2DB473', '#D72D2D', '#3764FF', '#FAC85F','#27eec0','#b42d4d','#82d72d','#e35ffa']\n", "\n", "template_pvss = dict(\n", " xaxis_title_text = \"Natural Frequency (Hz)\",\n", " xaxis_type = 'log',\n", " yaxis_title_text =\"Pseudo Velocity (in/s)\",\n", " yaxis_type = 'log'\n", ")\n", "\n", "template_psd = dict(\n", " xaxis_title_text = \"Frequency (Hz)\",\n", " xaxis_type = 'log',\n", " yaxis_title_text =\"Acceleration (g^2/Hz)\",\n", " yaxis_type = 'log'\n", " )\n", "\n", "template_accel = dict(\n", " xaxis_title_text = \"Time (s)\",\n", " yaxis_title_text =\"Acceleration (g)\",\n", " )" ] }, { "cell_type": "markdown", "metadata": { "id": "N511rCvXIkSQ" }, "source": [ "### Load Data" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 476 }, "id": "i75DciAx9OFx", "outputId": "b3c9a8c7-cdf4-49a1-9a77-087671f4baff" }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 channelnametypeunitsstartenddurationsamplesrate
08.0X (25g)Accelerationg00:00.033803:09.034203:09.00039449904999.85 Hz
18.1Y (25g)Accelerationg00:00.033803:09.034203:09.00039449904999.85 Hz
28.2Z (25g)Accelerationg00:00.033803:09.034203:09.00039449904999.85 Hz
38.3MicAudioA00:00.033803:09.034203:09.00039449904999.85 Hz
480.0X (40g)Accelerationg00:00.034103:09.036503:09.002494603500.48 Hz
580.1Y (40g)Accelerationg00:00.034103:09.036503:09.002494603500.48 Hz
680.2Z (40g)Accelerationg00:00.034103:09.036503:09.002494603500.48 Hz
784.0XRotationdeg/s00:00.043103:09.051603:09.00856129353241.58 Hz
884.1YRotationdeg/s00:00.043103:09.051603:09.00856129353241.58 Hz
984.2ZRotationdeg/s00:00.043103:09.051603:09.00856129353241.58 Hz
1036.0Pressure/Temperature:00PressurePa00:00.033703:09.053103:09.01931901.00 Hz
1136.1Pressure/Temperature:01Temperature°C00:00.033703:09.053103:09.01931901.00 Hz
1270.0XQuaternionq00:00.039903:09.031803:08.09191887999.93 Hz
1370.1YQuaternionq00:00.039903:09.031803:08.09191887999.93 Hz
1470.2ZQuaternionq00:00.039903:09.031803:08.09191887999.93 Hz
1570.3WQuaternionq00:00.039903:09.031803:08.09191887999.93 Hz
1659.0Control Pad PressurePressurePa00:00.037103:09.027003:08.089918869.98 Hz
1759.1Control Pad TemperatureTemperature°C00:00.037103:09.027003:08.089918869.98 Hz
1859.2Relative HumidityRelative HumidityRH00:00.037103:09.027003:08.089918869.98 Hz
1976.0LuxLightIll00:00.000003:09.000603:09.00067533.98 Hz
2076.1UVLightIndex00:00.000003:09.000603:09.00067533.98 Hz
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "doc = endaq.ide.get_doc('https://info.endaq.com/hubfs/data/All-Channels.ide', quiet=True)\n", "dfs, labels = get_dfs_from_doc(doc, display_table=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "n7QU-AwjIzeJ", "outputId": "4bd15d51-0393-4167-916a-aadf856986e4" }, "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", "
timestampValueNameUnits
00.338775NaNAcceleration (g): X (25g)Acceleration (g)
12.2287610.012966Acceleration (g): X (25g)Acceleration (g)
24.1187480.004471Acceleration (g): X (25g)Acceleration (g)
36.0086820.009458Acceleration (g): X (25g)Acceleration (g)
47.8985440.010230Acceleration (g): X (25g)Acceleration (g)
...............
103181.23930888.318638Light (Ill): LuxLight (Ill)
104182.993142200.759452Light (Ill): LuxLight (Ill)
105184.746975124.224819Light (Ill): LuxLight (Ill)
106186.500809113.725342Light (Ill): LuxLight (Ill)
107188.254643255.837158Light (Ill): LuxLight (Ill)
\n", "

2217 rows × 4 columns

\n", "
" ], "text/plain": [ " timestamp Value Name Units\n", "0 0.338775 NaN Acceleration (g): X (25g) Acceleration (g)\n", "1 2.228761 0.012966 Acceleration (g): X (25g) Acceleration (g)\n", "2 4.118748 0.004471 Acceleration (g): X (25g) Acceleration (g)\n", "3 6.008682 0.009458 Acceleration (g): X (25g) Acceleration (g)\n", "4 7.898544 0.010230 Acceleration (g): X (25g) Acceleration (g)\n", ".. ... ... ... ...\n", "103 181.239308 88.318638 Light (Ill): Lux Light (Ill)\n", "104 182.993142 200.759452 Light (Ill): Lux Light (Ill)\n", "105 184.746975 124.224819 Light (Ill): Lux Light (Ill)\n", "106 186.500809 113.725342 Light (Ill): Lux Light (Ill)\n", "107 188.254643 255.837158 Light (Ill): Lux Light (Ill)\n", "\n", "[2217 rows x 4 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_dfs = merge_dfs(dfs,labels,plot_points=100)\n", "merged_dfs" ] }, { "cell_type": "markdown", "metadata": { "id": "S29jiHfJIm0X" }, "source": [ "### Facet Plot" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "wfgFoMEyIfOd", "outputId": "559b76de-c1a8-4021-d975-b8625d4dec0a" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(merged_dfs,\n", " x='timestamp',\n", " y='Value',\n", " facet_col='Units',\n", " facet_col_wrap = 4,\n", " color='Name',\n", " labels={'Value':''})\n", "\n", "fig.update_yaxes(matches=None)\n", "fig.update_layout(\n", " template=\"seaborn\",\n", " font_family='Open Sans',\n", " font_size=16,\n", " \n", " title_text = 'Facet Plot of All Channels',\n", " title_font_family = 'Open Sans ExtraBold',\n", " title_font_size = 24,\n", "\n", " legend_orientation = 'h',\n", " height=1000)\n", "fig.write_html('dashboard.html',full_html=False,include_plotlyjs='cdn') \n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "kCxu2ADrJQHZ", "outputId": "4033381a-8dc9-46da-a44b-2dee60361cf7" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(merged_dfs,\n", " x='timestamp',\n", " y='Value',\n", " facet_col='Units',\n", " facet_col_wrap = 1,\n", " facet_row_spacing=0.04,\n", " color='Name',\n", " labels={'Value':''})\n", "\n", "fig.update_yaxes(matches=None)\n", "fig.update_layout(\n", " template=\"seaborn\",\n", " font_family='Open Sans',\n", " font_size=16,\n", " \n", " title_text = 'Facet Plot of All Channels',\n", " title_font_family = 'Open Sans ExtraBold',\n", " title_font_size = 24,\n", "\n", " height=1000)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "KzTl6gRBM22s" }, "source": [ "## Quaternion Animation\n", "\n", "Let's pull in some data from an enDAQ sensor that has quaternions on, something that is impossible to understand! Here is what was done to the device:\n", "\n", "\n", "1. Roll +/- 45\n", "2. Roll +/- 90\n", "3. Pitch +/- 90\n", "4. Yaw +/- 90\n", "5. Roll 720\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "TBbMeLpk1fmz" }, "source": [ "### Quaternion Line" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 455 }, "id": "uMvggiG6tlRE", "outputId": "18ecbc17-f91d-4582-894f-89bd471ca4dd" }, "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", "
XYZW
timestamp
0.2176810.000549-0.000366-0.0002441.000000
0.2582340.001099-0.000488-0.0004881.000000
0.2987870.001404-0.000244-0.0004881.000000
0.3393400.035522-0.044434-0.0004270.998352
0.3798930.035522-0.044434-0.0006100.998352
...............
56.7892040.087402-0.025391-0.0673830.993591
56.8297570.086060-0.030212-0.0687870.993469
56.8703100.081360-0.031860-0.0686650.993774
56.9108630.071289-0.030334-0.0720210.994385
56.9514160.068848-0.034607-0.0740970.994263
\n", "

1400 rows × 4 columns

\n", "
" ], "text/plain": [ " X Y Z W\n", "timestamp \n", "0.217681 0.000549 -0.000366 -0.000244 1.000000\n", "0.258234 0.001099 -0.000488 -0.000488 1.000000\n", "0.298787 0.001404 -0.000244 -0.000488 1.000000\n", "0.339340 0.035522 -0.044434 -0.000427 0.998352\n", "0.379893 0.035522 -0.044434 -0.000610 0.998352\n", "... ... ... ... ...\n", "56.789204 0.087402 -0.025391 -0.067383 0.993591\n", "56.829757 0.086060 -0.030212 -0.068787 0.993469\n", "56.870310 0.081360 -0.031860 -0.068665 0.993774\n", "56.910863 0.071289 -0.030334 -0.072021 0.994385\n", "56.951416 0.068848 -0.034607 -0.074097 0.994263\n", "\n", "[1400 rows x 4 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "doc = endaq.ide.get_doc('https://info.endaq.com/hubfs/data/Roll_Pitch_Yaw.ide',quiet=True)\n", "df_quaternion = endaq.ide.to_pandas(doc.channels[70],time_mode='seconds')\n", "df_quaternion" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "k736fzQ11WTW", "outputId": "561474f2-a53a-4c0e-e8d6-f35006afb44f" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(df_quaternion)\n", "fig.update_layout(\n", " template_light,\n", " title_text = 'Quaternion',\n", " xaxis_title_text = 'Time',\n", " yaxis_title_text = 'Quaternion'\n", ")\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "7SzXFOtv1h0v" }, "source": [ "### Convert to Euler" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YOYPIaxKp_Ul" }, "outputs": [], "source": [ "def euler_from_quaternion(df_quaternion):\n", " \"\"\"\n", " Convert a quaternion into euler angles (roll, pitch, yaw)\n", " roll is rotation around x in radians (counterclockwise)\n", " pitch is rotation around y in radians (counterclockwise)\n", " yaw is rotation around z in radians (counterclockwise)\n", " \"\"\"\n", " \n", " x = df_quaternion['X'].to_numpy()\n", " y = df_quaternion['Y'].to_numpy()\n", " z = df_quaternion['Z'].to_numpy() \n", " w = df_quaternion['W'].to_numpy()\n", "\n", " t0 = +2.0 * (w * x + y * z)\n", " t1 = +1.0 - 2.0 * (x * x + y * y)\n", " roll_x = np.arctan2(t0, t1)\n", " \n", " t2 = +2.0 * (w * y - z * x)\n", " #t2[t2>1] = 1\n", " #t2[t2<-1] = -1\n", " pitch_y = np.arcsin(t2)\n", " \n", " t3 = +2.0 * (w * z + x * y)\n", " t4 = +1.0 - 2.0 * (y * y + z * z)\n", " yaw_z = np.arctan2(t3, t4)\n", " \n", " return pd.DataFrame({'Roll':roll_x,\n", " 'Pitch':pitch_y,\n", " 'Yaw':yaw_z},\n", " index=df_quaternion.index)" ] }, { "cell_type": "markdown", "metadata": { "id": "RknZiplT1j_G" }, "source": [ "### Euler Line" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 455 }, "id": "ohq-JqLeMf4d", "outputId": "d17f5645-1ea2-45d9-a8c9-dedca8e5bac3" }, "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", "
RollPitchYaw
timestamp
0.2176810.062957-0.041949-0.028000
0.2582340.125922-0.055891-0.056014
0.2987870.160879-0.027898-0.055992
0.3393404.085591-5.088270-0.230658
0.3798934.086525-5.087522-0.251689
............
56.78920410.208962-2.216580-7.957810
56.82975710.099325-2.762193-8.165903
56.8703109.573258-2.989384-8.155004
56.9108638.414331-2.869402-8.496235
56.9514168.179713-3.360261-8.764316
\n", "

1400 rows × 3 columns

\n", "
" ], "text/plain": [ " Roll Pitch Yaw\n", "timestamp \n", "0.217681 0.062957 -0.041949 -0.028000\n", "0.258234 0.125922 -0.055891 -0.056014\n", "0.298787 0.160879 -0.027898 -0.055992\n", "0.339340 4.085591 -5.088270 -0.230658\n", "0.379893 4.086525 -5.087522 -0.251689\n", "... ... ... ...\n", "56.789204 10.208962 -2.216580 -7.957810\n", "56.829757 10.099325 -2.762193 -8.165903\n", "56.870310 9.573258 -2.989384 -8.155004\n", "56.910863 8.414331 -2.869402 -8.496235\n", "56.951416 8.179713 -3.360261 -8.764316\n", "\n", "[1400 rows x 3 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "euler = euler_from_quaternion(df_quaternion)*180/np.pi\n", "euler" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "0ldDMu--M5mr", "outputId": "b83726be-b92e-49f7-8670-0101c4c76bc1" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(euler)\n", "fig.update_layout(\n", " template_light,\n", " title_text = 'Euler from Quaternion',\n", " xaxis_title_text = 'Time',\n", " yaxis_title_text = 'Angle (Degrees)'\n", ")\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "XHGpDUwQ1mxe" }, "source": [ "### Animation with Polar" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "BR3eKxyW16b0", "outputId": "82af1169-6568-4549-fb9e-3406d92324a7" }, "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", "
timevalueaxisr
00.220.062957Roll0.5
10.623.899420Roll0.5
21.031.825449Roll0.5
31.43-0.934873Roll0.5
41.84-9.934072Roll0.5
...............
13554.961.261520Yaw0.5
13655.37-0.815223Yaw0.5
13755.78-3.869159Yaw0.5
13856.18-6.322262Yaw0.5
13956.59-5.541401Yaw0.5
\n", "

420 rows × 4 columns

\n", "
" ], "text/plain": [ " time value axis r\n", "0 0.22 0.062957 Roll 0.5\n", "1 0.62 3.899420 Roll 0.5\n", "2 1.03 1.825449 Roll 0.5\n", "3 1.43 -0.934873 Roll 0.5\n", "4 1.84 -9.934072 Roll 0.5\n", ".. ... ... ... ...\n", "135 54.96 1.261520 Yaw 0.5\n", "136 55.37 -0.815223 Yaw 0.5\n", "137 55.78 -3.869159 Yaw 0.5\n", "138 56.18 -6.322262 Yaw 0.5\n", "139 56.59 -5.541401 Yaw 0.5\n", "\n", "[420 rows x 4 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_stacked = pd.DataFrame()\n", "euler_rolled = euler[::10]\n", "for col in euler_rolled.columns:\n", " df = euler_rolled[col].reset_index()\n", " df.columns = ['time','value']\n", " df['time'] = np.round(df['time'],2)\n", " df['axis'] = col\n", " df['r'] = 0.5\n", " df_stacked = pd.concat([df_stacked,df],axis=0)\n", "df_stacked " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "4nPf9wx6rj-X", "outputId": "fb6dd01f-a70c-4c9a-c96d-6d6951207adc" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.scatter_polar(df_stacked, r='r', theta=\"value\",color='axis',animation_frame='time')\n", "fig.update_layout(\n", " template=\"seaborn\",\n", " font_family='Open Sans',\n", " font_size=16,\n", " legend_title_text='',\n", " title_text = 'Euler Animation',\n", " title_font_family = 'Open Sans ExtraBold',\n", " title_font_size = 24,\n", ")\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "yxnxlYLp8mFa" }, "source": [ "In this representation it is quite easy to see what I did!\n", "\n", "1. Roll +/- 45\n", "2. Roll +/- 90\n", "3. Pitch +/- 90\n", "4. Yaw +/- 90\n", "5. Roll 720\n", "\n", "But... we see some issues with gimbal lock when doing the +/- 90 degree pitch, check out roll and yaw they act like I was spinning around!" ] }, { "cell_type": "markdown", "metadata": { "id": "kJZpYNvVTaAh" }, "source": [ "### Animation in 3D Space\n", "Now with some proper software developers (thank you Connor!), we can get pretty crazy to present this in 3D space with the coordinate system without any gimbal lock issues." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 455 }, "id": "M1LMFY8U1vdD", "outputId": "e061f242-7d6e-4c2a-b94e-2cf024cf4f9a" }, "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", "
XxXyXzYxYyYzZxZyZz
timestamp
0.2176811.000000-0.0004890.0007320.0004880.9999990.001099-0.000733-0.0010980.999999
0.2582340.999999-0.0009780.0009750.0009750.9999970.002198-0.000978-0.0021970.999997
0.2987870.999999-0.0009770.0004870.0009760.9999960.002808-0.000490-0.0028070.999996
0.3393400.996051-0.0040100.088695-0.0023040.9974760.070970-0.088756-0.0708940.993527
0.3798930.996050-0.0043760.088682-0.0019380.9974750.070986-0.088769-0.0708780.993527
..............................
56.7892040.989630-0.1383340.0386750.1294570.9756420.177098-0.062232-0.1702540.983433
56.8297570.988712-0.1418700.0481890.1314700.9757250.175146-0.071867-0.1668330.983362
56.8703100.988539-0.1416670.0521540.1312980.9773300.166093-0.074502-0.1573410.984730
56.9108630.987785-0.1475610.0500600.1389100.9794610.146148-0.070598-0.1374090.987995
56.9514160.986624-0.1521100.0586150.1425800.9795390.142036-0.079021-0.1317790.988125
\n", "

1400 rows × 9 columns

\n", "
" ], "text/plain": [ " Xx Xy Xz ... Zx Zy Zz\n", "timestamp ... \n", "0.217681 1.000000 -0.000489 0.000732 ... -0.000733 -0.001098 0.999999\n", "0.258234 0.999999 -0.000978 0.000975 ... -0.000978 -0.002197 0.999997\n", "0.298787 0.999999 -0.000977 0.000487 ... -0.000490 -0.002807 0.999996\n", "0.339340 0.996051 -0.004010 0.088695 ... -0.088756 -0.070894 0.993527\n", "0.379893 0.996050 -0.004376 0.088682 ... -0.088769 -0.070878 0.993527\n", "... ... ... ... ... ... ... ...\n", "56.789204 0.989630 -0.138334 0.038675 ... -0.062232 -0.170254 0.983433\n", "56.829757 0.988712 -0.141870 0.048189 ... -0.071867 -0.166833 0.983362\n", "56.870310 0.988539 -0.141667 0.052154 ... -0.074502 -0.157341 0.984730\n", "56.910863 0.987785 -0.147561 0.050060 ... -0.070598 -0.137409 0.987995\n", "56.951416 0.986624 -0.152110 0.058615 ... -0.079021 -0.131779 0.988125\n", "\n", "[1400 rows x 9 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rot = scipy.spatial.transform.Rotation.from_quat(np.array([df_quaternion[x] for x in 'XYZW']).T)\n", "X = rot.apply([1, 0, 0])\n", "Y = rot.apply([0, 1, 0])\n", "Z = rot.apply([0, 0, 1])\n", "\n", "df_trip = pd.DataFrame({letter + a: r[:, idx] for r, letter in zip([X, Y, Z], ['X', 'Y', 'Z']) for idx, a in enumerate('xyz')}, index=df_quaternion.index)\n", "df_trip" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "kWLSs7vPSm_p", "outputId": "e6df0ae0-7aa5-4bf3-ce17-8f46a8e513f6" }, "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", "
timexyzchannel
00.2176810.0000000.0000000.000000X
10.2176811.000000-0.0004890.000732X
20.2176810.0000000.0000000.000000Y
30.2176810.0004880.9999990.001099Y
40.2176810.0000000.0000000.000000Z
..................
83556.5864380.995064-0.0965370.022999X
83656.5864380.0000000.0000000.000000Y
83756.5864380.0906560.9785390.185050Y
83856.5864380.0000000.0000000.000000Z
83956.586438-0.040370-0.1820520.982460Z
\n", "

840 rows × 5 columns

\n", "
" ], "text/plain": [ " time x y z channel\n", "0 0.217681 0.000000 0.000000 0.000000 X\n", "1 0.217681 1.000000 -0.000489 0.000732 X\n", "2 0.217681 0.000000 0.000000 0.000000 Y\n", "3 0.217681 0.000488 0.999999 0.001099 Y\n", "4 0.217681 0.000000 0.000000 0.000000 Z\n", ".. ... ... ... ... ...\n", "835 56.586438 0.995064 -0.096537 0.022999 X\n", "836 56.586438 0.000000 0.000000 0.000000 Y\n", "837 56.586438 0.090656 0.978539 0.185050 Y\n", "838 56.586438 0.000000 0.000000 0.000000 Z\n", "839 56.586438 -0.040370 -0.182052 0.982460 Z\n", "\n", "[840 rows x 5 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vals = []\n", "for i in range(0, len(X), 10):\n", " vals.append({'time': df_quaternion.index[i], 'x': 0, 'y': 0, 'z': 0, 'channel': 'X' })\n", " vals.append({'time': df_quaternion.index[i], 'x': X[i, 0], 'y': X[i, 1], 'z': X[i, 2], 'channel': 'X'})\n", " vals.append({'time': df_quaternion.index[i], 'x': 0, 'y': 0, 'z': 0, 'channel': 'Y' })\n", " vals.append({'time': df_quaternion.index[i], 'x': Y[i, 0], 'y': Y[i, 1], 'z': Y[i, 2], 'channel': 'Y'})\n", " vals.append({'time': df_quaternion.index[i], 'x': 0, 'y': 0, 'z': 0, 'channel': 'Z' })\n", " vals.append({'time': df_quaternion.index[i], 'x': Z[i, 0], 'y': Z[i, 1], 'z': Z[i, 2], 'channel': 'Z'})\n", "df_rots = pd.DataFrame(vals)\n", "df_rots" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "bs94lVIPStNj", "outputId": "f42ebfa3-902e-437b-b472-758de4bd0e88", "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_rots['time'] = np.round(df_rots['time'],2)\n", "fig = px.line_3d(df_rots, x='x', y='y', z='z', color='channel', animation_frame='time')\n", "fig.update_layout(\n", " template=\"seaborn\",\n", " font_family='Open Sans',\n", " font_size=16,\n", " legend_title_text='',\n", " title_text = 'Quaternion 3D Animation',\n", " title_font_family = 'Open Sans ExtraBold',\n", " title_x = 0.5,\n", " title_font_size = 24,\n", " scene=dict(\n", " xaxis=dict(range=[-1.1, 1.1], nticks=5),\n", " yaxis=dict(range=[-1.1, 1.1], nticks=5),\n", " zaxis=dict(range=[-1.1, 1.1], nticks=5),\n", " aspectmode='cube',\n", " )\n", ")\n", "fig.write_html('quaternion-3d.html',full_html=False,include_plotlyjs='cdn') \n", "fig.show()" ] } ], "metadata": { "colab": { "collapsed_sections": [ "0D3y6shTAxtW", "1dCAvg8uIiFC", "7SzXFOtv1h0v" ], "machine_shape": "hm", "name": "Webinar-Introduction-Plotly.ipynb", "provenance": [], "toc_visible": true }, "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.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }