{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Making a data frame tall\n", "\n", "[Data set download](https://s3.amazonaws.com/bebi103.caltech.edu/data/Reeves2012_data.xlsx)\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "nbsphinx": "hide", "tags": [] }, "outputs": [], "source": [ "# Colab setup ------------------\n", "import os, sys, subprocess\n", "if \"google.colab\" in sys.modules:\n", " cmd = \"pip install --upgrade polars iqplot watermark\"\n", " process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n", " stdout, stderr = process.communicate()\n", " data_path = \"https://s3.amazonaws.com/bebi103.caltech.edu/data/\"\n", "else:\n", " data_path = \"../data/\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "'use strict';\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const 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", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const 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", " function drop(id) {\n", " const view = Bokeh.index.get_by_id(id)\n", " if (view != null) {\n", " view.model.document.clear()\n", " Bokeh.index.delete(view)\n", " }\n", " }\n", "\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", "\n", " // Clean up Bokeh references\n", " if (id != null) {\n", " drop(id)\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"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_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim()\n", " drop(id)\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const 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", " const 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", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let 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", " const 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", " const 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", " const events = require('base/js/events');\n", " const 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", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const 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", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded(error = null) {\n", " const el = document.getElementById(\"c11291e7-7987-41fc-ab4d-df03e9533dce\");\n", " if (el != null) {\n", " const html = (() => {\n", " if (typeof root.Bokeh === \"undefined\") {\n", " if (error == null) {\n", " return \"BokehJS is loading ...\";\n", " } else {\n", " return \"BokehJS failed to load.\";\n", " }\n", " } else {\n", " const prefix = `BokehJS ${root.Bokeh.version}`;\n", " if (error == null) {\n", " return `${prefix} successfully loaded.`;\n", " } else {\n", " return `${prefix} encountered errors while loading and may not function as expected.`;\n", " }\n", " }\n", " })();\n", " el.innerHTML = html;\n", "\n", " if (error != null) {\n", " const wrapper = document.createElement(\"div\");\n", " wrapper.style.overflow = \"auto\";\n", " wrapper.style.height = \"5em\";\n", " wrapper.style.resize = \"vertical\";\n", " const content = document.createElement(\"div\");\n", " content.style.fontFamily = \"monospace\";\n", " content.style.whiteSpace = \"pre-wrap\";\n", " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", " content.textContent = error.stack ?? error.toString();\n", " wrapper.append(content);\n", " el.append(wrapper);\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(() => display_loaded(error), 100);\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", " 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", " 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", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.1.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " try {\n", " for (let i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\n", "\n", " } catch (error) {display_loaded(error);throw error;\n", " }if (force === true) {\n", " display_loaded();\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", " const cell = $(document.getElementById(\"c11291e7-7987-41fc-ab4d-df03e9533dce\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\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": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const 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 \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"c11291e7-7987-41fc-ab4d-df03e9533dce\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\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 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 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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\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 const cell = $(document.getElementById(\"c11291e7-7987-41fc-ab4d-df03e9533dce\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\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" } ], "source": [ "import numpy as np\n", "import polars as pl\n", "\n", "import iqplot\n", "\n", "import bokeh.io\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "In this part of the lesson, we will perform some wrangling on a data set that involves:\n", "\n", "- Using Polars's `read_excel()` function to read in data from an MS Excel spread sheet\n", "- Parsing column names to extract useful metadata en route to tidy data\n", "- Performing an unpivot operation to efficiently tidy a data set." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The data set\n", "\n", "We will use a data set from [Angela Stathopoulos's lab](http://www.stathlab.caltech.edu), acquired to study morphogen profiles in developing fruit fly embryos. The original paper is [Reeves, Trisnadi, et al., Dorsal-ventral gene expression\n", "in the *Drosophila* embryo reflects the dynamics and precision of the Dorsal nuclear gradient, *Dev. Cell.*, **22**, 544-557, 2012](https://doi.org/10.1016/j.devcel.2011.12.007), and the data set may be downloaded here: [https://s3.amazonaws.com/bebi103.caltech.edu/data/Reeves2012_data.xlsx](https://s3.amazonaws.com/bebi103.caltech.edu/data/Reeves2012_data.xlsx).\n", "\n", "In this experiment, Reeves, Trisnadi, and coworkers measured expression levels of a fusion of Dorsal, a morphogen transcription factor important in determining the dorsal-ventral axis of the developing organism, and Venus, a yellow fluorescent protein along the dorsal/ventral- (DV) coordinate. They put this construct on the third chromosome, while the wild type *dorsal* is on the second. Instead of the wild type, they had a homozygous *dorsal*-null mutant on the second chromosome. The Dorsal-Venus construct rescues wild type behavior, so they could use this construct to study Dorsal gradients.\n", "\n", "Dorsal shows higher expression on the ventral side of the organism, thus giving a *gradient* in expression from dorsal to ventral which can be ascertained by the spatial distribution of Venus fluorescence intensity.\n", "\n", "This can be seen in the image below, which is a cross section of a fixed embryo with anti-Dorsal staining. The bottom of the image is the ventral side and the top is the dorsal side of the embryo. The DV coordinate system is defined by the yellow line. The image is adapted from the Reeves, Trisnadi, et al. paper.\n", "\n", "
\n", "\n", "![Dorsal gradient](DV_coord.png)\n", " \n", "
\n", "\n", "*A quick note on nomenclature:* Dorsal (capital D) is the name of the protein product of the gene *dorsal* (italicized). The dorsal (adjective) side of the embryo is its back. The ventral side is its belly. Dorsal is expressed more strongly on the _ventral side_ of the developing embryo. This can be confusing.\n", "\n", "To quantify the gradient, Reeves, Trisnadi, and coworkers had to first choose a metric for describing it. They chose to fit the measured profile of fluorescence intensity with a Gaussian peak (plus background) and use the standard deviation of that Gaussian as a metric for the width of the Dorsal gradient.\n", "\n", "In this lesson, we will use the gradient widths as outputted from this procedure. The units of the widths are dimensionless, consistent with the coordinate system shown in the image above. I asked one of the authors for the data sets used in making the figures. She sent me a MS Excel file that had a separate sheet for each of several figures in the paper that I asked about. We will focus on the data used for Fig. 1F of the paper. In this figure, the authors seek to demonstrate that live imaging with their Venus-Dorsal construct gives a Dorsal gradient of similar width as would be obtained by fixing wild type cells and doing Dorsal antibody staining (the gold standard). These wild type embryos were analyzed as whole mounts and also as cross sections. They also tried anti-Dorsal staining and anti-Venus staining in the Venus-Dorsal construct. Finally, they also measured gradient widths of a GFP-Dorsal construct that fails to complete development." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading in an Excel sheet\n", "\n", "Generally, you should store your data sets in portable formats, like CSV, JSON, XML, HDF5, OME-TIFF, etc., and not proprietary formats. Nonetheless, software like Microsoft Excel is widely used, and you will often receive data sets in this format. Fortunately, Polars can read Excel files, provided they are from fairly recent versions of Excel.\n", "\n", "To read in this data set, we will use `pl.read_excel()`. Importantly, because an Excel document may have many sheets, we need to specify the sheet name we want, in this case `'Fig 1F'`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (5, 8)
wt wholemountswt cross-sectionsanti-Dorsal dl1/+dl-venus/+anti-gfp dl1/+dl-venus/+Venus (live) dl1/+dl-venus/+anti-Dorsal dl1/+dl-GFP/+anti-gfp dl1/+dl-GFP/+ GFP (live) dl1/+dl-GFP/+
f64f64f64f64f64f64f64f64
0.12880.13270.14820.16320.16660.22480.23890.2412
0.15540.14570.15030.16710.17530.18910.20350.1942
0.13060.14470.15770.17040.17050.17050.19430.2186
0.14130.12820.17110.1779null0.17350.20.2104
0.15570.14870.13420.1483null0.21350.2560.2463
" ], "text/plain": [ "shape: (5, 8)\n", "┌────────────┬────────────┬────────────┬───────────┬───────────┬───────────┬───────────┬───────────┐\n", "│ wt wholemo ┆ wt cross-s ┆ anti-Dorsa ┆ anti-gfp ┆ Venus ┆ anti-Dors ┆ anti-gfp ┆ GFP │\n", "│ unts ┆ ections ┆ l dl1/+dl- ┆ dl1/+dl-v ┆ (live) ┆ al dl1/+ ┆ dl1/+dl-G ┆ (live) │\n", "│ --- ┆ --- ┆ venus/+ ┆ enus/+ ┆ dl1/+dl-v ┆ dl-GFP/+ ┆ FP/+ ┆ dl1/+dl-G │\n", "│ f64 ┆ f64 ┆ --- ┆ --- ┆ enus/+ ┆ --- ┆ --- ┆ FP/+ │\n", "│ ┆ ┆ f64 ┆ f64 ┆ --- ┆ f64 ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ f64 ┆ ┆ ┆ f64 │\n", "╞════════════╪════════════╪════════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 0.1288 ┆ 0.1327 ┆ 0.1482 ┆ 0.1632 ┆ 0.1666 ┆ 0.2248 ┆ 0.2389 ┆ 0.2412 │\n", "│ 0.1554 ┆ 0.1457 ┆ 0.1503 ┆ 0.1671 ┆ 0.1753 ┆ 0.1891 ┆ 0.2035 ┆ 0.1942 │\n", "│ 0.1306 ┆ 0.1447 ┆ 0.1577 ┆ 0.1704 ┆ 0.1705 ┆ 0.1705 ┆ 0.1943 ┆ 0.2186 │\n", "│ 0.1413 ┆ 0.1282 ┆ 0.1711 ┆ 0.1779 ┆ null ┆ 0.1735 ┆ 0.2 ┆ 0.2104 │\n", "│ 0.1557 ┆ 0.1487 ┆ 0.1342 ┆ 0.1483 ┆ null ┆ 0.2135 ┆ 0.256 ┆ 0.2463 │\n", "└────────────┴────────────┴────────────┴───────────┴───────────┴───────────┴───────────┴───────────┘" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pl.read_excel(os.path.join(data_path, \"Reeves2012_data.xlsx\"), sheet_name=\"Fig 1F\")\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data frame is not tidy. Each *entry* corresponds to one observation, not each row. The column headings contain important metadata, the genotype (wt, dl1/+dl-venus/+, or dl1/+dl-GFP/+) and the method (wholemounts, cross-sections, anti-Dorsal, anti-gfp, Venus (live), and GFP (live)). \n", "\n", "The data set has other issues we need to clean up. The column `'anti-gfp dl1/+dl-venus/+'` is mislabeled; it should be `'anti-Venus dl1/+dl-venus/+'`. We would also like to clean up the genotypes, putting in a semicolon to separate the chromosomes. The wild type columns have the genotype first (`'wt'`) followed by the method, whereas the other columns have the method first, followed by genotype." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parsing the column names\n", "\n", "We will start our process of tidying this data set by changing the column names. They are pretty messy, so this is best done by hand in this case. We will rename the columns with strings where the genotype comes first, followed by the method for measuring the gradient width, separated by an underscore." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (5, 8)
WT_whole mountWT_cross-sectiondl1/+ ; dl-venus/+_anti-Dorsaldl1/+ ; dl-venus/+_anti-Venusdl1/+ ; dl-venus/+_Venus (live)dl1/+ ; dl-gfp/+_anti-Dorsaldl1/+ ; dl-gfp/+_anti-GFPdl1/+ ; dl-gfp/+_GFP (live)
f64f64f64f64f64f64f64f64
0.12880.13270.14820.16320.16660.22480.23890.2412
0.15540.14570.15030.16710.17530.18910.20350.1942
0.13060.14470.15770.17040.17050.17050.19430.2186
0.14130.12820.17110.1779null0.17350.20.2104
0.15570.14870.13420.1483null0.21350.2560.2463
" ], "text/plain": [ "shape: (5, 8)\n", "┌────────────┬────────────┬────────────┬───────────┬───────────┬───────────┬───────────┬───────────┐\n", "│ WT_whole ┆ WT_cross-s ┆ dl1/+ ; ┆ dl1/+ ; ┆ dl1/+ ; ┆ dl1/+ ; ┆ dl1/+ ; ┆ dl1/+ ; │\n", "│ mount ┆ ection ┆ dl-venus/+ ┆ dl-venus/ ┆ dl-venus/ ┆ dl-gfp/+_ ┆ dl-gfp/+_ ┆ dl-gfp/+_ │\n", "│ --- ┆ --- ┆ _anti-Dors ┆ +_anti-Ve ┆ +_Venus ┆ anti-Dors ┆ anti-GFP ┆ GFP │\n", "│ f64 ┆ f64 ┆ al ┆ nus ┆ (live… ┆ al ┆ --- ┆ (live) │\n", "│ ┆ ┆ --- ┆ --- ┆ --- ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ ┆ f64 │\n", "╞════════════╪════════════╪════════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 0.1288 ┆ 0.1327 ┆ 0.1482 ┆ 0.1632 ┆ 0.1666 ┆ 0.2248 ┆ 0.2389 ┆ 0.2412 │\n", "│ 0.1554 ┆ 0.1457 ┆ 0.1503 ┆ 0.1671 ┆ 0.1753 ┆ 0.1891 ┆ 0.2035 ┆ 0.1942 │\n", "│ 0.1306 ┆ 0.1447 ┆ 0.1577 ┆ 0.1704 ┆ 0.1705 ┆ 0.1705 ┆ 0.1943 ┆ 0.2186 │\n", "│ 0.1413 ┆ 0.1282 ┆ 0.1711 ┆ 0.1779 ┆ null ┆ 0.1735 ┆ 0.2 ┆ 0.2104 │\n", "│ 0.1557 ┆ 0.1487 ┆ 0.1342 ┆ 0.1483 ┆ null ┆ 0.2135 ┆ 0.256 ┆ 0.2463 │\n", "└────────────┴────────────┴────────────┴───────────┴───────────┴───────────┴───────────┴───────────┘" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "col_names = {\n", " 'wt wholemounts': 'WT_whole mount',\n", " 'wt cross-sections': 'WT_cross-section',\n", " 'anti-Dorsal dl1/+dl-venus/+': 'dl1/+ ; dl-venus/+_anti-Dorsal',\n", " 'anti-gfp dl1/+dl-venus/+': 'dl1/+ ; dl-venus/+_anti-Venus',\n", " 'Venus (live) dl1/+dl-venus/+': 'dl1/+ ; dl-venus/+_Venus (live)',\n", " 'anti-Dorsal dl1/+dl-GFP/+': 'dl1/+ ; dl-gfp/+_anti-Dorsal',\n", " 'anti-gfp dl1/+dl-GFP/+ ': 'dl1/+ ; dl-gfp/+_anti-GFP',\n", " 'GFP (live) dl1/+dl-GFP/+': 'dl1/+ ; dl-gfp/+_GFP (live)'\n", "}\n", "\n", "df = df.rename(col_names)\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Unpivot the data frame\n", "\n", "When we **unpivot** the data frame, the data within it, called **values**, become a single column. The column names, called **variables** also populate a new column. So, to unpivot it, we need to specify what we want to call the values and what we want to call the variable. The `unpivot()` method does the rest!" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (5, 2)
genotype_methodgradient width
strf64
"WT_whole mount"0.1288
"WT_whole mount"0.1554
"WT_whole mount"0.1306
"WT_whole mount"0.1413
"WT_whole mount"0.1557
" ], "text/plain": [ "shape: (5, 2)\n", "┌─────────────────┬────────────────┐\n", "│ genotype_method ┆ gradient width │\n", "│ --- ┆ --- │\n", "│ str ┆ f64 │\n", "╞═════════════════╪════════════════╡\n", "│ WT_whole mount ┆ 0.1288 │\n", "│ WT_whole mount ┆ 0.1554 │\n", "│ WT_whole mount ┆ 0.1306 │\n", "│ WT_whole mount ┆ 0.1413 │\n", "│ WT_whole mount ┆ 0.1557 │\n", "└─────────────────┴────────────────┘" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.unpivot(\n", " variable_name='genotype_method', \n", " value_name='gradient width'\n", ").drop_nulls()\n", "\n", "# Take a look\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nice! We now have a tidy data frame. Note that we also dropped the null values, since the nulls from the original columns come along for the ride when unpivoting.\n", "\n", "Note that `df.unpivot()` has other options. For example, you can specify columns that do not comprise data, but should still be included in the unpivoted data frame using the `id_vars` keyword argument. That does not apply to this data frame, but comes up often. As a final comment, note that unpivoting is sometimes called **melting**, as it is when using Pandas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Splitting the genotype_method column\n", "\n", "Now our goal is to convert the `'genotype_method'` column into a two columns, one encoding genotype and the other the method. To do this, we first use Polars's string methods to split the entries in the column at the underscore. This gives a series of list data types. We then convert the list to a struct, where the fields are the column labels we want when we split the column into two, in this case `'genotype'` and `'method'`. Finally, we can unnest the column with our structs." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (5, 3)
genotypemethodgradient width
strstrf64
"WT""whole mount"0.1288
"WT""whole mount"0.1554
"WT""whole mount"0.1306
"WT""whole mount"0.1413
"WT""whole mount"0.1557
" ], "text/plain": [ "shape: (5, 3)\n", "┌──────────┬─────────────┬────────────────┐\n", "│ genotype ┆ method ┆ gradient width │\n", "│ --- ┆ --- ┆ --- │\n", "│ str ┆ str ┆ f64 │\n", "╞══════════╪═════════════╪════════════════╡\n", "│ WT ┆ whole mount ┆ 0.1288 │\n", "│ WT ┆ whole mount ┆ 0.1554 │\n", "│ WT ┆ whole mount ┆ 0.1306 │\n", "│ WT ┆ whole mount ┆ 0.1413 │\n", "│ WT ┆ whole mount ┆ 0.1557 │\n", "└──────────┴─────────────┴────────────────┘" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.with_columns(\n", " pl.col('genotype_method')\n", " .str.split('_')\n", " .list.to_struct(fields=['genotype', 'method'])\n", ").unnest('genotype_method')\n", "\n", "# Take a look\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at the data frame above, it is very **tall**. Each row only has a single **value**, that is, a single measurement, and every other column in the row is metadata associated with that measurement, specifically which penguin/species and which quantity was being measured. Unpivoting operations generally make data frames taller, with more rows before unpivoting." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using the data frame\n", "\n", "Let's make a plot like Fig. 1F of the [Reeves, Trisnadi, et al. paper](https://doi.org/10.1016/j.devcel.2011.12.007), but not with boxes, rather as a strip plot." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"79d36428-2775-47cb-a6f0-00448bd56548\":{\"version\":\"3.4.1\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1002\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1004\"},\"y_range\":{\"type\":\"object\",\"name\":\"FactorRange\",\"id\":\"p1001\",\"attributes\":{\"factors\":[[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"Venus (live)\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"GFP (live)\"],[\"WT\",\"whole mount\"],[\"WT\",\"cross-section\"]]}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1011\"},\"y_scale\":{\"type\":\"object\",\"name\":\"CategoricalScale\",\"id\":\"p1012\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1009\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1044\",\"attributes\":{\"name\":\"hover_glyphs\",\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1035\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1036\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1037\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAewAAAHwAAAB9AAAAfgAAAH8AAACAAAAAgQAAAIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACJAAAAigAAAIsAAACMAAAAjQAAAI4AAACPAAAAkAAAAJEAAACSAAAAkwAAAJQAAACVAAAAlgAAAJcAAACYAAAAmQAAAJoAAACbAAAAnAAAAJ0AAACeAAAAnwAAAKAAAAChAAAAogAAAKMAAACkAAAApQAAAKYAAACnAAAAqAAAAKkAAACqAAAAqwAAAKwAAACtAAAArgAAAK8AAAA=\"},\"shape\":[176],\"dtype\":\"int32\",\"order\":\"little\"}],[\"gradient width\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"P8bctYR8wD/5MeauJeTDP9bFbTSAt8A/2V92Tx4Wwj+SXP5D+u3DP+auJeSDnsU/+u3rwDkjwj+iRbbz/dTAP5T2Bl+YTMU/K4cW2c73wz8DCYofY+7CP+F6FK5H4cI/rrZif9k9wT8Q6bevA+e8PwAAAAAAAMA/Dr4wmSoYxT+BlUOLbOfDP4V80LNZ9cE/5j+k374OvD/arPpcbcXGP5tVn6ut2L8/BhIUP8bcxT/3deCcEaXFP6RwPQrXo8A/B/AWSFD8wD9Ke4MvTKbCP/aX3ZOHhcI/DXGsi9towD9GJXUCmgjDP+tztRX7y74/okW28/3UwD990LNZ9bnCP9Pe4AuTqcI//Bhz1xLywT+gGi/dJAbBP5qZmZmZmcE/sb/snjwsxD8ibHh6pSzDP0Ck374OnMM/WKg1zTtOwT8mUwWjkjrBP71SliGOdcE/5/up8dJNwj8730+Nl27CP7TIdr6fGsc/XkvIBz2bxT9ApN++DpzDP6OSOgFNhMU/TKYKRiV1wj+si9toAG/BPyDSb18HzsE/rWnecYqOxD8jSnuDL0zGP0oMAiuHFsE/rrZif9k9wT8N4C2QoPjBP/2H9NvXgcM/ryXkg57Nwj9GtvP91HjBP4EmwoanV8I/i/1l9+RhwT9kzF1LyAfFP3gLJCh+jME/2T15WKg1vT8aUdobfGHCPzsBTYQNT78/W0I+6Nmswj/f4AuTqYLBPyL99nXgnME/A3gLJCh+xD9v8IXJVMHAP05iEFg5tMA/PE7RkVz+wz86I0p7gy/EP4PAyqFFtsM/1QloImx4wj+9UpYhjnXBPxWMSuoENME/okW28/3UwD+QMXctIR/EP8RCrWneccI/Y+5aQj7owT+aCBueXinDP4Za07zjFMU/7lpCPujZxD9UdCSX/5C+P4Lix5i7lsA/ofgx5q4lxD9GtvP91HjBPzLmriXkg8Y/7MA5I0p7wz/ZzvdT46XDP9uK/WX35ME/Ke0NvjCZwj/3Bl+YTBXEP+QUHcnlP8Q/EoPAyqFFxj/rc7UV+8vGP86I0t7gC8M/DJOpglFJxT86kst/SL/FP76fGi/dJMY/yXa+nxovxT98YTJVMCrBP4V80LNZ9bk/I9v5fmq8xD/kg57Nqs/FP6vP1VbsL8M/Dr4wmSoYxT9SJ6CJsOHBP7x0kxgEVsY/PL1SliGOxT9j7lpCPujBP5jdk4eFWsM/Tx4Wak3zxj9bsb/snjzEPzEIrBxaZMM/jZduEoPAwj8j2/l+arzEP1uxv+yePMQ/oyO5/If0wz83iUFg5dDCP+XQItv5fsI/YHZPHhZqxT9cIEHxY8zFP4PAyqFFtsM/exSuR+F6xD8+6Nms+ly9P7MMcayL28A/xSCwcmiRxT/pJjEIrBzCPylcj8L1KMQ//Yf029eBwz8RNjy9UpbBP1mGONbFbcQ/CD2bVZ+rvT9seHqlLEO8P9/gC5OpgsE/qz5XW7G/xD9GlPYGX5i8P8SxLm6jAcQ/001iEFg5xD/jpZvEILDCPwTnjCjtDb4/16NwPQrXwz8H8BZIUPzAP9UJaCJseMI/F7fRAN4CwT/mP6Tfvg7EP4enV8oyxME/B1+YTBWMwj/G3LWEfNDDPyV1ApoIG8Y/kxgEVg4twj9oke18PzXGP1MFo5I6AcU/mbuWkA96xj/3deCcEaXFP/KwUGuad8Q/MCqpE9BEwD8nwoanV8rCP99PjZduEsM/9UpZhjjWxT+V1AloImzAP/YoXI/C9cA/DJOpglFJxT/2KFyPwvXAP6d5xyk6ksM/K/aX3ZOHxT+SXP5D+u3DPzojSnuDL8Q/FvvL7snDwj9Pr5RliGPFP/7UeOkmMcA/f/s6cM6Iwj8Sg8DKoUXGPw==\"},\"shape\":[176],\"dtype\":\"float64\",\"order\":\"little\"}],[\"genotype\",{\"type\":\"ndarray\",\"array\":[\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\"],\"shape\":[176],\"dtype\":\"object\",\"order\":\"little\"}],[\"method\",{\"type\":\"ndarray\",\"array\":[\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"whole mount\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\",\"cross-section\"],\"shape\":[176],\"dtype\":\"object\",\"order\":\"little\"}],[\"cat\",{\"type\":\"ndarray\",\"array\":[[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"whole mount\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"],[\"WT\",\"cross-section\"]],\"shape\":[176],\"dtype\":\"object\",\"order\":\"little\"}],[\"__label\",{\"type\":\"ndarray\",\"array\":[\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\"],\"shape\":[176],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1045\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1046\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1041\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"type\":\"object\",\"name\":\"Jitter\",\"id\":\"p1034\",\"attributes\":{\"width\":0.1,\"distribution\":\"normal\",\"range\":{\"id\":\"p1001\"}}}},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1042\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"id\":\"p1034\"}},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1043\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"id\":\"p1034\"}},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1056\",\"attributes\":{\"name\":\"hover_glyphs\",\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1047\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1048\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1049\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAPQAAAD1AAAA9gAAAPcAAAD4AAAA+QAAAPoAAAD7AAAA/AAAAP0AAAD+AAAA/wAAAAABAAABAQAAAgEAAAMBAAAEAQAABQEAAAYBAAAHAQAACAEAAAkBAAAKAQAACwEAAAwBAAANAQAADgEAAA8BAAAQAQAAEQEAABIBAAATAQAAFAEAABUBAAAWAQAAFwEAABgBAAAZAQAAGgEAAA==\"},\"shape\":[46],\"dtype\":\"int32\",\"order\":\"little\"}],[\"gradient width\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"vAUSFD/GzD+GONbFbTTIP23n+6nx0sU/aJHtfD81xj+HFtnO91PLP1XBqKROQMs/c9cS8kHPxj924JwRpb3JP9bFbTSAt8g/ZF3cRgN4yz+oV8oyxLHOP26jAbwFEsw/RiV1ApoIyz9DHOviNhrQPzLmriXkg8Y/HcnlP6Tfxj/LoUW28/3EP5m7lpAPesY/WKg1zTtOyT/WVuwvuyfHP9zXgXNGlM4/PzVeukkMyj87cM6I0t7IP5qZmZmZmck//Knx0k1i0D88vVKWIY7NP23F/rJ78sg/r5RliGNdzD9xPQrXo3DNP3xhMlUwKtE/7lpCPujZ0D9WDi2yne/PP67YX3ZPHs4/1JrmHafo0D9oImx4eqXMP99PjZduEss/b/CFyVTByD9yio7k8h/KP/vL7snDQs0/AwmKH2Puyj8dyeU/pN/OP7MMcayL28g/s+pztRX7yz8DCYofY+7KP0mdgCbChs8/QmDl0CLbyT8=\"},\"shape\":[46],\"dtype\":\"float64\",\"order\":\"little\"}],[\"genotype\",{\"type\":\"ndarray\",\"array\":[\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\"],\"shape\":[46],\"dtype\":\"object\",\"order\":\"little\"}],[\"method\",{\"type\":\"ndarray\",\"array\":[\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"anti-GFP\",\"GFP (live)\",\"GFP (live)\",\"GFP (live)\",\"GFP (live)\",\"GFP (live)\",\"GFP (live)\"],\"shape\":[46],\"dtype\":\"object\",\"order\":\"little\"}],[\"cat\",{\"type\":\"ndarray\",\"array\":[[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"anti-GFP\"],[\"dl1/+ ; dl-gfp/+\",\"GFP (live)\"],[\"dl1/+ ; dl-gfp/+\",\"GFP (live)\"],[\"dl1/+ ; dl-gfp/+\",\"GFP (live)\"],[\"dl1/+ ; dl-gfp/+\",\"GFP (live)\"],[\"dl1/+ ; dl-gfp/+\",\"GFP (live)\"],[\"dl1/+ ; dl-gfp/+\",\"GFP (live)\"]],\"shape\":[46],\"dtype\":\"object\",\"order\":\"little\"}],[\"__label\",{\"type\":\"ndarray\",\"array\":[\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-gfp/+\"],\"shape\":[46],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1057\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1058\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1053\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"id\":\"p1034\"}},\"line_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1054\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"id\":\"p1034\"}},\"line_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1055\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"id\":\"p1034\"}},\"line_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#ff7e0e\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1068\",\"attributes\":{\"name\":\"hover_glyphs\",\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1059\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1060\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1061\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"sAAAALEAAACyAAAAswAAALQAAAC1AAAAtgAAALcAAAC4AAAAuQAAALoAAAC7AAAAvAAAAL0AAAC+AAAAvwAAAMAAAADBAAAAwgAAAMMAAADEAAAAxQAAAMYAAADHAAAAyAAAAMkAAADKAAAAywAAAMwAAADNAAAAzgAAAM8AAADQAAAA0QAAANIAAADTAAAA1AAAANUAAADWAAAA1wAAANgAAADZAAAA2gAAANsAAADcAAAA3QAAAN4AAADfAAAA4AAAAOEAAADiAAAA4wAAAOQAAADlAAAA5gAAAOcAAADoAAAA6QAAAOoAAADrAAAA7AAAAA==\"},\"shape\":[61],\"dtype\":\"int32\",\"order\":\"little\"}],[\"gradient width\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"nDOitDf4wj/MXUvIBz3DPzojSnuDL8Q/nzws1JrmxT8FxY8xdy3BP6hXyjLEscY/bef7qfHSxT9ZhjjWxW3EPwN4CyQofsQ/cM6I0t7gwz9xPQrXo3DFP3/ZPXlYqMU/9dvXgXNGxD+1FfvL7snDPyUGgZVDi8Q/iPTb14Fzxj/P91PjpZvEP2iz6nO1FcM/TKYKRiV1wj+u2F92Tx7GP1FrmnecosM/sb/snjwsxD9LWYY41sXFPxpR2ht8YcI/Rdjw9EpZxj+yLm6jAbzFPxfZzvdT48U/gZVDi2znwz8BTYQNT6/EP4iFWtO848Q/T6+UZYhjxT/kg57Nqs/FP9qs+lxtxcY/JJf/kH77wj+P5PIf0m/HP/s6cM6I0sY/LSEf9GxWxT9iEFg5tMjGP7ivA+eMKMU/BhIUP8bcxT9iEFg5tMjGPxKDwMqhRcY/ih9j7lpCxj9vgQTFjzHHP2N/2T15WMg/YhBYObTIxj9EaW/whcnEP3DOiNLe4MM//mX35GGhxj9LWYY41sXFP4xK6gQ0EcY/ArwFEhQ/xj9cIEHxY8zFP2sr9pfdk8c/arx0kxgExj/FjzF3LSHHP+lILv8h/cY/MuauJeSDxj+lvcEXJlPFPwCRfvs6cMY/bef7qfHSxT8=\"},\"shape\":[61],\"dtype\":\"float64\",\"order\":\"little\"}],[\"genotype\",{\"type\":\"ndarray\",\"array\":[\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\"],\"shape\":[61],\"dtype\":\"object\",\"order\":\"little\"}],[\"method\",{\"type\":\"ndarray\",\"array\":[\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Dorsal\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"anti-Venus\",\"Venus (live)\",\"Venus (live)\",\"Venus (live)\"],\"shape\":[61],\"dtype\":\"object\",\"order\":\"little\"}],[\"cat\",{\"type\":\"ndarray\",\"array\":[[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Dorsal\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"anti-Venus\"],[\"dl1/+ ; dl-venus/+\",\"Venus (live)\"],[\"dl1/+ ; dl-venus/+\",\"Venus (live)\"],[\"dl1/+ ; dl-venus/+\",\"Venus (live)\"]],\"shape\":[61],\"dtype\":\"object\",\"order\":\"little\"}],[\"__label\",{\"type\":\"ndarray\",\"array\":[\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\",\"dl1/+ ; dl-venus/+\"],\"shape\":[61],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1069\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1070\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1065\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"id\":\"p1034\"}},\"line_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1066\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"id\":\"p1034\"}},\"line_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1067\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"gradient width\"},\"y\":{\"type\":\"field\",\"field\":\"cat\",\"transform\":{\"id\":\"p1034\"}},\"line_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#2ba02b\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1010\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1023\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1024\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1025\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1026\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1031\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1032\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1033\"}]}},\"toolbar_location\":\"above\",\"left\":[{\"type\":\"object\",\"name\":\"CategoricalAxis\",\"id\":\"p1018\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"CategoricalTicker\",\"id\":\"p1019\"},\"formatter\":{\"type\":\"object\",\"name\":\"CategoricalTickFormatter\",\"id\":\"p1020\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1021\"}}}],\"right\":[{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p1071\",\"attributes\":{\"location\":\"center\",\"title\":\"genotype\",\"click_policy\":\"hide\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1072\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"WT\"},\"renderers\":[{\"id\":\"p1044\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1073\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"dl1/+ ; dl-gfp/+\"},\"renderers\":[{\"id\":\"p1056\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1074\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"dl1/+ ; dl-venus/+\"},\"renderers\":[{\"id\":\"p1068\"}]}}]}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1013\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1014\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1015\"},\"axis_label\":\"gradient width\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1016\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1017\",\"attributes\":{\"axis\":{\"id\":\"p1013\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1022\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1018\"},\"grid_line_color\":null}}],\"frame_width\":450,\"frame_height\":350}}]}};\n", " const render_items = [{\"docid\":\"79d36428-2775-47cb-a6f0-00448bd56548\",\"roots\":{\"p1002\":\"def9e14a-92c9-45f3-afd1-03f4ccc08eac\"},\"root_ids\":[\"p1002\"]}];\n", " void root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const 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": "p1002" } }, "output_type": "display_data" } ], "source": [ "p = iqplot.strip(\n", " data=df,\n", " q='gradient width',\n", " cats=['genotype', 'method'],\n", " color_column='genotype',\n", " spread=\"jitter\",\n", " frame_height=350,\n", " frame_width=450,\n", ")\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computing environment" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python implementation: CPython\n", "Python version : 3.12.4\n", "IPython version : 8.25.0\n", "\n", "polars : 1.6.0\n", "bokeh : 3.4.1\n", "iqplot : 0.3.7\n", "jupyterlab: 4.0.13\n", "\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p polars,bokeh,iqplot,jupyterlab" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 4 }