{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Melting a data frame\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": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "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\") || (!output.data.hasOwnProperty(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", " }\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", " \"\\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(\"1001\");\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() {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (var i = 0; i < css_urls.length; i++) {\n", " var url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error;\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 (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error;\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", " };var element = document.getElementById(\"1001\");\n", " if (element == null) {\n", " console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n", " return false;\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", " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.3.4.min.js\"];\n", " var css_urls = [];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " },\n", " function(Bokeh) {} // ensure no trailing comma for IE\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((root.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\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", " var cell = $(document.getElementById(\"1001\")).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 \"\\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(\"1001\");\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() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\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 (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\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 };var element = document.getElementById(\"1001\");\n if (element == null) {\n console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n return false;\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 var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.3.4.min.js\"];\n var css_urls = [];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\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 var cell = $(document.getElementById(\"1001\")).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" } ], "source": [ "import pandas as pd\n", "\n", "import bebi103\n", "\n", "import bokeh.io\n", "import bokeh_catplot\n", "\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*You should install the xlrd package to enable Pandas to read in MS Excel file. Before running this lesson, execute the following on the command line.*\n", "\n", "```bash\n", "conda install xlrd\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "In this tutorial, we will perform some wrangling on a data set that involves:\n", "\n", "- Using Pandas'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 a melt 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).\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, ONE-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, Pandas can read Excel files, provided they are from fairly recent versions of Excel.\n", "\n", "To read in this data set, we will use `pd.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": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
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/+
00.12880.13270.14820.16320.16660.22480.23890.2412
10.15540.14570.15030.16710.17530.18910.20350.1942
20.13060.14470.15770.17040.17050.17050.19430.2186
30.14130.12820.17110.1779NaN0.17350.20000.2104
40.15570.14870.13420.1483NaN0.21350.25600.2463
\n", "
" ], "text/plain": [ " wt wholemounts wt cross-sections anti-Dorsal dl1/+dl-venus/+ \\\n", "0 0.1288 0.1327 0.1482 \n", "1 0.1554 0.1457 0.1503 \n", "2 0.1306 0.1447 0.1577 \n", "3 0.1413 0.1282 0.1711 \n", "4 0.1557 0.1487 0.1342 \n", "\n", " anti-gfp dl1/+dl-venus/+ Venus (live) dl1/+dl-venus/+ \\\n", "0 0.1632 0.1666 \n", "1 0.1671 0.1753 \n", "2 0.1704 0.1705 \n", "3 0.1779 NaN \n", "4 0.1483 NaN \n", "\n", " anti-Dorsal dl1/+dl-GFP/+ anti-gfp dl1/+dl-GFP/+ \\\n", "0 0.2248 0.2389 \n", "1 0.1891 0.2035 \n", "2 0.1705 0.1943 \n", "3 0.1735 0.2000 \n", "4 0.2135 0.2560 \n", "\n", " GFP (live) dl1/+dl-GFP/+ \n", "0 0.2412 \n", "1 0.1942 \n", "2 0.2186 \n", "3 0.2104 \n", "4 0.2463 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_excel('../data/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 tuples to more easily delineate genotypes and methods." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
(WT, whole mount)(WT, cross-section)(dl1/+ ; dl-venus/+, anti-Dorsal)(dl1/+ ; dl-venus/+, anti-Venus)(dl1/+ ; dl-venus/+, Venus (live))(dl1/+ ; dl-gfp/+, anti-Dorsal)(dl1/+ ; dl-gfp/+, anti-GFP)(dl1/+ ; dl-gfp/+, GFP (live))
00.12880.13270.14820.16320.16660.22480.23890.2412
10.15540.14570.15030.16710.17530.18910.20350.1942
20.13060.14470.15770.17040.17050.17050.19430.2186
30.14130.12820.17110.1779NaN0.17350.20000.2104
40.15570.14870.13420.1483NaN0.21350.25600.2463
\n", "
" ], "text/plain": [ " (WT, whole mount) (WT, cross-section) (dl1/+ ; dl-venus/+, anti-Dorsal) \\\n", "0 0.1288 0.1327 0.1482 \n", "1 0.1554 0.1457 0.1503 \n", "2 0.1306 0.1447 0.1577 \n", "3 0.1413 0.1282 0.1711 \n", "4 0.1557 0.1487 0.1342 \n", "\n", " (dl1/+ ; dl-venus/+, anti-Venus) (dl1/+ ; dl-venus/+, Venus (live)) \\\n", "0 0.1632 0.1666 \n", "1 0.1671 0.1753 \n", "2 0.1704 0.1705 \n", "3 0.1779 NaN \n", "4 0.1483 NaN \n", "\n", " (dl1/+ ; dl-gfp/+, anti-Dorsal) (dl1/+ ; dl-gfp/+, anti-GFP) \\\n", "0 0.2248 0.2389 \n", "1 0.1891 0.2035 \n", "2 0.1705 0.1943 \n", "3 0.1735 0.2000 \n", "4 0.2135 0.2560 \n", "\n", " (dl1/+ ; dl-gfp/+, GFP (live)) \n", "0 0.2412 \n", "1 0.1942 \n", "2 0.2186 \n", "3 0.2104 \n", "4 0.2463 " ] }, "execution_count": 3, "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(columns=col_names)\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because we named them with tuples, we can reset the column index to be a multiindex using `pd.MultiIndex.from_tuples()`. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
genotypeWTdl1/+ ; dl-venus/+dl1/+ ; dl-gfp/+
methodwhole mountcross-sectionanti-Dorsalanti-VenusVenus (live)anti-Dorsalanti-GFPGFP (live)
00.12880.13270.14820.16320.16660.22480.23890.2412
10.15540.14570.15030.16710.17530.18910.20350.1942
20.13060.14470.15770.17040.17050.17050.19430.2186
30.14130.12820.17110.1779NaN0.17350.20000.2104
40.15570.14870.13420.1483NaN0.21350.25600.2463
\n", "
" ], "text/plain": [ "genotype WT dl1/+ ; dl-venus/+ \\\n", "method whole mount cross-section anti-Dorsal anti-Venus Venus (live) \n", "0 0.1288 0.1327 0.1482 0.1632 0.1666 \n", "1 0.1554 0.1457 0.1503 0.1671 0.1753 \n", "2 0.1306 0.1447 0.1577 0.1704 0.1705 \n", "3 0.1413 0.1282 0.1711 0.1779 NaN \n", "4 0.1557 0.1487 0.1342 0.1483 NaN \n", "\n", "genotype dl1/+ ; dl-gfp/+ \n", "method anti-Dorsal anti-GFP GFP (live) \n", "0 0.2248 0.2389 0.2412 \n", "1 0.1891 0.2035 0.1942 \n", "2 0.1705 0.1943 0.2186 \n", "3 0.1735 0.2000 0.2104 \n", "4 0.2135 0.2560 0.2463 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns = pd.MultiIndex.from_tuples(df.columns, names=('genotype', 'method'))\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is looking better; we have consistent naming of the genotypes and methods and they are organized as a multiindex." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Melting the data frame\n", "\n", "When we melt the data frame, the data within it, called **values**, become a single column. The column names, called **variables** also become new columns. So, to melt it, we need to specify what we want to call the values and what we want to call the variable. The `melt()` method does the rest!" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
genotypemethodgradient width
0WTwhole mount0.1288
1WTwhole mount0.1554
2WTwhole mount0.1306
3WTwhole mount0.1413
4WTwhole mount0.1557
\n", "
" ], "text/plain": [ " genotype method gradient width\n", "0 WT whole mount 0.1288\n", "1 WT whole mount 0.1554\n", "2 WT whole mount 0.1306\n", "3 WT whole mount 0.1413\n", "4 WT whole mount 0.1557" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.melt(df, value_name='gradient width')\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nice! We now have a tidy data frame. \n", "\n", "Note that `pd.melt()` has other options. For example, you can specify columns that do not comprise data, but should still be included in the melted data frame using the `id_vars` keyword argument. That does not apply to this data frame, but comes up often." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Deleting NaN's\n", "\n", "The only problem is that it has many NaNs because there were many of them in the data set due to the unequal column lengths in the original spreadsheet. We can see this by looking at the tail of the data frame." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
genotypemethodgradient width
1211dl1/+ ; dl-gfp/+GFP (live)NaN
1212dl1/+ ; dl-gfp/+GFP (live)NaN
1213dl1/+ ; dl-gfp/+GFP (live)NaN
1214dl1/+ ; dl-gfp/+GFP (live)NaN
1215dl1/+ ; dl-gfp/+GFP (live)NaN
\n", "
" ], "text/plain": [ " genotype method gradient width\n", "1211 dl1/+ ; dl-gfp/+ GFP (live) NaN\n", "1212 dl1/+ ; dl-gfp/+ GFP (live) NaN\n", "1213 dl1/+ ; dl-gfp/+ GFP (live) NaN\n", "1214 dl1/+ ; dl-gfp/+ GFP (live) NaN\n", "1215 dl1/+ ; dl-gfp/+ GFP (live) NaN" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now safely delete any row that has a NaN." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "df = df.dropna()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "...and we are good to do with a tidy DataFrame! " ] }, { "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. We will use Bokeh-catplot because HoloViews does not yet allow for nested categorical axes with a scatter plot." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "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 = {\"45ea4655-6190-4acb-bea5-c67ec2f9da68\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1011\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1015\",\"type\":\"Grid\"},{\"id\":\"1019\",\"type\":\"Grid\"}],\"frame_height\":350,\"frame_width\":450,\"left\":[{\"id\":\"1016\",\"type\":\"CategoricalAxis\"}],\"plot_height\":300,\"plot_width\":400,\"renderers\":[{\"id\":\"1039\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1041\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1026\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1004\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1007\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1002\",\"type\":\"FactorRange\"},\"y_scale\":{\"id\":\"1009\",\"type\":\"CategoricalScale\"}},\"id\":\"1003\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"axis_label\":\"gradient width\",\"formatter\":{\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1012\",\"type\":\"BasicTicker\"}},\"id\":\"1011\",\"type\":\"LinearAxis\"},{\"attributes\":{\"callback\":null,\"data\":{\"__label\":[\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"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/+\",\"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/+\"],\"cat\":[[\"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\"],[\"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)\"],[\"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)\"]],\"genotype\":[\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"WT\",\"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/+\",\"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/+\"],\"gradient width\":[0.1288,0.1554,0.1306,0.1413,0.1557,0.1689,0.1417,0.1315,0.1664,0.156,0.1479,0.1475,0.1347,0.1129,0.125,0.1648,0.1555,0.1403,0.1096,0.1779,0.1244,0.1708,0.1691,0.13,0.1327,0.1457,0.1447,0.1282,0.1487,0.1203,0.1315,0.1463,0.1458,0.1402,0.133,0.1375,0.1576,0.1498,0.1532,0.1352,0.1346,0.1364,0.143,0.144,0.1805,0.1688,0.1532,0.1681,0.1442,0.1362,0.1391,0.1606,0.1742,0.1335,0.1347,0.1404,0.1524,0.1469,0.1365,0.1433,0.1358,0.1643,0.1371,0.1141,0.1436,0.1223,0.1459,0.1368,0.1376,0.1601,0.1309,0.1305,0.1562,0.1577,0.154,0.1443,0.1364,0.1344,0.1315,0.1572,0.1441,0.1399,0.1497,0.1647,0.1629,0.1194,0.1296,0.1574,0.1365,0.1759,0.1522,0.1535,0.1398,0.1453,0.1569,0.1582,0.174,0.1781,0.1488,0.1663,0.1699,0.173,0.1655,0.1341,0.1014,0.162,0.1704,0.1499,0.1648,0.1397,0.1745,0.1684,0.1399,0.1512,0.1793,0.1581,0.1515,0.1465,0.162,0.1581,0.1559,0.147,0.1445,0.1673,0.1703,0.154,0.16,0.1147,0.1317,0.1685,0.1415,0.1575,0.1524,0.1374,0.1596,0.1159,0.1104,0.1368,0.1621,0.1117,0.1563,0.158,0.146,0.1174,0.155,0.1327,0.1443,0.1329,0.1567,0.1388,0.1449,0.1548,0.1727,0.142,0.1735,0.1641,0.1756,0.1691,0.1599,0.1271,0.1468,0.149,0.1706,0.1283,0.1325,0.1663,0.1325,0.1529,0.1682,0.1557,0.1577,0.1466,0.1671,0.1265,0.1448,0.174,0.1482,0.1503,0.1577,0.1711,0.1342,0.1773,0.1705,0.1596,0.1601,0.1553,0.1675,0.1692,0.1584,0.1546,0.1605,0.1754,0.161,0.1491,0.1442,0.1728,0.1534,0.1576,0.1701,0.1436,0.1746,0.1698,0.171,0.1555,0.1616,0.1632,0.1671,0.1704,0.1779,0.1483,0.1831,0.1783,0.1667,0.178,0.1653,0.1708,0.178,0.174,0.1739,0.1812,0.1902,0.178,0.1624,0.1553,0.1768,0.1701,0.1724,0.1738,0.1703,0.1842,0.172,0.1807,0.1796,0.1759,0.1666,0.1753,0.1705,0.2248,0.1891,0.1705,0.1735,0.2135,0.2129,0.1782,0.2011,0.1931,0.2146,0.2398,0.2193,0.2112,0.2516,0.1759,0.1787,0.164,0.1756,0.1977,0.1809,0.2389,0.2035,0.1943,0.2,0.256,0.2309,0.1949,0.2216,0.23,0.2682,0.2633,0.2495,0.2353,0.2642,0.2238,0.2115,0.1934,0.2041,0.2286,0.2104,0.2412,0.1942,0.2186,0.2104,0.2463,0.202],\"method\":[\"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\",\"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)\",\"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)\"]},\"selected\":{\"id\":\"1048\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1047\",\"type\":\"UnionRenderers\"}},\"id\":\"1034\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"factors\":[\"WT\",\"dl1/+ ; dl-gfp/+\",\"dl1/+ ; dl-venus/+\"],\"palette\":[\"#1f77b3\",\"#ff7e0e\",\"#2ba02b\",\"#d62628\",\"#9367bc\",\"#8c564b\",\"#e277c1\",\"#7e7e7e\",\"#bcbc21\",\"#16bdcf\",\"#3a0182\",\"#004201\",\"#0fffa8\",\"#5d003f\",\"#bcbcff\",\"#d8afa1\",\"#b80080\",\"#004d52\",\"#6b6400\",\"#7c0100\",\"#6026ff\",\"#ffff9a\",\"#564964\",\"#8cb893\",\"#93fbff\",\"#018267\",\"#90ff00\",\"#8200a0\",\"#ac8944\",\"#5b3400\",\"#ffbff2\",\"#ff6e75\",\"#798cff\",\"#dd00ff\",\"#505646\",\"#004489\",\"#ffbf60\",\"#ff018c\",\"#bdc8cf\",\"#af97b5\",\"#b65600\",\"#017000\",\"#cd87ff\",\"#1cd646\",\"#bfebc3\",\"#7997b5\",\"#a56089\",\"#6e8956\",\"#bc7c75\",\"#8a2844\",\"#00acff\",\"#8ed4ff\",\"#4b6d77\",\"#00d4b1\",\"#9300f2\",\"#8a9500\",\"#5d5b9e\",\"#fddfba\",\"#00939e\",\"#ffdb00\",\"#00aa79\",\"#520067\",\"#000091\",\"#0a5d3d\",\"#a5e275\",\"#623b41\",\"#c6c689\",\"#ff9eb5\",\"#cd4f6b\",\"#ff07d6\",\"#8a3a05\",\"#7e3d70\",\"#ff4901\",\"#602ba5\",\"#1c00ff\",\"#e6dfff\",\"#aa3baf\",\"#d89c00\",\"#a3a39e\",\"#3f69ff\",\"#46490c\",\"#7b6985\",\"#6b978c\",\"#ff9a75\",\"#835bff\",\"#7c6b46\",\"#80b654\",\"#bc0049\",\"#fd93ff\",\"#5d0018\",\"#89d1d1\",\"#9c8cd3\",\"#da6d42\",\"#8a5700\",\"#3b5069\",\"#4b6b3b\",\"#edcfd8\",\"#cfedff\",\"#aa1500\",\"#dfff4f\",\"#ff2a56\",\"#d1499e\",\"#707cb8\",\"#598000\",\"#00e4fd\",\"#774b95\",\"#67d48c\",\"#3d3a72\",\"#ac413f\",\"#d6a166\",\"#c169cd\",\"#69595d\",\"#87aced\",\"#a0a569\",\"#d1aae6\",\"#870062\",\"#00fddb\",\"#672818\",\"#b342ff\",\"#0e59c4\",\"#168742\",\"#90d300\",\"#cd7900\",\"#f959ff\",\"#5b7466\",\"#8eaeb3\",\"#9c7c8c\",\"#4600c6\",\"#6b4d2d\",\"#a56d46\",\"#9e8972\",\"#a8afca\",\"#cd8ca7\",\"#00fd64\",\"#917900\",\"#ff62a1\",\"#f4ffd8\",\"#018cf0\",\"#13aca0\",\"#5b2d59\",\"#89859e\",\"#cfccba\",\"#d4afc4\",\"#dbdd6d\",\"#cffff4\",\"#006485\",\"#006962\",\"#a84167\",\"#2d97c4\",\"#a874ff\",\"#26ba5d\",\"#57b600\",\"#caffa7\",\"#a379aa\",\"#ffbc93\",\"#89e2c1\",\"#0fc8ff\",\"#d400c4\",\"#626d89\",\"#69858e\",\"#4b4d52\",\"#aa6067\",\"#79b5d4\",\"#2b5916\",\"#9a0024\",\"#bdd1f2\",\"#896e67\",\"#69a56b\",\"#855467\",\"#aecdba\",\"#87997e\",\"#cadb00\",\"#9a0390\",\"#ebbc1a\",\"#eb9cd1\",\"#70006e\",\"#b1a131\",\"#ca6b93\",\"#4146a3\",\"#e48c89\",\"#d44400\",\"#c68aca\",\"#b69597\",\"#d41f75\",\"#724bcc\",\"#674d00\",\"#672138\",\"#38564f\",\"#6ebaaa\",\"#853a31\",\"#a5d397\",\"#b8af8e\",\"#d8e4df\",\"#aa00df\",\"#cac1db\",\"#ffdf8c\",\"#e2524d\",\"#66696e\",\"#ff001c\",\"#522d72\",\"#4d906b\",\"#a86d11\",\"#ff9e26\",\"#5ea3af\",\"#c88556\",\"#915997\",\"#a3a1ff\",\"#fdbaba\",\"#242a87\",\"#dbe6a8\",\"#97f2a7\",\"#6793d6\",\"#ba5b3f\",\"#3a5d91\",\"#364f2f\",\"#267c95\",\"#89959a\",\"#cfb356\",\"#004664\",\"#5e5d2f\",\"#8e8e41\",\"#ac3f13\",\"#69953b\",\"#a13d85\",\"#bfb6ba\",\"#acc667\",\"#6469cf\",\"#91af00\",\"#2be2da\",\"#016e36\",\"#ff7952\",\"#42807e\",\"#4fe800\",\"#995428\",\"#5d0a00\",\"#a30057\",\"#0c8700\",\"#5982a7\",\"#ffebfb\",\"#4b6901\",\"#8775d4\",\"#e6c6ff\",\"#a5ffda\",\"#d86e77\",\"#df014b\",\"#69675b\",\"#776ba1\",\"#7e8067\",\"#594685\",\"#0000ca\",\"#7c002a\",\"#97ff72\",\"#b5e2e1\",\"#db52c8\",\"#777734\",\"#57bd8e\"]},\"id\":\"1033\",\"type\":\"CategoricalColorMapper\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"gradient width\"},\"y\":{\"field\":\"cat\",\"transform\":{\"id\":\"1035\",\"type\":\"Jitter\"}}},\"id\":\"1038\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"CategoricalTicker\"},{\"attributes\":{\"dimension\":1,\"grid_line_color\":null,\"ticker\":{\"id\":\"1017\",\"type\":\"CategoricalTicker\"}},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1020\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1007\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_color\":{\"field\":\"genotype\",\"transform\":{\"id\":\"1033\",\"type\":\"CategoricalColorMapper\"}},\"line_color\":{\"field\":\"genotype\",\"transform\":{\"id\":\"1033\",\"type\":\"CategoricalColorMapper\"}},\"x\":{\"field\":\"gradient width\"},\"y\":{\"field\":\"cat\",\"transform\":{\"id\":\"1035\",\"type\":\"Jitter\"}}},\"id\":\"1037\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1020\",\"type\":\"PanTool\"},{\"id\":\"1021\",\"type\":\"WheelZoomTool\"},{\"id\":\"1022\",\"type\":\"BoxZoomTool\"},{\"id\":\"1023\",\"type\":\"SaveTool\"},{\"id\":\"1024\",\"type\":\"ResetTool\"},{\"id\":\"1025\",\"type\":\"HelpTool\"}]},\"id\":\"1026\",\"type\":\"Toolbar\"},{\"attributes\":{\"callback\":null},\"id\":\"1004\",\"type\":\"DataRange1d\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1049\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"overlay\":{\"id\":\"1049\",\"type\":\"BoxAnnotation\"}},\"id\":\"1022\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"ticker\":{\"id\":\"1012\",\"type\":\"BasicTicker\"}},\"id\":\"1015\",\"type\":\"Grid\"},{\"attributes\":{\"callback\":null,\"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\"]]},\"id\":\"1002\",\"type\":\"FactorRange\"},{\"attributes\":{\"data_source\":{\"id\":\"1034\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1037\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1038\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1040\",\"type\":\"CDSView\"}},\"id\":\"1039\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"formatter\":{\"id\":\"1043\",\"type\":\"CategoricalTickFormatter\"},\"ticker\":{\"id\":\"1017\",\"type\":\"CategoricalTicker\"}},\"id\":\"1016\",\"type\":\"CategoricalAxis\"},{\"attributes\":{\"distribution\":\"normal\",\"range\":{\"id\":\"1002\",\"type\":\"FactorRange\"},\"width\":0.1},\"id\":\"1035\",\"type\":\"Jitter\"},{\"attributes\":{},\"id\":\"1047\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"text\":\"\"},\"id\":\"1041\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"SaveTool\"},{\"attributes\":{\"source\":{\"id\":\"1034\",\"type\":\"ColumnDataSource\"}},\"id\":\"1040\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1009\",\"type\":\"CategoricalScale\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"CategoricalTickFormatter\"}],\"root_ids\":[\"1003\"]},\"title\":\"Bokeh Application\",\"version\":\"1.3.4\"}};\n", " var render_items = [{\"docid\":\"45ea4655-6190-4acb-bea5-c67ec2f9da68\",\"roots\":{\"1003\":\"79884a50-9e97-48dc-b05f-6b9d6e94126a\"}}];\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", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1003" } }, "output_type": "display_data" } ], "source": [ "p = bokeh_catplot.strip(\n", " data=df,\n", " cats=['genotype', 'method'],\n", " val='gradient width',\n", " color_column='genotype',\n", " horizontal=True,\n", " jitter=True,\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": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPython 3.7.4\n", "IPython 7.8.0\n", "\n", "pandas 0.24.2\n", "bokeh 1.3.4\n", "bokeh_catplot 0.1.6\n", "jupyterlab 1.1.4\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p pandas,bokeh,bokeh_catplot,jupyterlab" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }