Skip to content

Instantly share code, notes, and snippets.

@ivanov
Last active December 15, 2015 07:29
Show Gist options
  • Save ivanov/5223401 to your computer and use it in GitHub Desktop.
Save ivanov/5223401 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"gist_id": "5223401",
"name": "visualization"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"#this is just for -pi %load_ext gist"
],
"language": "python",
"metadata": {},
"outputs": [
{
"javascript": [
"\n",
"\n",
"/*\n",
"Add the contents of this file to your custom.js\n",
"for it to always be on.\n",
"*/\n",
"\n",
"\n",
"IPython.ext_update_gist_link = function(gist_id) {\n",
" \n",
" IPython.notebook.metadata.gist_id = gist_id;\n",
" var toolbar = IPython.toolbar.element;\n",
" var link = toolbar.find(\"a#nbviewer\");\n",
" if ( ! link.length ) {\n",
" link = $('<a id=\"nbviewer\" target=\"_blank\"/>');\n",
" toolbar.append(\n",
" $('<span id=\"nbviewer_span\"/>').append(link)\n",
" );\n",
" }\n",
" \n",
" link.attr(\"href\", \"http://nbviewer.ipython.org/\" + gist_id);\n",
" link.text(\"http://nbviewer.ipython.org/\" + gist_id);\n",
"};\n",
"\n",
"IPython.ext_handle_gist_output = function(output_type, content) {\n",
" if (output_type != 'stream' || content['name'] != 'stdout') {\n",
" return;\n",
" }\n",
" var gist_id = jQuery.trim(content['data']);\n",
" if (! gist_id.match(/[A-Za-z0-9]+/g)) {\n",
" alert(\"Gist seems to have failed: \" + gist_id);\n",
" return;\n",
" }\n",
" IPython.ext_update_gist_link(gist_id);\n",
"};\n",
"\n",
"IPython.ext_gist_notebook = function () {\n",
" var gist_id = IPython.notebook.metadata.gist_id || null;\n",
" var cmd = '_nbname = \"' + IPython.notebook.notebook_name + '.ipynb\"';\n",
" cmd = cmd + '\\nlines = !jist -p'\n",
" if (gist_id) {\n",
" cmd = cmd + ' -u ' + gist_id;\n",
" }\n",
" cmd = cmd + ' \"$_nbname\"';\n",
" cmd = cmd + '\\nprint lines[0].replace(\"https://gist.github.com\", \"\").replace(\"/\",\"\")';\n",
" IPython.notebook.kernel.execute(cmd, {'output' : IPython.ext_handle_gist_output});\n",
"};\n",
"\n",
"setTimeout(function() {\n",
" if ($(\"#gist_notebook\").length == 0) {\n",
" IPython.toolbar.add_buttons_group([\n",
" {\n",
" 'label' : 'Share Notebook as gist',\n",
" 'icon' : 'ui-icon-share',\n",
" 'callback': IPython.ext_gist_notebook,\n",
" 'id' : 'gist_notebook'\n",
" },\n",
" ])\n",
" }\n",
"\n",
" if (IPython.notebook.metadata.gist_id) {\n",
" IPython.ext_update_gist_link(IPython.notebook.metadata.gist_id);\n",
" }\n",
"}, 1000);\n",
"\n"
],
"output_type": "display_data",
"text": [
"<IPython.core.display.Javascript at 0x1ee6490>"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Visualization\n",
"==============\n",
"\n",
"I (Paul Ivanov) polled the class, and it seemed like people were unfamiliar with just basic plotting, so we started off with that."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Basic Plotting\n",
"--------------\n",
"\n",
"I started off by explaining that, by default, matplotlib's pyplot interface is imported when we enable IPython's %pylab mode."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\n",
"For more information, type 'help(pylab)'.\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import matplotlib"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's how you can do that in your python scripts (without IPython's pylab mode)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import matplotlib.pyplot as plt"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I opened up the Matplotlib website, and in particular, the Matplotlib Gallery...\n",
"\n",
"http://matplotlib.org/gallery.html"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 6,
"text": [
"<module 'matplotlib.pyplot' from '/home/pi/.local/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/pyplot.pyc'>"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We grabbed a link of some example code we found in the gallery, just to play with it interactively\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load http://matplotlib.org/mpl_examples/api/histogram_demo.py"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x, y = np.arange(10), np.sin(np.arange(10))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.plot(x, y, 'ro')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 20,
"text": [
"[<matplotlib.lines.Line2D at 0x5971c90>]"
]
},
{
"output_type": "display_data",
"png": "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\ngg==\n",
"text": [
"<matplotlib.figure.Figure at 0x4cd1c90>"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.scatter(x, y, s=np.cos(x)*100, c=)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 27,
"text": [
"<matplotlib.collections.PathCollection at 0x6223490>"
]
},
{
"output_type": "display_data",
"png": "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\n2UpNTW3z5/XXX28d8+ijj6pnz566/fbbQxnNNuF6iak933zzjW655RYtWbJEF154od1xQuqNN97Q\n4MGDlZGREZZnaZJ0/PhxVVZW6u6771ZlZaV69+59TpecTPKPf/xDTz/9tGpqalRfX69vvvlGL774\not2xbOdwOM7p92XAt8kKxNk+9/anP/1JpaWleuutt0KUyH4ul0s+n6/1sc/nk9vttjGRfZqbm3Xz\nzTfrzjvv1OTJk+2OE3IbN25USUmJSktLdezYMX311VeaPn26Vq5caXe0kHG73XK73bryyislSbfc\nckvYldpHH32ka665RgMHDpQk3XTTTdq4caPuuOMOm5OFntPpVENDg4YMGaJ9+/Zp8ODBZ92ny1zj\nKCsr0+LFi1VcXKxevXrZHSdkRowYoerqatXU1KipqUlr1qxRTk6O3bFCzrIszZw5UykpKbr33nvt\njmOLwsJC+Xw+7dmzR6tXr9b1118fVoUmfffealxcnKqqqiRJGzZs0LBhw2xOFVpJSUkqLy/Xt99+\nK8uytGHDBqWkpNgdyxY5OTlasWKFJGnFihXn9o/dzlqe2VEJCQnWxRdfbKWnp1vp6enW7Nmz7Y4U\nMqWlpdZll11m/fCHP7QKCwvtjmOL999/33I4HFZaWlrr34G1a9faHcs2Xq/XmjRpkt0xbLFlyxZr\nxIgRYfnxnu8tWrSodUn/9OnTraamJrsjdbqpU6dasbGxVlRUlOV2u60XXnjBOnDggDVmzJgOLekP\n+obGAAB0FV3m8iMAAMGi1AAAxqDUAADGoNQAAMag1AAAxvh/DuUaZY31I24AAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x5ac8c10>"
]
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p = patches[0]\n",
"p.get_facecolor()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 38,
"text": [
"(0.0, 0.0, 1.0, 1.0)"
]
}
],
"prompt_number": 38
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"R, G, B, A"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p.set_facecolor('g')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 39
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"counts, locs, patches = plt.hist(np.random.randn(5000), bins=100)\n",
"\n",
"for x in range(25, 75):\n",
" p = patches[x]\n",
" p.set_facecolor('g')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "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\n+tKXvhSTWlwulxwOx5TODTXRkH2xAERLOL+XTBb10GptbdXWrVs1Ojqqu+++W1VVVVG575497+rY\nsf+VJF1xxX5t2vRPZWRkTHpdtFozgff5+OP39NZbjrDvMRkmAgOQvvh7K7ArcaLfYYRWBEZHR/XD\nH/5QbW1tSk9P17Jly1RSUqKcnJxp3/uyy+ZKulKSZLFcPuXrQrVmwgm0wPvMm/d/Ilo8c7JFN5kI\nDCSu4D9aBwef9r83tiuxZsx1n/0e6+3tVWPj98Y8J5tK2I0n1gsmhBLV0Oro6NCiRYuUmZkpSfre\n976npqamqITW6OgxpafvliT5fB1KTr512veMtHvu/PmvRTQcPZxFNwEklkj/aA3etijwOVmosJvq\nPePtsYXF5/P5onWz3/3ud/rDH/6gp556SpK0f/9+HT16VE888cTn39Biida3AwDMIlOJo6i2tKYS\nSFHMSABAgkmK5s3S09PV19fnf93X1yebzRbNbwEASGBRDa0bbrhBPT096u3t1cjIiA4cOKCSkpJo\nfgsAQAKLavdgcnKynnzySa1Zs0ajo6PatGlTVAZhAAAgRbmlJUm33HKLuru79fe//13bt28Pee7u\n3buVlJSk4eHhaJcx4376058qLy9P+fn5KioqGtMtaor7779fOTk5ysvL09q1a3Xq1KlYlxS23/72\nt1qyZIkuu+wydXZ2xrqcKWttbVV2drYWL16shx9+ONblRKSyslJWq1W5ubmxLiUifX19uummm7Rk\nyRItXbpUjz/+eKxLCtu5c+dUWFio/Px82e32SX/nxrPR0VEVFBSouLg49Im+GPnwww99a9as8WVm\nZvo++uijWJURsdOnT/u/fvzxx32bNm2KYTWROXTokG90dNTn8/l8VVVVvqqqqhhXFL5jx475uru7\nfQ6Hw/fWW2/Fupwp+fTTT33XXnutz+Px+EZGRnx5eXm+rq6uWJcVtldffdXX2dnpW7p0aaxLicjg\n4KDv7bff9vl8Pt/HH3/sy8rKMvLn8J///Mfn8/l858+f9xUWFvpee+21GFcUmd27d/vWr1/vKy4u\nDnle1FtaU3XffffpkUceidW3n7bLL/98gvOZM2d05ZVXxrCayDidTiUlXfxPoLCwUP39/TGuKHzZ\n2dnKysqKdRlhCZzPmJKS4p/PaJqVK1dqwYIFsS4jYmlpacrPz5ckzZs3Tzk5OTp+/HiMqwrfV77y\nFUnSyMiIRkdHtXDhwhhXFL7+/n61tLTo7rvvnnSEeUxCq6mpSTabTdddd10svn3UPPjgg7r66qvV\n0NCgbdviZ8Z4JJ5++mndeuv0J2xjcgMDA2OWILPZbBoYGIhhRejt7dXbb7+twsLCWJcStgsXLig/\nP19Wq1U33XST7HZ7rEsK27333qtdu3b5/4gOZcYWzHU6nRoaGvrC8R07dqiurk6HDh3yH5ssWWNl\nos+wc+dOFRcXa8eOHdqxY4fq6+t177336plnnolBlaFN9hmkiz+TOXPmaP369Ze6vCmZymcwCRPs\n48uZM2e0bt06PfbYY5o3b16sywlbUlKS/vznP+vUqVNas2aNcWsQvvjii0pNTVVBQYFcLtek589Y\naB0+fHjc43/961/l8XiUl5cn6WKz8Prrr1dHR4dSU1NnqpyITPQZgq1fvz5uWymTfYZnn31WLS0t\neumlly5RReGb6s/BFMxnjB/nz5/X7bffrh/84AcqLS2NdTnTMn/+fN1222168803jQqtN954Q83N\nzWppadG5c+d0+vRpbdiwQc8999y451/y7sGlS5fK6/XK4/HI4/HIZrOps7Mz7gJrMj09Pf6vm5qa\nVFBQEMNqItPa2qpdu3apqalJc+fOjXU50xavLfZgzGeMDz6fT5s2bZLdbtfWrVtjXU5ETpw4oZMn\nT0qSzp49q8OHDxv3u2jnzp3q6+uTx+NRY2Ojbr755gkDS4rRM61ApnaVbN++Xbm5ucrPz5fL5dLu\n3btjXVLY7rnnHp05c0ZOp1MFBQXasmVLrEsK2+9//3tlZGToyJEjuu2223TLLbfEuqRJBc5ntNvt\nuuOOO4ycz1heXq4bb7xRbrdbGRkZcdk9Hsrrr7+u/fv365VXXlFBQYEKCgrU2toa67LCMjg4qJtv\nvln5+fkqLCxUcXGxioqKYl3WtEyWCVFdMBcAgJkU85YWAABTRWgBAIxBaAEAjEFoAQCMQWgBAIzx\n/wB/SnVzKrlHhQAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x72da8d0>"
]
}
],
"prompt_number": 40
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 42,
"text": [
"<matplotlib.patches.Rectangle at 0x7abcd90>"
]
}
],
"prompt_number": 42
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Paging through data\n",
"--------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This example shows us how to make changes to a plot based on keyboard input. This does not work if our matplotlib backend is set to inline, since that just generates static images. Set the backend to an interactive one (qt, tk, wx, or macosx)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab qt"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Welcome to pylab, a matplotlib-based Python environment [backend: Qt4Agg].\n",
"For more information, type 'help(pylab)'.\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load http://matplotlib.sourceforge.net/examples/event_handling/keypress_demo.py"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#!/usr/bin/env python\n",
"\n",
"\"\"\"\n",
"Show how to connect to keypress events\n",
"\"\"\"\n",
"from __future__ import print_function\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import sys\n",
"\n",
"\n",
"def press(event):\n",
" print('press', event.key)\n",
" sys.stdout.flush()\n",
" if event.key=='x':\n",
" visible = xl.get_visible()\n",
" xl.set_visible(not visible)\n",
" fig.canvas.draw()\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(111)\n",
"\n",
"fig.canvas.mpl_connect('key_press_event', press)\n",
"\n",
"ax.plot(np.random.rand(12), np.random.rand(12), 'go')\n",
"xl = ax.set_xlabel('easy come, easy go')\n",
"\n",
"plt.show()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
" x\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press alt\n",
"press"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" alt\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press a\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press a\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press a\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press a\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press a\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press b\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press b\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press p\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press p\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press x\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press x\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press x\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press x\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"press alt\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now modify the example above to pan left and right the width of the current view using `,` and `.` keys"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.plot(np.sin(np.arange(100)))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 5,
"text": [
"[<matplotlib.lines.Line2D at 0x3dc0d10>]"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load http://matplotlib.sourceforge.net/examples/event_handling/keypress_demo.py"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ax = plt.gca()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ax.get_xlim()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 8,
"text": [
"(7.5219586089047414, 12.161979327136788)"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ax.set_xlim(7, 20)\n",
"plt.draw()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#!/usr/bin/env python\n",
"\n",
"\"\"\"\n",
"Show how to connect to keypress events\n",
"\"\"\"\n",
"from __future__ import print_function\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"def press(event):\n",
" x0, x1 = ax.get_xlim()\n",
" dx = x1 - x0\n",
" if event.key==',':\n",
" ax.set_xlim(x0-dx, x1-dx)\n",
" plt.draw()\n",
" if event.key=='.':\n",
" ax.set_xlim(x0+dx, x1+dx)\n",
" plt.draw()\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(111)\n",
"\n",
"fig.canvas.mpl_connect('key_press_event', press)\n",
"\n",
"ax.plot(np.sin(np.arange(100)), 'go--')\n",
"\n",
"\n",
"plt.show()\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"3D Slicer\n",
"---------\n",
"\n",
"Here's some code I (pi) wrote to do basic, interactive orthogonal slicer.\n",
"\n",
"We will go through the code to understand the individual parts, running the next cell will create a file called `orthoslicer.py` on your machine. If you get an error, you are using at older version of IPython where the `%%file` magic was not available"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file orthoslicer.py\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.image import AxesImage\n",
"\n",
"import numpy as np\n",
"\n",
"# assuming the following layout\n",
"# <-- y --> <-- z -->\n",
"# ^ +---------+ ^ +---------+\n",
"# | | | | | |\n",
"# | | | |\n",
"# x | | x | |\n",
"# | | | |\n",
"# | | | | | |\n",
"# v +---------+ v +---------+\n",
"#\n",
"# <-- z -->\n",
"# ^ +---------+\n",
"# | | |\n",
"# | |\n",
"# y | |\n",
"# | |\n",
"# | | |\n",
"# v +---------+\n",
"#\n",
"\n",
"class OrthoSlicer3D(object):\n",
" \"\"\"Orthogonal-plane slicer.\n",
"\n",
" OrthoSlicer3d expects 3-dimensional data, and creates a figure with 3\n",
" axes for each slice orientation. Moving the mouse in any one axes will\n",
" select out the corresponding slices in the other two. Clicking the right\n",
" mouse button toggles mouse following and triggers a full redraw (to update\n",
" the ticks, for example). Scrolling up and down moves that slice up and\n",
" down. \n",
"\n",
" Example\n",
" -------\n",
" import numpy as np\n",
" a = np.sin(np.linspace(0,np.pi,20))\n",
" b = np.sin(np.linspace(0,np.pi*5,20))\n",
" data = np.outer(a,b)[..., np.newaxis]*a\n",
"\n",
" OrthoSlicer3D(data)\n",
"\n",
" \"\"\"\n",
" def __init__(self, data, axes=None, aspect_ratio=np.array((1,1,1))):\n",
" \"\"\"\n",
" Parameters\n",
" ----------\n",
" data : ndarray (3d)\n",
" The data that will be displaced by the slicer\n",
" axes : mpl.Axes (3)\n",
" 3 axes instances for the Z, Y, and X slices, or None (default)\n",
" aspect_ratio : ndarray (length 3)\n",
" stretch factors for X,Y,Z directions (default: 1,1,1)\n",
" \"\"\"\n",
" if axes is None:\n",
" fig = plt.figure()\n",
" x,y,z = data.shape * aspect_ratio\n",
"\n",
" maxw = float(z+y)\n",
" maxh = float(y+x)\n",
" zw = y / maxw\n",
" zh = x / maxh\n",
" yw = z / maxw\n",
"\n",
" ax1 = fig.add_axes((0, 1.0-zh, zw, zh))\n",
" ax2 = fig.add_axes((zw, 1.0-zh, yw, zh))\n",
" ax3 = fig.add_axes((zw, 0.0 , yw, 1.0-zh))\n",
" axes = (ax1, ax2, ax3)\n",
" else:\n",
" ax1, ax2, ax3 = axes\n",
"\n",
" self.data = data\n",
"\n",
" kw = dict(vmin=data.min(), vmax=data.max(), picker=True,\n",
" aspect='auto')\n",
" im1 = ax1.imshow(data[...,0], **kw)\n",
" im2 = ax2.imshow(data[:,0,:], **kw)\n",
" im3 = ax3.imshow(data[0,...], **kw)\n",
"\n",
" # idx will be used to slice in to the data with the appropriate\n",
" # slicing scheme\n",
" im1.idx = im2.idx = im3.idx = 0\n",
"\n",
" # set the maximum dimensions for i%dim indexing\n",
" im1.size = data.shape[-1]\n",
" im2.size = data.shape[-2]\n",
" im3.size = data.shape[-3]\n",
"\n",
" im1.get_slice = lambda i: (slice(None), slice(None), i)\n",
" im2.get_slice = lambda i: (slice(None), i, slice(None))\n",
" im3.get_slice = lambda i: (i, slice(None), slice(None))\n",
"\n",
" # setup pairwise connections between the slice dimensions\n",
" im1.imx = im2\n",
" im1.imy = im3\n",
" im2.imx = im1\n",
" im2.imy = im3\n",
" im3.imx = im1\n",
" im3.imy = im2\n",
"\n",
" self.toggle_update = True\n",
" self.figs = set([ax.figure for ax in axes])\n",
" for fig in self.figs:\n",
" #fig.canvas.mpl_connect('pick_event', self.on_pick)\n",
" fig.canvas.mpl_connect('motion_notify_event', self.on_pick)\n",
" plt.show()\n",
"\n",
"\n",
" def on_pick(self, event):\n",
" # Here we do a bit of a hack to make mousemovement events fit the mold\n",
" # of a pick event\n",
" if hasattr(event,'inaxes') and event.inaxes:\n",
" artist = event.inaxes.images[0]\n",
" me = event\n",
" me.button = 1 if self.toggle_update else 0\n",
" elif hasattr(event, 'artist'):\n",
" artist = event.artist\n",
" me = event.mouseevent\n",
" else:\n",
" return\n",
" if isinstance(artist, AxesImage):\n",
" im = artist\n",
" ax = artist.axes\n",
" imx,imy = im.imx, im.imy\n",
" if me.button == 1: # or self.toggle_update:\n",
" #if me.button == 1:\n",
" # self.toggle_update = not self.toggle_update\n",
" x,y = np.round((me.xdata, me.ydata)).astype(int)\n",
" imx.set_data(self.data[imx.get_slice(x)])\n",
" imy.set_data(self.data[imy.get_slice(y)])\n",
" imx.idx = x\n",
" imy.idx = y\n",
" for i in imx, imy:\n",
" ax = i.axes\n",
" ax.draw_artist(i)\n",
" ax.figure.canvas.blit(ax.bbox)\n",
" return\n",
" if me.button == 3:\n",
" self.toggle_update = not self.toggle_update\n",
" # the axes might be in different figures, redraw all of them\n",
" #for fig in self.figs:\n",
" # fig.canvas.draw() # redraw the ticks which don't get blitted\n",
" plt.draw()\n",
" return\n",
" if me.button not in ('up', 'down'):\n",
" return\n",
" if me.button == 'up':\n",
" im.idx += 1\n",
" elif me.button == 'down':\n",
" im.idx -= 1\n",
" im.idx %= im.size\n",
" im.set_data(self.data[im.get_slice(im.idx)])\n",
" ax.draw_artist(im)\n",
" ax.figure.canvas.blit(ax.bbox)\n",
"\n",
"if __name__ == '__main__':\n",
" import numpy as np\n",
" a = np.sin(np.linspace(0,np.pi,20))\n",
" b = np.sin(np.linspace(0,np.pi*5,20))\n",
" data = np.outer(a,b)[..., np.newaxis]*a\n",
" # all slices\n",
" OrthoSlicer3D(data)\n",
"\n",
" # broken out into three separate figures\n",
" f, ax1 = plt.subplots()\n",
" f, ax2 = plt.subplots()\n",
" f, ax3 = plt.subplots()\n",
" OrthoSlicer3D(data, axes=(ax1, ax2, ax3))\n",
"\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Overwriting orthoslicer.py\n"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"run orthoslicer.py"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment