Last active
March 23, 2016 06:56
-
-
Save smutch/e1d32127774b01e61f6e to your computer and use it in GitHub Desktop.
ipynb: Turnover plots for hank
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib nbagg\n", | |
"\n", | |
"import matplotlib.pyplot as plt\n", | |
"import numpy as np\n", | |
"from dragons import meraxes, plotutils, nbody, munge\n", | |
"import pandas as pd\n", | |
"from collections import OrderedDict\n", | |
"from tqdm import tqdm_gui as tqdm\n", | |
"import seaborn as sns\n", | |
"\n", | |
"sns.set(font_scale=1.3, rc={'lines.linewidth':3})\n", | |
"pd.set_option('mode.use_inf_as_null', True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 64, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"INFO:astropy:Reading input params...\n", | |
"INFO:astropy:Reading units...\n", | |
"INFO:astropy:Reading snapshot 78\n" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"INFO: Reading input params... [dragons.meraxes.io]\n", | |
"INFO: Reading units... [dragons.meraxes.io]\n", | |
"INFO: Reading snapshot 78 [dragons.meraxes.io]\n", | |
"INFO" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"INFO:astropy:Allocated 111.3 MB\n" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
": Allocated 111.3 MB [dragons.meraxes.io]\n", | |
"INFO" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"INFO:astropy:Read in 5837926 galaxies.\n", | |
"INFO:astropy:Converting to pandas DataFrame...\n" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
": Read in 5837926 galaxies. [dragons.meraxes.io]\n", | |
"INFO: Converting to pandas DataFrame... [dragons.meraxes.io]\n" | |
] | |
} | |
], | |
"source": [ | |
"FNAME = \"/home/smutch/data_agama/meraxes/paper_runs/512/fiducial/output/meraxes.hdf5\"\n", | |
"# N.B. leaving h=1\n", | |
"snapshot, redshift = meraxes.check_for_redshift(FNAME, 6)\n", | |
"simprops = meraxes.read_input_params(FNAME)\n", | |
"gals = meraxes.read_gals(FNAME, snapshot, props=[\"Type\", \"StellarMass\", \"Mvir\", \"GhostFlag\", \"Sfr\"], pandas=True)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# SMF" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 65, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"g = gals[gals.StellarMass > 1e-7]\n", | |
"mf = munge.mass_function(np.log10(g.StellarMass * 1e10).dropna(), simprops['Volume'], 50)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"/* Put everything inside the global mpl namespace */\n", | |
"window.mpl = {};\n", | |
"\n", | |
"mpl.get_websocket_type = function() {\n", | |
" if (typeof(WebSocket) !== 'undefined') {\n", | |
" return WebSocket;\n", | |
" } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
" return MozWebSocket;\n", | |
" } else {\n", | |
" alert('Your browser does not have WebSocket support.' +\n", | |
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
" 'Firefox 4 and 5 are also supported but you ' +\n", | |
" 'have to enable WebSockets in about:config.');\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
" this.id = figure_id;\n", | |
"\n", | |
" this.ws = websocket;\n", | |
"\n", | |
" this.supports_binary = (this.ws.binaryType != undefined);\n", | |
"\n", | |
" if (!this.supports_binary) {\n", | |
" var warnings = document.getElementById(\"mpl-warnings\");\n", | |
" if (warnings) {\n", | |
" warnings.style.display = 'block';\n", | |
" warnings.textContent = (\n", | |
" \"This browser does not support binary websocket messages. \" +\n", | |
" \"Performance may be slow.\");\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.imageObj = new Image();\n", | |
"\n", | |
" this.context = undefined;\n", | |
" this.message = undefined;\n", | |
" this.canvas = undefined;\n", | |
" this.rubberband_canvas = undefined;\n", | |
" this.rubberband_context = undefined;\n", | |
" this.format_dropdown = undefined;\n", | |
"\n", | |
" this.image_mode = 'full';\n", | |
"\n", | |
" this.root = $('<div/>');\n", | |
" this._root_extra_style(this.root)\n", | |
" this.root.attr('style', 'display: inline-block');\n", | |
"\n", | |
" $(parent_element).append(this.root);\n", | |
"\n", | |
" this._init_header(this);\n", | |
" this._init_canvas(this);\n", | |
" this._init_toolbar(this);\n", | |
"\n", | |
" var fig = this;\n", | |
"\n", | |
" this.waiting = false;\n", | |
"\n", | |
" this.ws.onopen = function () {\n", | |
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
" fig.send_message(\"send_image_mode\", {});\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" }\n", | |
"\n", | |
" this.imageObj.onload = function() {\n", | |
" if (fig.image_mode == 'full') {\n", | |
" // Full images could contain transparency (where diff images\n", | |
" // almost always do), so we need to clear the canvas so that\n", | |
" // there is no ghosting.\n", | |
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
" }\n", | |
" fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
" };\n", | |
"\n", | |
" this.imageObj.onunload = function() {\n", | |
" this.ws.close();\n", | |
" }\n", | |
"\n", | |
" this.ws.onmessage = this._make_on_message_function(this);\n", | |
"\n", | |
" this.ondownload = ondownload;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_header = function() {\n", | |
" var titlebar = $(\n", | |
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
" 'ui-helper-clearfix\"/>');\n", | |
" var titletext = $(\n", | |
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
" 'text-align: center; padding: 3px;\"/>');\n", | |
" titlebar.append(titletext)\n", | |
" this.root.append(titlebar);\n", | |
" this.header = titletext[0];\n", | |
"}\n", | |
"\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_canvas = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var canvas_div = $('<div/>');\n", | |
"\n", | |
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
"\n", | |
" function canvas_keyboard_event(event) {\n", | |
" return fig.key_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
" canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
" this.canvas_div = canvas_div\n", | |
" this._canvas_extra_style(canvas_div)\n", | |
" this.root.append(canvas_div);\n", | |
"\n", | |
" var canvas = $('<canvas/>');\n", | |
" canvas.addClass('mpl-canvas');\n", | |
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
"\n", | |
" this.canvas = canvas[0];\n", | |
" this.context = canvas[0].getContext(\"2d\");\n", | |
"\n", | |
" var rubberband = $('<canvas/>');\n", | |
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
"\n", | |
" var pass_mouse_events = true;\n", | |
"\n", | |
" canvas_div.resizable({\n", | |
" start: function(event, ui) {\n", | |
" pass_mouse_events = false;\n", | |
" },\n", | |
" resize: function(event, ui) {\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" stop: function(event, ui) {\n", | |
" pass_mouse_events = true;\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" });\n", | |
"\n", | |
" function mouse_event_fn(event) {\n", | |
" if (pass_mouse_events)\n", | |
" return fig.mouse_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" rubberband.mousedown('button_press', mouse_event_fn);\n", | |
" rubberband.mouseup('button_release', mouse_event_fn);\n", | |
" // Throttle sequential mouse events to 1 every 20ms.\n", | |
" rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
"\n", | |
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
"\n", | |
" canvas_div.on(\"wheel\", function (event) {\n", | |
" event = event.originalEvent;\n", | |
" event['data'] = 'scroll'\n", | |
" if (event.deltaY < 0) {\n", | |
" event.step = 1;\n", | |
" } else {\n", | |
" event.step = -1;\n", | |
" }\n", | |
" mouse_event_fn(event);\n", | |
" });\n", | |
"\n", | |
" canvas_div.append(canvas);\n", | |
" canvas_div.append(rubberband);\n", | |
"\n", | |
" this.rubberband = rubberband;\n", | |
" this.rubberband_canvas = rubberband[0];\n", | |
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
" this.rubberband_context.strokeStyle = \"#000000\";\n", | |
"\n", | |
" this._resize_canvas = function(width, height) {\n", | |
" // Keep the size of the canvas, canvas container, and rubber band\n", | |
" // canvas in synch.\n", | |
" canvas_div.css('width', width)\n", | |
" canvas_div.css('height', height)\n", | |
"\n", | |
" canvas.attr('width', width);\n", | |
" canvas.attr('height', height);\n", | |
"\n", | |
" rubberband.attr('width', width);\n", | |
" rubberband.attr('height', height);\n", | |
" }\n", | |
"\n", | |
" // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
" // upon first draw.\n", | |
" this._resize_canvas(600, 600);\n", | |
"\n", | |
" // Disable right mouse context menu.\n", | |
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
" return false;\n", | |
" });\n", | |
"\n", | |
" function set_focus () {\n", | |
" canvas.focus();\n", | |
" canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" window.setTimeout(set_focus, 100);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items) {\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) {\n", | |
" // put a spacer in here.\n", | |
" continue;\n", | |
" }\n", | |
" var button = $('<button/>');\n", | |
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
" 'ui-button-icon-only');\n", | |
" button.attr('role', 'button');\n", | |
" button.attr('aria-disabled', 'false');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
"\n", | |
" var icon_img = $('<span/>');\n", | |
" icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
" icon_img.addClass(image);\n", | |
" icon_img.addClass('ui-corner-all');\n", | |
"\n", | |
" var tooltip_span = $('<span/>');\n", | |
" tooltip_span.addClass('ui-button-text');\n", | |
" tooltip_span.html(tooltip);\n", | |
"\n", | |
" button.append(icon_img);\n", | |
" button.append(tooltip_span);\n", | |
"\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" var fmt_picker_span = $('<span/>');\n", | |
"\n", | |
" var fmt_picker = $('<select/>');\n", | |
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
" fmt_picker_span.append(fmt_picker);\n", | |
" nav_element.append(fmt_picker_span);\n", | |
" this.format_dropdown = fmt_picker[0];\n", | |
"\n", | |
" for (var ind in mpl.extensions) {\n", | |
" var fmt = mpl.extensions[ind];\n", | |
" var option = $(\n", | |
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
" fmt_picker.append(option)\n", | |
" }\n", | |
"\n", | |
" // Add hover states to the ui-buttons\n", | |
" $( \".ui-button\" ).hover(\n", | |
" function() { $(this).addClass(\"ui-state-hover\");},\n", | |
" function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
" );\n", | |
"\n", | |
" var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
" // which will in turn request a refresh of the image.\n", | |
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_message = function(type, properties) {\n", | |
" properties['type'] = type;\n", | |
" properties['figure_id'] = this.id;\n", | |
" this.ws.send(JSON.stringify(properties));\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_draw_message = function() {\n", | |
" if (!this.waiting) {\n", | |
" this.waiting = true;\n", | |
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" var format_dropdown = fig.format_dropdown;\n", | |
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
" fig.ondownload(fig, format);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
" var size = msg['size'];\n", | |
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
" fig._resize_canvas(size[0], size[1]);\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
" var x0 = msg['x0'];\n", | |
" var y0 = fig.canvas.height - msg['y0'];\n", | |
" var x1 = msg['x1'];\n", | |
" var y1 = fig.canvas.height - msg['y1'];\n", | |
" x0 = Math.floor(x0) + 0.5;\n", | |
" y0 = Math.floor(y0) + 0.5;\n", | |
" x1 = Math.floor(x1) + 0.5;\n", | |
" y1 = Math.floor(y1) + 0.5;\n", | |
" var min_x = Math.min(x0, x1);\n", | |
" var min_y = Math.min(y0, y1);\n", | |
" var width = Math.abs(x1 - x0);\n", | |
" var height = Math.abs(y1 - y0);\n", | |
"\n", | |
" fig.rubberband_context.clearRect(\n", | |
" 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
"\n", | |
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
" // Updates the figure title.\n", | |
" fig.header.textContent = msg['label'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
" var cursor = msg['cursor'];\n", | |
" switch(cursor)\n", | |
" {\n", | |
" case 0:\n", | |
" cursor = 'pointer';\n", | |
" break;\n", | |
" case 1:\n", | |
" cursor = 'default';\n", | |
" break;\n", | |
" case 2:\n", | |
" cursor = 'crosshair';\n", | |
" break;\n", | |
" case 3:\n", | |
" cursor = 'move';\n", | |
" break;\n", | |
" }\n", | |
" fig.rubberband_canvas.style.cursor = cursor;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
" fig.message.textContent = msg['message'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
" // Request the server to send over a new figure.\n", | |
" fig.send_draw_message();\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
" fig.image_mode = msg['mode'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Called whenever the canvas gets updated.\n", | |
" this.send_message(\"ack\", {});\n", | |
"}\n", | |
"\n", | |
"// A function to construct a web socket function for onmessage handling.\n", | |
"// Called in the figure constructor.\n", | |
"mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
" return function socket_on_message(evt) {\n", | |
" if (evt.data instanceof Blob) {\n", | |
" /* FIXME: We get \"Resource interpreted as Image but\n", | |
" * transferred with MIME type text/plain:\" errors on\n", | |
" * Chrome. But how to set the MIME type? It doesn't seem\n", | |
" * to be part of the websocket stream */\n", | |
" evt.data.type = \"image/png\";\n", | |
"\n", | |
" /* Free the memory for the previous frames */\n", | |
" if (fig.imageObj.src) {\n", | |
" (window.URL || window.webkitURL).revokeObjectURL(\n", | |
" fig.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
" evt.data);\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
" fig.imageObj.src = evt.data;\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var msg = JSON.parse(evt.data);\n", | |
" var msg_type = msg['type'];\n", | |
"\n", | |
" // Call the \"handle_{type}\" callback, which takes\n", | |
" // the figure and JSON message as its only arguments.\n", | |
" try {\n", | |
" var callback = fig[\"handle_\" + msg_type];\n", | |
" } catch (e) {\n", | |
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" if (callback) {\n", | |
" try {\n", | |
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
" callback(fig, msg);\n", | |
" } catch (e) {\n", | |
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
" }\n", | |
" }\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
"mpl.findpos = function(e) {\n", | |
" //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
" var targ;\n", | |
" if (!e)\n", | |
" e = window.event;\n", | |
" if (e.target)\n", | |
" targ = e.target;\n", | |
" else if (e.srcElement)\n", | |
" targ = e.srcElement;\n", | |
" if (targ.nodeType == 3) // defeat Safari bug\n", | |
" targ = targ.parentNode;\n", | |
"\n", | |
" // jQuery normalizes the pageX and pageY\n", | |
" // pageX,Y are the mouse positions relative to the document\n", | |
" // offset() returns the position of the element relative to the document\n", | |
" var x = e.pageX - $(targ).offset().left;\n", | |
" var y = e.pageY - $(targ).offset().top;\n", | |
"\n", | |
" return {\"x\": x, \"y\": y};\n", | |
"};\n", | |
"\n", | |
"/*\n", | |
" * return a copy of an object with only non-object keys\n", | |
" * we need this to avoid circular references\n", | |
" * http://stackoverflow.com/a/24161582/3208463\n", | |
" */\n", | |
"function simpleKeys (original) {\n", | |
" return Object.keys(original).reduce(function (obj, key) {\n", | |
" if (typeof original[key] !== 'object')\n", | |
" obj[key] = original[key]\n", | |
" return obj;\n", | |
" }, {});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
" var canvas_pos = mpl.findpos(event)\n", | |
"\n", | |
" if (name === 'button_press')\n", | |
" {\n", | |
" this.canvas.focus();\n", | |
" this.canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" var x = canvas_pos.x;\n", | |
" var y = canvas_pos.y;\n", | |
"\n", | |
" this.send_message(name, {x: x, y: y, button: event.button,\n", | |
" step: event.step,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
"\n", | |
" /* This prevents the web browser from automatically changing to\n", | |
" * the text insertion cursor when the button is pressed. We want\n", | |
" * to control all of the cursor setting manually through the\n", | |
" * 'cursor' event from matplotlib */\n", | |
" event.preventDefault();\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" // Handle any extra behaviour associated with a key event\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.key_event = function(event, name) {\n", | |
"\n", | |
" // Prevent repeat events\n", | |
" if (name == 'key_press')\n", | |
" {\n", | |
" if (event.which === this._key)\n", | |
" return;\n", | |
" else\n", | |
" this._key = event.which;\n", | |
" }\n", | |
" if (name == 'key_release')\n", | |
" this._key = null;\n", | |
"\n", | |
" var value = '';\n", | |
" if (event.ctrlKey && event.which != 17)\n", | |
" value += \"ctrl+\";\n", | |
" if (event.altKey && event.which != 18)\n", | |
" value += \"alt+\";\n", | |
" if (event.shiftKey && event.which != 16)\n", | |
" value += \"shift+\";\n", | |
"\n", | |
" value += 'k';\n", | |
" value += event.which.toString();\n", | |
"\n", | |
" this._key_event_extra(event, name);\n", | |
"\n", | |
" this.send_message(name, {key: value,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
" if (name == 'download') {\n", | |
" this.handle_save(this, null);\n", | |
" } else {\n", | |
" this.send_message(\"toolbar_button\", {name: name});\n", | |
" }\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
" this.message.textContent = tooltip;\n", | |
"};\n", | |
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
"\n", | |
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
"\n", | |
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
" // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
" // object with the appropriate methods. Currently this is a non binary\n", | |
" // socket, so there is still some room for performance tuning.\n", | |
" var ws = {};\n", | |
"\n", | |
" ws.close = function() {\n", | |
" comm.close()\n", | |
" };\n", | |
" ws.send = function(m) {\n", | |
" //console.log('sending', m);\n", | |
" comm.send(m);\n", | |
" };\n", | |
" // Register the callback with on_msg.\n", | |
" comm.on_msg(function(msg) {\n", | |
" //console.log('receiving', msg['content']['data'], msg);\n", | |
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
" ws.onmessage(msg['content']['data'])\n", | |
" });\n", | |
" return ws;\n", | |
"}\n", | |
"\n", | |
"mpl.mpl_figure_comm = function(comm, msg) {\n", | |
" // This is the function which gets called when the mpl process\n", | |
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
"\n", | |
" var id = msg.content.data.id;\n", | |
" // Get hold of the div created by the display call when the Comm\n", | |
" // socket was opened in Python.\n", | |
" var element = $(\"#\" + id);\n", | |
" var ws_proxy = comm_websocket_adapter(comm)\n", | |
"\n", | |
" function ondownload(figure, format) {\n", | |
" window.open(figure.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" var fig = new mpl.figure(id, ws_proxy,\n", | |
" ondownload,\n", | |
" element.get(0));\n", | |
"\n", | |
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
" // web socket which is closed, not our websocket->open comm proxy.\n", | |
" ws_proxy.onopen();\n", | |
"\n", | |
" fig.parent_element = element.get(0);\n", | |
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
" if (!fig.cell_info) {\n", | |
" console.error(\"Failed to find cell for figure\", id, fig);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var output_index = fig.cell_info[2]\n", | |
" var cell = fig.cell_info[0];\n", | |
"\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
" fig.root.unbind('remove')\n", | |
"\n", | |
" // Update the output cell to use the data from the current canvas.\n", | |
" fig.push_to_output();\n", | |
" var dataURL = fig.canvas.toDataURL();\n", | |
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
" // the notebook keyboard shortcuts fail.\n", | |
" IPython.keyboard_manager.enable()\n", | |
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n", | |
" fig.close_ws(fig, msg);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
" fig.send_message('closing', msg);\n", | |
" // fig.ws.close()\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
" // Turn the data on the canvas into data in the output cell.\n", | |
" var dataURL = this.canvas.toDataURL();\n", | |
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Tell IPython that the notebook contents must change.\n", | |
" IPython.notebook.set_dirty(true);\n", | |
" this.send_message(\"ack\", {});\n", | |
" var fig = this;\n", | |
" // Wait a second, then push the new image to the DOM so\n", | |
" // that it is saved nicely (might be nice to debounce this).\n", | |
" setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items){\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) { continue; };\n", | |
"\n", | |
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" // Add the status bar.\n", | |
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"\n", | |
" // Add the close button to the window.\n", | |
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
" buttongrp.append(button);\n", | |
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
" titlebar.prepend(buttongrp);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(el){\n", | |
" var fig = this\n", | |
" el.on(\"remove\", function(){\n", | |
"\tfig.close_ws(fig, {});\n", | |
" });\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
" // this is important to make the div 'focusable\n", | |
" el.attr('tabindex', 0)\n", | |
" // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
" // off when our div gets focus\n", | |
"\n", | |
" // location in version 3\n", | |
" if (IPython.notebook.keyboard_manager) {\n", | |
" IPython.notebook.keyboard_manager.register_events(el);\n", | |
" }\n", | |
" else {\n", | |
" // location in version 2\n", | |
" IPython.keyboard_manager.register_events(el);\n", | |
" }\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" var manager = IPython.notebook.keyboard_manager;\n", | |
" if (!manager)\n", | |
" manager = IPython.keyboard_manager;\n", | |
"\n", | |
" // Check for shift+enter\n", | |
" if (event.shiftKey && event.which == 13) {\n", | |
" this.canvas_div.blur();\n", | |
" event.shiftKey = false;\n", | |
" // Send a \"J\" for go to next cell\n", | |
" event.which = 74;\n", | |
" event.keyCode = 74;\n", | |
" manager.command_mode();\n", | |
" manager.handle_keydown(event);\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" fig.ondownload(fig, null);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.find_output_cell = function(html_output) {\n", | |
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
" // IPython event is triggered only after the cells have been serialised, which for\n", | |
" // our purposes (turning an active figure into a static one), is too late.\n", | |
" var cells = IPython.notebook.get_cells();\n", | |
" var ncells = cells.length;\n", | |
" for (var i=0; i<ncells; i++) {\n", | |
" var cell = cells[i];\n", | |
" if (cell.cell_type === 'code'){\n", | |
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
" var data = cell.output_area.outputs[j];\n", | |
" if (data.data) {\n", | |
" // IPython >= 3 moved mimebundle to data attribute of output\n", | |
" data = data.data;\n", | |
" }\n", | |
" if (data['text/html'] == html_output) {\n", | |
" return [cell, data, j];\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"// Register the function which deals with the matplotlib target/channel.\n", | |
"// The kernel may be null if the page has been refreshed.\n", | |
"if (IPython.notebook.kernel != null) {\n", | |
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4XuydB3TcVNr+H43HLXFJYqc324klO47TE7JA+NMhECCwBELv+8F2yla2AFtYtsAC22HpvfeeJdRAeo+lcXpPnGYn7h79zx3HYzt2rGt7pNFoHp3zHfaLr8p99D7v+5sr6V4F3KgAFaACVIAKUAEqQAXiSgElrnrLzlIBKkAFqAAVoAJUgAqAAMggoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlSAAMgYoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlSAAMgYoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlSAAMgYoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlSAAMgYoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlSAAMgYoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlSAAMgYoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlSAAMgYoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlSAAMgYoAJUgApQASpABahAnClAAIyzG87uUgEqQAWoABWgAlTA0wCYn58/yufzPQ1A03W9B283FaACVIAKUAEqQAWoAOBZANQ0bZZpmn8F8JmiKOcSABnuVIAKUAEqQAWoABVoVMCzAJifn39NQ0PDHL/ff5KiKP8kADLkqQAVoAJUgApQASrgcQBsusGqql5FAGS4UwEqQAWoABWgAlSgWQHPjgASABnmVIAKUAEqQAWoABVoXwECICODClABKkAFqAAVoAJxpgABsJ0bHgwGTUXxvDRxFursLhWgAlSAClABdyugOAgfnqecrrwDaJqmuWdPBUzT3YHixNUJDs7KSgf1aFSberSOOupBPTrKQ4wPxgfjQ75SC79kZ2c4xmWOnUhegsi2VFX1akVR/tGZr4AFAJaVEQCbgCc7Ox3UoxkAqUezRxsTFuOjSRHq0RZ4GB/0y9GqOv3S1i99+xIAu02BqqqWKIoyzDTNBEVR/ABqAYhHuzeUlJSIyaGPuhEAmbCYsOQsyARO4LEa4SEAMp8yn8rnUwKgnFa2tSIAMmExYcnZiwBIACQAynmFT1Ta6sT8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\">" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(1, 1)\n", | |
"ax.plot(mf[:, 0], np.log10(mf[:, 1]))\n", | |
"sns.axlabel(R'$\\log_{10}(M_* h^{-1}/{\\rm M_{\\odot}})$', R'$\\log_{10}(\\phi h^{-3}\\,{\\rm Mpc^{-3}dex^{-1}})$')\n", | |
"ax.text(3.5, -3.5, 'z=6')\n", | |
"plt.tight_layout()\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# SHMR" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 72, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"nbins = 20\n", | |
"edges = np.linspace(7, 14, nbins+1)\n", | |
"bins = g.groupby(pd.cut(np.log10(g.Mvir*1e10), edges))\n", | |
"shmr = bins.aggregate({'Mvir': 'mean',\n", | |
" 'StellarMass': ['mean', 'std']})" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 76, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"/* Put everything inside the global mpl namespace */\n", | |
"window.mpl = {};\n", | |
"\n", | |
"mpl.get_websocket_type = function() {\n", | |
" if (typeof(WebSocket) !== 'undefined') {\n", | |
" return WebSocket;\n", | |
" } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
" return MozWebSocket;\n", | |
" } else {\n", | |
" alert('Your browser does not have WebSocket support.' +\n", | |
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
" 'Firefox 4 and 5 are also supported but you ' +\n", | |
" 'have to enable WebSockets in about:config.');\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
" this.id = figure_id;\n", | |
"\n", | |
" this.ws = websocket;\n", | |
"\n", | |
" this.supports_binary = (this.ws.binaryType != undefined);\n", | |
"\n", | |
" if (!this.supports_binary) {\n", | |
" var warnings = document.getElementById(\"mpl-warnings\");\n", | |
" if (warnings) {\n", | |
" warnings.style.display = 'block';\n", | |
" warnings.textContent = (\n", | |
" \"This browser does not support binary websocket messages. \" +\n", | |
" \"Performance may be slow.\");\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.imageObj = new Image();\n", | |
"\n", | |
" this.context = undefined;\n", | |
" this.message = undefined;\n", | |
" this.canvas = undefined;\n", | |
" this.rubberband_canvas = undefined;\n", | |
" this.rubberband_context = undefined;\n", | |
" this.format_dropdown = undefined;\n", | |
"\n", | |
" this.image_mode = 'full';\n", | |
"\n", | |
" this.root = $('<div/>');\n", | |
" this._root_extra_style(this.root)\n", | |
" this.root.attr('style', 'display: inline-block');\n", | |
"\n", | |
" $(parent_element).append(this.root);\n", | |
"\n", | |
" this._init_header(this);\n", | |
" this._init_canvas(this);\n", | |
" this._init_toolbar(this);\n", | |
"\n", | |
" var fig = this;\n", | |
"\n", | |
" this.waiting = false;\n", | |
"\n", | |
" this.ws.onopen = function () {\n", | |
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
" fig.send_message(\"send_image_mode\", {});\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" }\n", | |
"\n", | |
" this.imageObj.onload = function() {\n", | |
" if (fig.image_mode == 'full') {\n", | |
" // Full images could contain transparency (where diff images\n", | |
" // almost always do), so we need to clear the canvas so that\n", | |
" // there is no ghosting.\n", | |
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
" }\n", | |
" fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
" };\n", | |
"\n", | |
" this.imageObj.onunload = function() {\n", | |
" this.ws.close();\n", | |
" }\n", | |
"\n", | |
" this.ws.onmessage = this._make_on_message_function(this);\n", | |
"\n", | |
" this.ondownload = ondownload;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_header = function() {\n", | |
" var titlebar = $(\n", | |
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
" 'ui-helper-clearfix\"/>');\n", | |
" var titletext = $(\n", | |
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
" 'text-align: center; padding: 3px;\"/>');\n", | |
" titlebar.append(titletext)\n", | |
" this.root.append(titlebar);\n", | |
" this.header = titletext[0];\n", | |
"}\n", | |
"\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_canvas = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var canvas_div = $('<div/>');\n", | |
"\n", | |
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
"\n", | |
" function canvas_keyboard_event(event) {\n", | |
" return fig.key_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
" canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
" this.canvas_div = canvas_div\n", | |
" this._canvas_extra_style(canvas_div)\n", | |
" this.root.append(canvas_div);\n", | |
"\n", | |
" var canvas = $('<canvas/>');\n", | |
" canvas.addClass('mpl-canvas');\n", | |
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
"\n", | |
" this.canvas = canvas[0];\n", | |
" this.context = canvas[0].getContext(\"2d\");\n", | |
"\n", | |
" var rubberband = $('<canvas/>');\n", | |
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
"\n", | |
" var pass_mouse_events = true;\n", | |
"\n", | |
" canvas_div.resizable({\n", | |
" start: function(event, ui) {\n", | |
" pass_mouse_events = false;\n", | |
" },\n", | |
" resize: function(event, ui) {\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" stop: function(event, ui) {\n", | |
" pass_mouse_events = true;\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" });\n", | |
"\n", | |
" function mouse_event_fn(event) {\n", | |
" if (pass_mouse_events)\n", | |
" return fig.mouse_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" rubberband.mousedown('button_press', mouse_event_fn);\n", | |
" rubberband.mouseup('button_release', mouse_event_fn);\n", | |
" // Throttle sequential mouse events to 1 every 20ms.\n", | |
" rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
"\n", | |
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
"\n", | |
" canvas_div.on(\"wheel\", function (event) {\n", | |
" event = event.originalEvent;\n", | |
" event['data'] = 'scroll'\n", | |
" if (event.deltaY < 0) {\n", | |
" event.step = 1;\n", | |
" } else {\n", | |
" event.step = -1;\n", | |
" }\n", | |
" mouse_event_fn(event);\n", | |
" });\n", | |
"\n", | |
" canvas_div.append(canvas);\n", | |
" canvas_div.append(rubberband);\n", | |
"\n", | |
" this.rubberband = rubberband;\n", | |
" this.rubberband_canvas = rubberband[0];\n", | |
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
" this.rubberband_context.strokeStyle = \"#000000\";\n", | |
"\n", | |
" this._resize_canvas = function(width, height) {\n", | |
" // Keep the size of the canvas, canvas container, and rubber band\n", | |
" // canvas in synch.\n", | |
" canvas_div.css('width', width)\n", | |
" canvas_div.css('height', height)\n", | |
"\n", | |
" canvas.attr('width', width);\n", | |
" canvas.attr('height', height);\n", | |
"\n", | |
" rubberband.attr('width', width);\n", | |
" rubberband.attr('height', height);\n", | |
" }\n", | |
"\n", | |
" // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
" // upon first draw.\n", | |
" this._resize_canvas(600, 600);\n", | |
"\n", | |
" // Disable right mouse context menu.\n", | |
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
" return false;\n", | |
" });\n", | |
"\n", | |
" function set_focus () {\n", | |
" canvas.focus();\n", | |
" canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" window.setTimeout(set_focus, 100);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items) {\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) {\n", | |
" // put a spacer in here.\n", | |
" continue;\n", | |
" }\n", | |
" var button = $('<button/>');\n", | |
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
" 'ui-button-icon-only');\n", | |
" button.attr('role', 'button');\n", | |
" button.attr('aria-disabled', 'false');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
"\n", | |
" var icon_img = $('<span/>');\n", | |
" icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
" icon_img.addClass(image);\n", | |
" icon_img.addClass('ui-corner-all');\n", | |
"\n", | |
" var tooltip_span = $('<span/>');\n", | |
" tooltip_span.addClass('ui-button-text');\n", | |
" tooltip_span.html(tooltip);\n", | |
"\n", | |
" button.append(icon_img);\n", | |
" button.append(tooltip_span);\n", | |
"\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" var fmt_picker_span = $('<span/>');\n", | |
"\n", | |
" var fmt_picker = $('<select/>');\n", | |
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
" fmt_picker_span.append(fmt_picker);\n", | |
" nav_element.append(fmt_picker_span);\n", | |
" this.format_dropdown = fmt_picker[0];\n", | |
"\n", | |
" for (var ind in mpl.extensions) {\n", | |
" var fmt = mpl.extensions[ind];\n", | |
" var option = $(\n", | |
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
" fmt_picker.append(option)\n", | |
" }\n", | |
"\n", | |
" // Add hover states to the ui-buttons\n", | |
" $( \".ui-button\" ).hover(\n", | |
" function() { $(this).addClass(\"ui-state-hover\");},\n", | |
" function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
" );\n", | |
"\n", | |
" var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
" // which will in turn request a refresh of the image.\n", | |
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_message = function(type, properties) {\n", | |
" properties['type'] = type;\n", | |
" properties['figure_id'] = this.id;\n", | |
" this.ws.send(JSON.stringify(properties));\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_draw_message = function() {\n", | |
" if (!this.waiting) {\n", | |
" this.waiting = true;\n", | |
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" var format_dropdown = fig.format_dropdown;\n", | |
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
" fig.ondownload(fig, format);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
" var size = msg['size'];\n", | |
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
" fig._resize_canvas(size[0], size[1]);\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
" var x0 = msg['x0'];\n", | |
" var y0 = fig.canvas.height - msg['y0'];\n", | |
" var x1 = msg['x1'];\n", | |
" var y1 = fig.canvas.height - msg['y1'];\n", | |
" x0 = Math.floor(x0) + 0.5;\n", | |
" y0 = Math.floor(y0) + 0.5;\n", | |
" x1 = Math.floor(x1) + 0.5;\n", | |
" y1 = Math.floor(y1) + 0.5;\n", | |
" var min_x = Math.min(x0, x1);\n", | |
" var min_y = Math.min(y0, y1);\n", | |
" var width = Math.abs(x1 - x0);\n", | |
" var height = Math.abs(y1 - y0);\n", | |
"\n", | |
" fig.rubberband_context.clearRect(\n", | |
" 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
"\n", | |
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
" // Updates the figure title.\n", | |
" fig.header.textContent = msg['label'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
" var cursor = msg['cursor'];\n", | |
" switch(cursor)\n", | |
" {\n", | |
" case 0:\n", | |
" cursor = 'pointer';\n", | |
" break;\n", | |
" case 1:\n", | |
" cursor = 'default';\n", | |
" break;\n", | |
" case 2:\n", | |
" cursor = 'crosshair';\n", | |
" break;\n", | |
" case 3:\n", | |
" cursor = 'move';\n", | |
" break;\n", | |
" }\n", | |
" fig.rubberband_canvas.style.cursor = cursor;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
" fig.message.textContent = msg['message'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
" // Request the server to send over a new figure.\n", | |
" fig.send_draw_message();\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
" fig.image_mode = msg['mode'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Called whenever the canvas gets updated.\n", | |
" this.send_message(\"ack\", {});\n", | |
"}\n", | |
"\n", | |
"// A function to construct a web socket function for onmessage handling.\n", | |
"// Called in the figure constructor.\n", | |
"mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
" return function socket_on_message(evt) {\n", | |
" if (evt.data instanceof Blob) {\n", | |
" /* FIXME: We get \"Resource interpreted as Image but\n", | |
" * transferred with MIME type text/plain:\" errors on\n", | |
" * Chrome. But how to set the MIME type? It doesn't seem\n", | |
" * to be part of the websocket stream */\n", | |
" evt.data.type = \"image/png\";\n", | |
"\n", | |
" /* Free the memory for the previous frames */\n", | |
" if (fig.imageObj.src) {\n", | |
" (window.URL || window.webkitURL).revokeObjectURL(\n", | |
" fig.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
" evt.data);\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
" fig.imageObj.src = evt.data;\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var msg = JSON.parse(evt.data);\n", | |
" var msg_type = msg['type'];\n", | |
"\n", | |
" // Call the \"handle_{type}\" callback, which takes\n", | |
" // the figure and JSON message as its only arguments.\n", | |
" try {\n", | |
" var callback = fig[\"handle_\" + msg_type];\n", | |
" } catch (e) {\n", | |
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" if (callback) {\n", | |
" try {\n", | |
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
" callback(fig, msg);\n", | |
" } catch (e) {\n", | |
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
" }\n", | |
" }\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
"mpl.findpos = function(e) {\n", | |
" //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
" var targ;\n", | |
" if (!e)\n", | |
" e = window.event;\n", | |
" if (e.target)\n", | |
" targ = e.target;\n", | |
" else if (e.srcElement)\n", | |
" targ = e.srcElement;\n", | |
" if (targ.nodeType == 3) // defeat Safari bug\n", | |
" targ = targ.parentNode;\n", | |
"\n", | |
" // jQuery normalizes the pageX and pageY\n", | |
" // pageX,Y are the mouse positions relative to the document\n", | |
" // offset() returns the position of the element relative to the document\n", | |
" var x = e.pageX - $(targ).offset().left;\n", | |
" var y = e.pageY - $(targ).offset().top;\n", | |
"\n", | |
" return {\"x\": x, \"y\": y};\n", | |
"};\n", | |
"\n", | |
"/*\n", | |
" * return a copy of an object with only non-object keys\n", | |
" * we need this to avoid circular references\n", | |
" * http://stackoverflow.com/a/24161582/3208463\n", | |
" */\n", | |
"function simpleKeys (original) {\n", | |
" return Object.keys(original).reduce(function (obj, key) {\n", | |
" if (typeof original[key] !== 'object')\n", | |
" obj[key] = original[key]\n", | |
" return obj;\n", | |
" }, {});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
" var canvas_pos = mpl.findpos(event)\n", | |
"\n", | |
" if (name === 'button_press')\n", | |
" {\n", | |
" this.canvas.focus();\n", | |
" this.canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" var x = canvas_pos.x;\n", | |
" var y = canvas_pos.y;\n", | |
"\n", | |
" this.send_message(name, {x: x, y: y, button: event.button,\n", | |
" step: event.step,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
"\n", | |
" /* This prevents the web browser from automatically changing to\n", | |
" * the text insertion cursor when the button is pressed. We want\n", | |
" * to control all of the cursor setting manually through the\n", | |
" * 'cursor' event from matplotlib */\n", | |
" event.preventDefault();\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" // Handle any extra behaviour associated with a key event\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.key_event = function(event, name) {\n", | |
"\n", | |
" // Prevent repeat events\n", | |
" if (name == 'key_press')\n", | |
" {\n", | |
" if (event.which === this._key)\n", | |
" return;\n", | |
" else\n", | |
" this._key = event.which;\n", | |
" }\n", | |
" if (name == 'key_release')\n", | |
" this._key = null;\n", | |
"\n", | |
" var value = '';\n", | |
" if (event.ctrlKey && event.which != 17)\n", | |
" value += \"ctrl+\";\n", | |
" if (event.altKey && event.which != 18)\n", | |
" value += \"alt+\";\n", | |
" if (event.shiftKey && event.which != 16)\n", | |
" value += \"shift+\";\n", | |
"\n", | |
" value += 'k';\n", | |
" value += event.which.toString();\n", | |
"\n", | |
" this._key_event_extra(event, name);\n", | |
"\n", | |
" this.send_message(name, {key: value,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
" if (name == 'download') {\n", | |
" this.handle_save(this, null);\n", | |
" } else {\n", | |
" this.send_message(\"toolbar_button\", {name: name});\n", | |
" }\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
" this.message.textContent = tooltip;\n", | |
"};\n", | |
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
"\n", | |
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
"\n", | |
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
" // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
" // object with the appropriate methods. Currently this is a non binary\n", | |
" // socket, so there is still some room for performance tuning.\n", | |
" var ws = {};\n", | |
"\n", | |
" ws.close = function() {\n", | |
" comm.close()\n", | |
" };\n", | |
" ws.send = function(m) {\n", | |
" //console.log('sending', m);\n", | |
" comm.send(m);\n", | |
" };\n", | |
" // Register the callback with on_msg.\n", | |
" comm.on_msg(function(msg) {\n", | |
" //console.log('receiving', msg['content']['data'], msg);\n", | |
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
" ws.onmessage(msg['content']['data'])\n", | |
" });\n", | |
" return ws;\n", | |
"}\n", | |
"\n", | |
"mpl.mpl_figure_comm = function(comm, msg) {\n", | |
" // This is the function which gets called when the mpl process\n", | |
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
"\n", | |
" var id = msg.content.data.id;\n", | |
" // Get hold of the div created by the display call when the Comm\n", | |
" // socket was opened in Python.\n", | |
" var element = $(\"#\" + id);\n", | |
" var ws_proxy = comm_websocket_adapter(comm)\n", | |
"\n", | |
" function ondownload(figure, format) {\n", | |
" window.open(figure.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" var fig = new mpl.figure(id, ws_proxy,\n", | |
" ondownload,\n", | |
" element.get(0));\n", | |
"\n", | |
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
" // web socket which is closed, not our websocket->open comm proxy.\n", | |
" ws_proxy.onopen();\n", | |
"\n", | |
" fig.parent_element = element.get(0);\n", | |
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
" if (!fig.cell_info) {\n", | |
" console.error(\"Failed to find cell for figure\", id, fig);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var output_index = fig.cell_info[2]\n", | |
" var cell = fig.cell_info[0];\n", | |
"\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
" fig.root.unbind('remove')\n", | |
"\n", | |
" // Update the output cell to use the data from the current canvas.\n", | |
" fig.push_to_output();\n", | |
" var dataURL = fig.canvas.toDataURL();\n", | |
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
" // the notebook keyboard shortcuts fail.\n", | |
" IPython.keyboard_manager.enable()\n", | |
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n", | |
" fig.close_ws(fig, msg);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
" fig.send_message('closing', msg);\n", | |
" // fig.ws.close()\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
" // Turn the data on the canvas into data in the output cell.\n", | |
" var dataURL = this.canvas.toDataURL();\n", | |
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Tell IPython that the notebook contents must change.\n", | |
" IPython.notebook.set_dirty(true);\n", | |
" this.send_message(\"ack\", {});\n", | |
" var fig = this;\n", | |
" // Wait a second, then push the new image to the DOM so\n", | |
" // that it is saved nicely (might be nice to debounce this).\n", | |
" setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items){\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) { continue; };\n", | |
"\n", | |
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" // Add the status bar.\n", | |
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"\n", | |
" // Add the close button to the window.\n", | |
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
" buttongrp.append(button);\n", | |
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
" titlebar.prepend(buttongrp);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(el){\n", | |
" var fig = this\n", | |
" el.on(\"remove\", function(){\n", | |
"\tfig.close_ws(fig, {});\n", | |
" });\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
" // this is important to make the div 'focusable\n", | |
" el.attr('tabindex', 0)\n", | |
" // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
" // off when our div gets focus\n", | |
"\n", | |
" // location in version 3\n", | |
" if (IPython.notebook.keyboard_manager) {\n", | |
" IPython.notebook.keyboard_manager.register_events(el);\n", | |
" }\n", | |
" else {\n", | |
" // location in version 2\n", | |
" IPython.keyboard_manager.register_events(el);\n", | |
" }\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" var manager = IPython.notebook.keyboard_manager;\n", | |
" if (!manager)\n", | |
" manager = IPython.keyboard_manager;\n", | |
"\n", | |
" // Check for shift+enter\n", | |
" if (event.shiftKey && event.which == 13) {\n", | |
" this.canvas_div.blur();\n", | |
" event.shiftKey = false;\n", | |
" // Send a \"J\" for go to next cell\n", | |
" event.which = 74;\n", | |
" event.keyCode = 74;\n", | |
" manager.command_mode();\n", | |
" manager.handle_keydown(event);\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" fig.ondownload(fig, null);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.find_output_cell = function(html_output) {\n", | |
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
" // IPython event is triggered only after the cells have been serialised, which for\n", | |
" // our purposes (turning an active figure into a static one), is too late.\n", | |
" var cells = IPython.notebook.get_cells();\n", | |
" var ncells = cells.length;\n", | |
" for (var i=0; i<ncells; i++) {\n", | |
" var cell = cells[i];\n", | |
" if (cell.cell_type === 'code'){\n", | |
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
" var data = cell.output_area.outputs[j];\n", | |
" if (data.data) {\n", | |
" // IPython >= 3 moved mimebundle to data attribute of output\n", | |
" data = data.data;\n", | |
" }\n", | |
" if (data['text/html'] == html_output) {\n", | |
" return [cell, data, j];\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"// Register the function which deals with the matplotlib target/channel.\n", | |
"// The kernel may be null if the page has been refreshed.\n", | |
"if (IPython.notebook.kernel != null) {\n", | |
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"data:image/png;base64,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\">" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(1, 1)\n", | |
"ax.errorbar(np.log10(1e10*shmr[('Mvir', 'mean')]), 1e10*shmr[('StellarMass', 'mean')],\n", | |
" yerr=1e10*shmr[('StellarMass', 'std')], marker='o', ms=15)\n", | |
"sns.axlabel(R'$\\log_{10}(M_{\\rm vir} h^{-1}/{\\rm M_{\\odot}})$', R'$\\log_{10}(M_{*} h^{-1}/{\\rm M_{\\odot}})$')\n", | |
"ax.set_yscale('log')\n", | |
"ax.text(0.05, 0.90, 'z=6', transform=ax.transAxes)\n", | |
"plt.tight_layout()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# SFR vs. Mvir" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 77, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"sfr_mvir = bins.aggregate({'Mvir': 'mean',\n", | |
" 'Sfr': ['mean', 'std']})" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 78, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"/* Put everything inside the global mpl namespace */\n", | |
"window.mpl = {};\n", | |
"\n", | |
"mpl.get_websocket_type = function() {\n", | |
" if (typeof(WebSocket) !== 'undefined') {\n", | |
" return WebSocket;\n", | |
" } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
" return MozWebSocket;\n", | |
" } else {\n", | |
" alert('Your browser does not have WebSocket support.' +\n", | |
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
" 'Firefox 4 and 5 are also supported but you ' +\n", | |
" 'have to enable WebSockets in about:config.');\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
" this.id = figure_id;\n", | |
"\n", | |
" this.ws = websocket;\n", | |
"\n", | |
" this.supports_binary = (this.ws.binaryType != undefined);\n", | |
"\n", | |
" if (!this.supports_binary) {\n", | |
" var warnings = document.getElementById(\"mpl-warnings\");\n", | |
" if (warnings) {\n", | |
" warnings.style.display = 'block';\n", | |
" warnings.textContent = (\n", | |
" \"This browser does not support binary websocket messages. \" +\n", | |
" \"Performance may be slow.\");\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.imageObj = new Image();\n", | |
"\n", | |
" this.context = undefined;\n", | |
" this.message = undefined;\n", | |
" this.canvas = undefined;\n", | |
" this.rubberband_canvas = undefined;\n", | |
" this.rubberband_context = undefined;\n", | |
" this.format_dropdown = undefined;\n", | |
"\n", | |
" this.image_mode = 'full';\n", | |
"\n", | |
" this.root = $('<div/>');\n", | |
" this._root_extra_style(this.root)\n", | |
" this.root.attr('style', 'display: inline-block');\n", | |
"\n", | |
" $(parent_element).append(this.root);\n", | |
"\n", | |
" this._init_header(this);\n", | |
" this._init_canvas(this);\n", | |
" this._init_toolbar(this);\n", | |
"\n", | |
" var fig = this;\n", | |
"\n", | |
" this.waiting = false;\n", | |
"\n", | |
" this.ws.onopen = function () {\n", | |
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
" fig.send_message(\"send_image_mode\", {});\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" }\n", | |
"\n", | |
" this.imageObj.onload = function() {\n", | |
" if (fig.image_mode == 'full') {\n", | |
" // Full images could contain transparency (where diff images\n", | |
" // almost always do), so we need to clear the canvas so that\n", | |
" // there is no ghosting.\n", | |
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
" }\n", | |
" fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
" };\n", | |
"\n", | |
" this.imageObj.onunload = function() {\n", | |
" this.ws.close();\n", | |
" }\n", | |
"\n", | |
" this.ws.onmessage = this._make_on_message_function(this);\n", | |
"\n", | |
" this.ondownload = ondownload;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_header = function() {\n", | |
" var titlebar = $(\n", | |
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
" 'ui-helper-clearfix\"/>');\n", | |
" var titletext = $(\n", | |
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
" 'text-align: center; padding: 3px;\"/>');\n", | |
" titlebar.append(titletext)\n", | |
" this.root.append(titlebar);\n", | |
" this.header = titletext[0];\n", | |
"}\n", | |
"\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_canvas = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var canvas_div = $('<div/>');\n", | |
"\n", | |
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
"\n", | |
" function canvas_keyboard_event(event) {\n", | |
" return fig.key_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
" canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
" this.canvas_div = canvas_div\n", | |
" this._canvas_extra_style(canvas_div)\n", | |
" this.root.append(canvas_div);\n", | |
"\n", | |
" var canvas = $('<canvas/>');\n", | |
" canvas.addClass('mpl-canvas');\n", | |
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
"\n", | |
" this.canvas = canvas[0];\n", | |
" this.context = canvas[0].getContext(\"2d\");\n", | |
"\n", | |
" var rubberband = $('<canvas/>');\n", | |
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
"\n", | |
" var pass_mouse_events = true;\n", | |
"\n", | |
" canvas_div.resizable({\n", | |
" start: function(event, ui) {\n", | |
" pass_mouse_events = false;\n", | |
" },\n", | |
" resize: function(event, ui) {\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" stop: function(event, ui) {\n", | |
" pass_mouse_events = true;\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" });\n", | |
"\n", | |
" function mouse_event_fn(event) {\n", | |
" if (pass_mouse_events)\n", | |
" return fig.mouse_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" rubberband.mousedown('button_press', mouse_event_fn);\n", | |
" rubberband.mouseup('button_release', mouse_event_fn);\n", | |
" // Throttle sequential mouse events to 1 every 20ms.\n", | |
" rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
"\n", | |
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
"\n", | |
" canvas_div.on(\"wheel\", function (event) {\n", | |
" event = event.originalEvent;\n", | |
" event['data'] = 'scroll'\n", | |
" if (event.deltaY < 0) {\n", | |
" event.step = 1;\n", | |
" } else {\n", | |
" event.step = -1;\n", | |
" }\n", | |
" mouse_event_fn(event);\n", | |
" });\n", | |
"\n", | |
" canvas_div.append(canvas);\n", | |
" canvas_div.append(rubberband);\n", | |
"\n", | |
" this.rubberband = rubberband;\n", | |
" this.rubberband_canvas = rubberband[0];\n", | |
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
" this.rubberband_context.strokeStyle = \"#000000\";\n", | |
"\n", | |
" this._resize_canvas = function(width, height) {\n", | |
" // Keep the size of the canvas, canvas container, and rubber band\n", | |
" // canvas in synch.\n", | |
" canvas_div.css('width', width)\n", | |
" canvas_div.css('height', height)\n", | |
"\n", | |
" canvas.attr('width', width);\n", | |
" canvas.attr('height', height);\n", | |
"\n", | |
" rubberband.attr('width', width);\n", | |
" rubberband.attr('height', height);\n", | |
" }\n", | |
"\n", | |
" // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
" // upon first draw.\n", | |
" this._resize_canvas(600, 600);\n", | |
"\n", | |
" // Disable right mouse context menu.\n", | |
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
" return false;\n", | |
" });\n", | |
"\n", | |
" function set_focus () {\n", | |
" canvas.focus();\n", | |
" canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" window.setTimeout(set_focus, 100);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items) {\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) {\n", | |
" // put a spacer in here.\n", | |
" continue;\n", | |
" }\n", | |
" var button = $('<button/>');\n", | |
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
" 'ui-button-icon-only');\n", | |
" button.attr('role', 'button');\n", | |
" button.attr('aria-disabled', 'false');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
"\n", | |
" var icon_img = $('<span/>');\n", | |
" icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
" icon_img.addClass(image);\n", | |
" icon_img.addClass('ui-corner-all');\n", | |
"\n", | |
" var tooltip_span = $('<span/>');\n", | |
" tooltip_span.addClass('ui-button-text');\n", | |
" tooltip_span.html(tooltip);\n", | |
"\n", | |
" button.append(icon_img);\n", | |
" button.append(tooltip_span);\n", | |
"\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" var fmt_picker_span = $('<span/>');\n", | |
"\n", | |
" var fmt_picker = $('<select/>');\n", | |
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
" fmt_picker_span.append(fmt_picker);\n", | |
" nav_element.append(fmt_picker_span);\n", | |
" this.format_dropdown = fmt_picker[0];\n", | |
"\n", | |
" for (var ind in mpl.extensions) {\n", | |
" var fmt = mpl.extensions[ind];\n", | |
" var option = $(\n", | |
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
" fmt_picker.append(option)\n", | |
" }\n", | |
"\n", | |
" // Add hover states to the ui-buttons\n", | |
" $( \".ui-button\" ).hover(\n", | |
" function() { $(this).addClass(\"ui-state-hover\");},\n", | |
" function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
" );\n", | |
"\n", | |
" var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
" // which will in turn request a refresh of the image.\n", | |
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_message = function(type, properties) {\n", | |
" properties['type'] = type;\n", | |
" properties['figure_id'] = this.id;\n", | |
" this.ws.send(JSON.stringify(properties));\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_draw_message = function() {\n", | |
" if (!this.waiting) {\n", | |
" this.waiting = true;\n", | |
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" var format_dropdown = fig.format_dropdown;\n", | |
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
" fig.ondownload(fig, format);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
" var size = msg['size'];\n", | |
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
" fig._resize_canvas(size[0], size[1]);\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
" var x0 = msg['x0'];\n", | |
" var y0 = fig.canvas.height - msg['y0'];\n", | |
" var x1 = msg['x1'];\n", | |
" var y1 = fig.canvas.height - msg['y1'];\n", | |
" x0 = Math.floor(x0) + 0.5;\n", | |
" y0 = Math.floor(y0) + 0.5;\n", | |
" x1 = Math.floor(x1) + 0.5;\n", | |
" y1 = Math.floor(y1) + 0.5;\n", | |
" var min_x = Math.min(x0, x1);\n", | |
" var min_y = Math.min(y0, y1);\n", | |
" var width = Math.abs(x1 - x0);\n", | |
" var height = Math.abs(y1 - y0);\n", | |
"\n", | |
" fig.rubberband_context.clearRect(\n", | |
" 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
"\n", | |
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
" // Updates the figure title.\n", | |
" fig.header.textContent = msg['label'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
" var cursor = msg['cursor'];\n", | |
" switch(cursor)\n", | |
" {\n", | |
" case 0:\n", | |
" cursor = 'pointer';\n", | |
" break;\n", | |
" case 1:\n", | |
" cursor = 'default';\n", | |
" break;\n", | |
" case 2:\n", | |
" cursor = 'crosshair';\n", | |
" break;\n", | |
" case 3:\n", | |
" cursor = 'move';\n", | |
" break;\n", | |
" }\n", | |
" fig.rubberband_canvas.style.cursor = cursor;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
" fig.message.textContent = msg['message'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
" // Request the server to send over a new figure.\n", | |
" fig.send_draw_message();\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
" fig.image_mode = msg['mode'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Called whenever the canvas gets updated.\n", | |
" this.send_message(\"ack\", {});\n", | |
"}\n", | |
"\n", | |
"// A function to construct a web socket function for onmessage handling.\n", | |
"// Called in the figure constructor.\n", | |
"mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
" return function socket_on_message(evt) {\n", | |
" if (evt.data instanceof Blob) {\n", | |
" /* FIXME: We get \"Resource interpreted as Image but\n", | |
" * transferred with MIME type text/plain:\" errors on\n", | |
" * Chrome. But how to set the MIME type? It doesn't seem\n", | |
" * to be part of the websocket stream */\n", | |
" evt.data.type = \"image/png\";\n", | |
"\n", | |
" /* Free the memory for the previous frames */\n", | |
" if (fig.imageObj.src) {\n", | |
" (window.URL || window.webkitURL).revokeObjectURL(\n", | |
" fig.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
" evt.data);\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
" fig.imageObj.src = evt.data;\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var msg = JSON.parse(evt.data);\n", | |
" var msg_type = msg['type'];\n", | |
"\n", | |
" // Call the \"handle_{type}\" callback, which takes\n", | |
" // the figure and JSON message as its only arguments.\n", | |
" try {\n", | |
" var callback = fig[\"handle_\" + msg_type];\n", | |
" } catch (e) {\n", | |
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" if (callback) {\n", | |
" try {\n", | |
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
" callback(fig, msg);\n", | |
" } catch (e) {\n", | |
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
" }\n", | |
" }\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
"mpl.findpos = function(e) {\n", | |
" //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
" var targ;\n", | |
" if (!e)\n", | |
" e = window.event;\n", | |
" if (e.target)\n", | |
" targ = e.target;\n", | |
" else if (e.srcElement)\n", | |
" targ = e.srcElement;\n", | |
" if (targ.nodeType == 3) // defeat Safari bug\n", | |
" targ = targ.parentNode;\n", | |
"\n", | |
" // jQuery normalizes the pageX and pageY\n", | |
" // pageX,Y are the mouse positions relative to the document\n", | |
" // offset() returns the position of the element relative to the document\n", | |
" var x = e.pageX - $(targ).offset().left;\n", | |
" var y = e.pageY - $(targ).offset().top;\n", | |
"\n", | |
" return {\"x\": x, \"y\": y};\n", | |
"};\n", | |
"\n", | |
"/*\n", | |
" * return a copy of an object with only non-object keys\n", | |
" * we need this to avoid circular references\n", | |
" * http://stackoverflow.com/a/24161582/3208463\n", | |
" */\n", | |
"function simpleKeys (original) {\n", | |
" return Object.keys(original).reduce(function (obj, key) {\n", | |
" if (typeof original[key] !== 'object')\n", | |
" obj[key] = original[key]\n", | |
" return obj;\n", | |
" }, {});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
" var canvas_pos = mpl.findpos(event)\n", | |
"\n", | |
" if (name === 'button_press')\n", | |
" {\n", | |
" this.canvas.focus();\n", | |
" this.canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" var x = canvas_pos.x;\n", | |
" var y = canvas_pos.y;\n", | |
"\n", | |
" this.send_message(name, {x: x, y: y, button: event.button,\n", | |
" step: event.step,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
"\n", | |
" /* This prevents the web browser from automatically changing to\n", | |
" * the text insertion cursor when the button is pressed. We want\n", | |
" * to control all of the cursor setting manually through the\n", | |
" * 'cursor' event from matplotlib */\n", | |
" event.preventDefault();\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" // Handle any extra behaviour associated with a key event\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.key_event = function(event, name) {\n", | |
"\n", | |
" // Prevent repeat events\n", | |
" if (name == 'key_press')\n", | |
" {\n", | |
" if (event.which === this._key)\n", | |
" return;\n", | |
" else\n", | |
" this._key = event.which;\n", | |
" }\n", | |
" if (name == 'key_release')\n", | |
" this._key = null;\n", | |
"\n", | |
" var value = '';\n", | |
" if (event.ctrlKey && event.which != 17)\n", | |
" value += \"ctrl+\";\n", | |
" if (event.altKey && event.which != 18)\n", | |
" value += \"alt+\";\n", | |
" if (event.shiftKey && event.which != 16)\n", | |
" value += \"shift+\";\n", | |
"\n", | |
" value += 'k';\n", | |
" value += event.which.toString();\n", | |
"\n", | |
" this._key_event_extra(event, name);\n", | |
"\n", | |
" this.send_message(name, {key: value,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
" if (name == 'download') {\n", | |
" this.handle_save(this, null);\n", | |
" } else {\n", | |
" this.send_message(\"toolbar_button\", {name: name});\n", | |
" }\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
" this.message.textContent = tooltip;\n", | |
"};\n", | |
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
"\n", | |
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
"\n", | |
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
" // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
" // object with the appropriate methods. Currently this is a non binary\n", | |
" // socket, so there is still some room for performance tuning.\n", | |
" var ws = {};\n", | |
"\n", | |
" ws.close = function() {\n", | |
" comm.close()\n", | |
" };\n", | |
" ws.send = function(m) {\n", | |
" //console.log('sending', m);\n", | |
" comm.send(m);\n", | |
" };\n", | |
" // Register the callback with on_msg.\n", | |
" comm.on_msg(function(msg) {\n", | |
" //console.log('receiving', msg['content']['data'], msg);\n", | |
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
" ws.onmessage(msg['content']['data'])\n", | |
" });\n", | |
" return ws;\n", | |
"}\n", | |
"\n", | |
"mpl.mpl_figure_comm = function(comm, msg) {\n", | |
" // This is the function which gets called when the mpl process\n", | |
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
"\n", | |
" var id = msg.content.data.id;\n", | |
" // Get hold of the div created by the display call when the Comm\n", | |
" // socket was opened in Python.\n", | |
" var element = $(\"#\" + id);\n", | |
" var ws_proxy = comm_websocket_adapter(comm)\n", | |
"\n", | |
" function ondownload(figure, format) {\n", | |
" window.open(figure.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" var fig = new mpl.figure(id, ws_proxy,\n", | |
" ondownload,\n", | |
" element.get(0));\n", | |
"\n", | |
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
" // web socket which is closed, not our websocket->open comm proxy.\n", | |
" ws_proxy.onopen();\n", | |
"\n", | |
" fig.parent_element = element.get(0);\n", | |
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
" if (!fig.cell_info) {\n", | |
" console.error(\"Failed to find cell for figure\", id, fig);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var output_index = fig.cell_info[2]\n", | |
" var cell = fig.cell_info[0];\n", | |
"\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
" fig.root.unbind('remove')\n", | |
"\n", | |
" // Update the output cell to use the data from the current canvas.\n", | |
" fig.push_to_output();\n", | |
" var dataURL = fig.canvas.toDataURL();\n", | |
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
" // the notebook keyboard shortcuts fail.\n", | |
" IPython.keyboard_manager.enable()\n", | |
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n", | |
" fig.close_ws(fig, msg);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
" fig.send_message('closing', msg);\n", | |
" // fig.ws.close()\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
" // Turn the data on the canvas into data in the output cell.\n", | |
" var dataURL = this.canvas.toDataURL();\n", | |
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Tell IPython that the notebook contents must change.\n", | |
" IPython.notebook.set_dirty(true);\n", | |
" this.send_message(\"ack\", {});\n", | |
" var fig = this;\n", | |
" // Wait a second, then push the new image to the DOM so\n", | |
" // that it is saved nicely (might be nice to debounce this).\n", | |
" setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items){\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) { continue; };\n", | |
"\n", | |
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" // Add the status bar.\n", | |
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"\n", | |
" // Add the close button to the window.\n", | |
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
" buttongrp.append(button);\n", | |
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
" titlebar.prepend(buttongrp);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(el){\n", | |
" var fig = this\n", | |
" el.on(\"remove\", function(){\n", | |
"\tfig.close_ws(fig, {});\n", | |
" });\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
" // this is important to make the div 'focusable\n", | |
" el.attr('tabindex', 0)\n", | |
" // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
" // off when our div gets focus\n", | |
"\n", | |
" // location in version 3\n", | |
" if (IPython.notebook.keyboard_manager) {\n", | |
" IPython.notebook.keyboard_manager.register_events(el);\n", | |
" }\n", | |
" else {\n", | |
" // location in version 2\n", | |
" IPython.keyboard_manager.register_events(el);\n", | |
" }\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" var manager = IPython.notebook.keyboard_manager;\n", | |
" if (!manager)\n", | |
" manager = IPython.keyboard_manager;\n", | |
"\n", | |
" // Check for shift+enter\n", | |
" if (event.shiftKey && event.which == 13) {\n", | |
" this.canvas_div.blur();\n", | |
" event.shiftKey = false;\n", | |
" // Send a \"J\" for go to next cell\n", | |
" event.which = 74;\n", | |
" event.keyCode = 74;\n", | |
" manager.command_mode();\n", | |
" manager.handle_keydown(event);\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" fig.ondownload(fig, null);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.find_output_cell = function(html_output) {\n", | |
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
" // IPython event is triggered only after the cells have been serialised, which for\n", | |
" // our purposes (turning an active figure into a static one), is too late.\n", | |
" var cells = IPython.notebook.get_cells();\n", | |
" var ncells = cells.length;\n", | |
" for (var i=0; i<ncells; i++) {\n", | |
" var cell = cells[i];\n", | |
" if (cell.cell_type === 'code'){\n", | |
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
" var data = cell.output_area.outputs[j];\n", | |
" if (data.data) {\n", | |
" // IPython >= 3 moved mimebundle to data attribute of output\n", | |
" data = data.data;\n", | |
" }\n", | |
" if (data['text/html'] == html_output) {\n", | |
" return [cell, data, j];\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"// Register the function which deals with the matplotlib target/channel.\n", | |
"// The kernel may be null if the page has been refreshed.\n", | |
"if (IPython.notebook.kernel != null) {\n", | |
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"data:image/png;base64,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mHllhYuIRMx8a/m1J7sffBglgPYE7+vVJ4BBELw7n89vLv+m7huMMSeMJ4AVaRQR+867nioBfKz6NTBKqauDILCXhf+71nqVlcRRAvh+rbW9j3D3pzznkfcINiKAq1ataunv798cRdHK3t7eTdVrpvoewKrcN483H8tWRJ40xvygfPn8PVrrt5TH/EuttX11TmUO7xQRe8oZ+77FZljfmCMITDUCEMCpVhGMBwRAYEICSqkziei8KIre0dvb23vwwQfPGxwcPFRE7hKRlcaYR8YQwOOJ6O1a69O7uroOiqLoe1rr5eVEGaWUfRXMBxv9GbqOjo6OTCbzexH5iH0ieQwBPLWRJ3wna2nYy9VBEHy08h7BKjFey8x/r7W2D9lUBPAHmUzmYxs3bixM1viQBwRAoHECEMDGGSICCIDAJBIoP8271p7gEdE2EVlCRPahkBOZuSOfz9vXutjTtT3ekVfu9xZm7heRsyuiaNvmcrl9giD4gn3Io9I/7pTs/XU7d+58v70vcboKYJnfV0Xk6YGBgc/buSilrPxdViwWj6lcwlZKnW/vZzTG3BuXF/qBAAikQwACmA53ZAUBEIhJoHx52N6v9wYRyRLRH5n5jvI9ffZderE+q1evzm7ZsuWo6vcBxgo0gzrZB1tE5GQiyorII0EQXGwvm5el+ZBSqbS5IoMzaNqYCgg0BQEIYFOUGZMEARAAARAAARAAgZcIQACxGkAABEAABEAABECgyQhAAJus4JguCIAACIAACIAACEAAsQZAAARAAARAAARAoMkIQACbrOCYLgiAAAiAAAiAAAhAALEGQAAEQAAEQAAEQKDJCEAAm6zgmC4IgAAIgAAIgAAIQACxBkAABEAABEAABECgyQhAAJus4JguCIAACIAACIAACEAAsQZAAARAAARAAARAoMkIQACbrOCYLgiAAAiAAAiAAAhAALEGQAAEQAAEQAAEQKDJCEAAm6zgmC4IgAAIgAAIgAAIQACxBkAABEAABEAABECgyQhAAJus4JguCIAACIAACIAACEAAsQZAAARAAARAAARAoMkIQACbrOCYLgiAAAiAAAiAAAhAALEGQAAEQAAEQAAEQKDJCEAAm6zgmC4IgAAIgAAIgAAIQACxBkAABEAABEAABECgyQhAAJus4JguCIAACIAACIAACPx/DkgslRoYjPYAAAAASUVORK5CYII=\">" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(1, 1)\n", | |
"ax.errorbar(np.log10(1e10*sfr_mvir[('Mvir', 'mean')]), sfr_mvir[('Sfr', 'mean')]*1e9,\n", | |
" yerr=sfr_mvir[('Sfr', 'std')]*1e9, marker='o', ms=15)\n", | |
"sns.axlabel(R'$\\log_{10}(M_{\\rm vir} h^{-1}/{\\rm M_{\\odot}})$', R'$M_{*} h^{-1}/{\\rm Gyr}$')\n", | |
"ax.set_yscale('log')\n", | |
"ax.text(0.05, 0.90, 'z=6', transform=ax.transAxes)\n", | |
"plt.tight_layout()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# SFR vs. M*" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 79, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"nbins = 20\n", | |
"edges = np.linspace(2, 13, nbins+1)\n", | |
"bins = g.groupby(pd.cut(np.log10(g.StellarMass*1e10), edges))\n", | |
"sfr_ms = bins.aggregate({'StellarMass': 'mean',\n", | |
" 'Sfr': ['mean', 'std']})\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 80, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"/* Put everything inside the global mpl namespace */\n", | |
"window.mpl = {};\n", | |
"\n", | |
"mpl.get_websocket_type = function() {\n", | |
" if (typeof(WebSocket) !== 'undefined') {\n", | |
" return WebSocket;\n", | |
" } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
" return MozWebSocket;\n", | |
" } else {\n", | |
" alert('Your browser does not have WebSocket support.' +\n", | |
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
" 'Firefox 4 and 5 are also supported but you ' +\n", | |
" 'have to enable WebSockets in about:config.');\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
" this.id = figure_id;\n", | |
"\n", | |
" this.ws = websocket;\n", | |
"\n", | |
" this.supports_binary = (this.ws.binaryType != undefined);\n", | |
"\n", | |
" if (!this.supports_binary) {\n", | |
" var warnings = document.getElementById(\"mpl-warnings\");\n", | |
" if (warnings) {\n", | |
" warnings.style.display = 'block';\n", | |
" warnings.textContent = (\n", | |
" \"This browser does not support binary websocket messages. \" +\n", | |
" \"Performance may be slow.\");\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.imageObj = new Image();\n", | |
"\n", | |
" this.context = undefined;\n", | |
" this.message = undefined;\n", | |
" this.canvas = undefined;\n", | |
" this.rubberband_canvas = undefined;\n", | |
" this.rubberband_context = undefined;\n", | |
" this.format_dropdown = undefined;\n", | |
"\n", | |
" this.image_mode = 'full';\n", | |
"\n", | |
" this.root = $('<div/>');\n", | |
" this._root_extra_style(this.root)\n", | |
" this.root.attr('style', 'display: inline-block');\n", | |
"\n", | |
" $(parent_element).append(this.root);\n", | |
"\n", | |
" this._init_header(this);\n", | |
" this._init_canvas(this);\n", | |
" this._init_toolbar(this);\n", | |
"\n", | |
" var fig = this;\n", | |
"\n", | |
" this.waiting = false;\n", | |
"\n", | |
" this.ws.onopen = function () {\n", | |
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
" fig.send_message(\"send_image_mode\", {});\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" }\n", | |
"\n", | |
" this.imageObj.onload = function() {\n", | |
" if (fig.image_mode == 'full') {\n", | |
" // Full images could contain transparency (where diff images\n", | |
" // almost always do), so we need to clear the canvas so that\n", | |
" // there is no ghosting.\n", | |
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
" }\n", | |
" fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
" };\n", | |
"\n", | |
" this.imageObj.onunload = function() {\n", | |
" this.ws.close();\n", | |
" }\n", | |
"\n", | |
" this.ws.onmessage = this._make_on_message_function(this);\n", | |
"\n", | |
" this.ondownload = ondownload;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_header = function() {\n", | |
" var titlebar = $(\n", | |
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
" 'ui-helper-clearfix\"/>');\n", | |
" var titletext = $(\n", | |
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
" 'text-align: center; padding: 3px;\"/>');\n", | |
" titlebar.append(titletext)\n", | |
" this.root.append(titlebar);\n", | |
" this.header = titletext[0];\n", | |
"}\n", | |
"\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_canvas = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var canvas_div = $('<div/>');\n", | |
"\n", | |
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
"\n", | |
" function canvas_keyboard_event(event) {\n", | |
" return fig.key_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
" canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
" this.canvas_div = canvas_div\n", | |
" this._canvas_extra_style(canvas_div)\n", | |
" this.root.append(canvas_div);\n", | |
"\n", | |
" var canvas = $('<canvas/>');\n", | |
" canvas.addClass('mpl-canvas');\n", | |
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
"\n", | |
" this.canvas = canvas[0];\n", | |
" this.context = canvas[0].getContext(\"2d\");\n", | |
"\n", | |
" var rubberband = $('<canvas/>');\n", | |
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
"\n", | |
" var pass_mouse_events = true;\n", | |
"\n", | |
" canvas_div.resizable({\n", | |
" start: function(event, ui) {\n", | |
" pass_mouse_events = false;\n", | |
" },\n", | |
" resize: function(event, ui) {\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" stop: function(event, ui) {\n", | |
" pass_mouse_events = true;\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" });\n", | |
"\n", | |
" function mouse_event_fn(event) {\n", | |
" if (pass_mouse_events)\n", | |
" return fig.mouse_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" rubberband.mousedown('button_press', mouse_event_fn);\n", | |
" rubberband.mouseup('button_release', mouse_event_fn);\n", | |
" // Throttle sequential mouse events to 1 every 20ms.\n", | |
" rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
"\n", | |
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
"\n", | |
" canvas_div.on(\"wheel\", function (event) {\n", | |
" event = event.originalEvent;\n", | |
" event['data'] = 'scroll'\n", | |
" if (event.deltaY < 0) {\n", | |
" event.step = 1;\n", | |
" } else {\n", | |
" event.step = -1;\n", | |
" }\n", | |
" mouse_event_fn(event);\n", | |
" });\n", | |
"\n", | |
" canvas_div.append(canvas);\n", | |
" canvas_div.append(rubberband);\n", | |
"\n", | |
" this.rubberband = rubberband;\n", | |
" this.rubberband_canvas = rubberband[0];\n", | |
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
" this.rubberband_context.strokeStyle = \"#000000\";\n", | |
"\n", | |
" this._resize_canvas = function(width, height) {\n", | |
" // Keep the size of the canvas, canvas container, and rubber band\n", | |
" // canvas in synch.\n", | |
" canvas_div.css('width', width)\n", | |
" canvas_div.css('height', height)\n", | |
"\n", | |
" canvas.attr('width', width);\n", | |
" canvas.attr('height', height);\n", | |
"\n", | |
" rubberband.attr('width', width);\n", | |
" rubberband.attr('height', height);\n", | |
" }\n", | |
"\n", | |
" // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
" // upon first draw.\n", | |
" this._resize_canvas(600, 600);\n", | |
"\n", | |
" // Disable right mouse context menu.\n", | |
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
" return false;\n", | |
" });\n", | |
"\n", | |
" function set_focus () {\n", | |
" canvas.focus();\n", | |
" canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" window.setTimeout(set_focus, 100);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items) {\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) {\n", | |
" // put a spacer in here.\n", | |
" continue;\n", | |
" }\n", | |
" var button = $('<button/>');\n", | |
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
" 'ui-button-icon-only');\n", | |
" button.attr('role', 'button');\n", | |
" button.attr('aria-disabled', 'false');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
"\n", | |
" var icon_img = $('<span/>');\n", | |
" icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
" icon_img.addClass(image);\n", | |
" icon_img.addClass('ui-corner-all');\n", | |
"\n", | |
" var tooltip_span = $('<span/>');\n", | |
" tooltip_span.addClass('ui-button-text');\n", | |
" tooltip_span.html(tooltip);\n", | |
"\n", | |
" button.append(icon_img);\n", | |
" button.append(tooltip_span);\n", | |
"\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" var fmt_picker_span = $('<span/>');\n", | |
"\n", | |
" var fmt_picker = $('<select/>');\n", | |
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
" fmt_picker_span.append(fmt_picker);\n", | |
" nav_element.append(fmt_picker_span);\n", | |
" this.format_dropdown = fmt_picker[0];\n", | |
"\n", | |
" for (var ind in mpl.extensions) {\n", | |
" var fmt = mpl.extensions[ind];\n", | |
" var option = $(\n", | |
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
" fmt_picker.append(option)\n", | |
" }\n", | |
"\n", | |
" // Add hover states to the ui-buttons\n", | |
" $( \".ui-button\" ).hover(\n", | |
" function() { $(this).addClass(\"ui-state-hover\");},\n", | |
" function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
" );\n", | |
"\n", | |
" var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
" // which will in turn request a refresh of the image.\n", | |
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_message = function(type, properties) {\n", | |
" properties['type'] = type;\n", | |
" properties['figure_id'] = this.id;\n", | |
" this.ws.send(JSON.stringify(properties));\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_draw_message = function() {\n", | |
" if (!this.waiting) {\n", | |
" this.waiting = true;\n", | |
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" var format_dropdown = fig.format_dropdown;\n", | |
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
" fig.ondownload(fig, format);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
" var size = msg['size'];\n", | |
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
" fig._resize_canvas(size[0], size[1]);\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
" var x0 = msg['x0'];\n", | |
" var y0 = fig.canvas.height - msg['y0'];\n", | |
" var x1 = msg['x1'];\n", | |
" var y1 = fig.canvas.height - msg['y1'];\n", | |
" x0 = Math.floor(x0) + 0.5;\n", | |
" y0 = Math.floor(y0) + 0.5;\n", | |
" x1 = Math.floor(x1) + 0.5;\n", | |
" y1 = Math.floor(y1) + 0.5;\n", | |
" var min_x = Math.min(x0, x1);\n", | |
" var min_y = Math.min(y0, y1);\n", | |
" var width = Math.abs(x1 - x0);\n", | |
" var height = Math.abs(y1 - y0);\n", | |
"\n", | |
" fig.rubberband_context.clearRect(\n", | |
" 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
"\n", | |
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
" // Updates the figure title.\n", | |
" fig.header.textContent = msg['label'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
" var cursor = msg['cursor'];\n", | |
" switch(cursor)\n", | |
" {\n", | |
" case 0:\n", | |
" cursor = 'pointer';\n", | |
" break;\n", | |
" case 1:\n", | |
" cursor = 'default';\n", | |
" break;\n", | |
" case 2:\n", | |
" cursor = 'crosshair';\n", | |
" break;\n", | |
" case 3:\n", | |
" cursor = 'move';\n", | |
" break;\n", | |
" }\n", | |
" fig.rubberband_canvas.style.cursor = cursor;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
" fig.message.textContent = msg['message'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
" // Request the server to send over a new figure.\n", | |
" fig.send_draw_message();\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
" fig.image_mode = msg['mode'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Called whenever the canvas gets updated.\n", | |
" this.send_message(\"ack\", {});\n", | |
"}\n", | |
"\n", | |
"// A function to construct a web socket function for onmessage handling.\n", | |
"// Called in the figure constructor.\n", | |
"mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
" return function socket_on_message(evt) {\n", | |
" if (evt.data instanceof Blob) {\n", | |
" /* FIXME: We get \"Resource interpreted as Image but\n", | |
" * transferred with MIME type text/plain:\" errors on\n", | |
" * Chrome. But how to set the MIME type? It doesn't seem\n", | |
" * to be part of the websocket stream */\n", | |
" evt.data.type = \"image/png\";\n", | |
"\n", | |
" /* Free the memory for the previous frames */\n", | |
" if (fig.imageObj.src) {\n", | |
" (window.URL || window.webkitURL).revokeObjectURL(\n", | |
" fig.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
" evt.data);\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
" fig.imageObj.src = evt.data;\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var msg = JSON.parse(evt.data);\n", | |
" var msg_type = msg['type'];\n", | |
"\n", | |
" // Call the \"handle_{type}\" callback, which takes\n", | |
" // the figure and JSON message as its only arguments.\n", | |
" try {\n", | |
" var callback = fig[\"handle_\" + msg_type];\n", | |
" } catch (e) {\n", | |
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" if (callback) {\n", | |
" try {\n", | |
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
" callback(fig, msg);\n", | |
" } catch (e) {\n", | |
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
" }\n", | |
" }\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
"mpl.findpos = function(e) {\n", | |
" //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
" var targ;\n", | |
" if (!e)\n", | |
" e = window.event;\n", | |
" if (e.target)\n", | |
" targ = e.target;\n", | |
" else if (e.srcElement)\n", | |
" targ = e.srcElement;\n", | |
" if (targ.nodeType == 3) // defeat Safari bug\n", | |
" targ = targ.parentNode;\n", | |
"\n", | |
" // jQuery normalizes the pageX and pageY\n", | |
" // pageX,Y are the mouse positions relative to the document\n", | |
" // offset() returns the position of the element relative to the document\n", | |
" var x = e.pageX - $(targ).offset().left;\n", | |
" var y = e.pageY - $(targ).offset().top;\n", | |
"\n", | |
" return {\"x\": x, \"y\": y};\n", | |
"};\n", | |
"\n", | |
"/*\n", | |
" * return a copy of an object with only non-object keys\n", | |
" * we need this to avoid circular references\n", | |
" * http://stackoverflow.com/a/24161582/3208463\n", | |
" */\n", | |
"function simpleKeys (original) {\n", | |
" return Object.keys(original).reduce(function (obj, key) {\n", | |
" if (typeof original[key] !== 'object')\n", | |
" obj[key] = original[key]\n", | |
" return obj;\n", | |
" }, {});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
" var canvas_pos = mpl.findpos(event)\n", | |
"\n", | |
" if (name === 'button_press')\n", | |
" {\n", | |
" this.canvas.focus();\n", | |
" this.canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" var x = canvas_pos.x;\n", | |
" var y = canvas_pos.y;\n", | |
"\n", | |
" this.send_message(name, {x: x, y: y, button: event.button,\n", | |
" step: event.step,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
"\n", | |
" /* This prevents the web browser from automatically changing to\n", | |
" * the text insertion cursor when the button is pressed. We want\n", | |
" * to control all of the cursor setting manually through the\n", | |
" * 'cursor' event from matplotlib */\n", | |
" event.preventDefault();\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" // Handle any extra behaviour associated with a key event\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.key_event = function(event, name) {\n", | |
"\n", | |
" // Prevent repeat events\n", | |
" if (name == 'key_press')\n", | |
" {\n", | |
" if (event.which === this._key)\n", | |
" return;\n", | |
" else\n", | |
" this._key = event.which;\n", | |
" }\n", | |
" if (name == 'key_release')\n", | |
" this._key = null;\n", | |
"\n", | |
" var value = '';\n", | |
" if (event.ctrlKey && event.which != 17)\n", | |
" value += \"ctrl+\";\n", | |
" if (event.altKey && event.which != 18)\n", | |
" value += \"alt+\";\n", | |
" if (event.shiftKey && event.which != 16)\n", | |
" value += \"shift+\";\n", | |
"\n", | |
" value += 'k';\n", | |
" value += event.which.toString();\n", | |
"\n", | |
" this._key_event_extra(event, name);\n", | |
"\n", | |
" this.send_message(name, {key: value,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
" if (name == 'download') {\n", | |
" this.handle_save(this, null);\n", | |
" } else {\n", | |
" this.send_message(\"toolbar_button\", {name: name});\n", | |
" }\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
" this.message.textContent = tooltip;\n", | |
"};\n", | |
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
"\n", | |
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
"\n", | |
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
" // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
" // object with the appropriate methods. Currently this is a non binary\n", | |
" // socket, so there is still some room for performance tuning.\n", | |
" var ws = {};\n", | |
"\n", | |
" ws.close = function() {\n", | |
" comm.close()\n", | |
" };\n", | |
" ws.send = function(m) {\n", | |
" //console.log('sending', m);\n", | |
" comm.send(m);\n", | |
" };\n", | |
" // Register the callback with on_msg.\n", | |
" comm.on_msg(function(msg) {\n", | |
" //console.log('receiving', msg['content']['data'], msg);\n", | |
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
" ws.onmessage(msg['content']['data'])\n", | |
" });\n", | |
" return ws;\n", | |
"}\n", | |
"\n", | |
"mpl.mpl_figure_comm = function(comm, msg) {\n", | |
" // This is the function which gets called when the mpl process\n", | |
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
"\n", | |
" var id = msg.content.data.id;\n", | |
" // Get hold of the div created by the display call when the Comm\n", | |
" // socket was opened in Python.\n", | |
" var element = $(\"#\" + id);\n", | |
" var ws_proxy = comm_websocket_adapter(comm)\n", | |
"\n", | |
" function ondownload(figure, format) {\n", | |
" window.open(figure.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" var fig = new mpl.figure(id, ws_proxy,\n", | |
" ondownload,\n", | |
" element.get(0));\n", | |
"\n", | |
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
" // web socket which is closed, not our websocket->open comm proxy.\n", | |
" ws_proxy.onopen();\n", | |
"\n", | |
" fig.parent_element = element.get(0);\n", | |
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
" if (!fig.cell_info) {\n", | |
" console.error(\"Failed to find cell for figure\", id, fig);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var output_index = fig.cell_info[2]\n", | |
" var cell = fig.cell_info[0];\n", | |
"\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
" fig.root.unbind('remove')\n", | |
"\n", | |
" // Update the output cell to use the data from the current canvas.\n", | |
" fig.push_to_output();\n", | |
" var dataURL = fig.canvas.toDataURL();\n", | |
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
" // the notebook keyboard shortcuts fail.\n", | |
" IPython.keyboard_manager.enable()\n", | |
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n", | |
" fig.close_ws(fig, msg);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
" fig.send_message('closing', msg);\n", | |
" // fig.ws.close()\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
" // Turn the data on the canvas into data in the output cell.\n", | |
" var dataURL = this.canvas.toDataURL();\n", | |
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Tell IPython that the notebook contents must change.\n", | |
" IPython.notebook.set_dirty(true);\n", | |
" this.send_message(\"ack\", {});\n", | |
" var fig = this;\n", | |
" // Wait a second, then push the new image to the DOM so\n", | |
" // that it is saved nicely (might be nice to debounce this).\n", | |
" setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items){\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) { continue; };\n", | |
"\n", | |
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" // Add the status bar.\n", | |
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"\n", | |
" // Add the close button to the window.\n", | |
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
" buttongrp.append(button);\n", | |
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
" titlebar.prepend(buttongrp);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(el){\n", | |
" var fig = this\n", | |
" el.on(\"remove\", function(){\n", | |
"\tfig.close_ws(fig, {});\n", | |
" });\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
" // this is important to make the div 'focusable\n", | |
" el.attr('tabindex', 0)\n", | |
" // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
" // off when our div gets focus\n", | |
"\n", | |
" // location in version 3\n", | |
" if (IPython.notebook.keyboard_manager) {\n", | |
" IPython.notebook.keyboard_manager.register_events(el);\n", | |
" }\n", | |
" else {\n", | |
" // location in version 2\n", | |
" IPython.keyboard_manager.register_events(el);\n", | |
" }\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" var manager = IPython.notebook.keyboard_manager;\n", | |
" if (!manager)\n", | |
" manager = IPython.keyboard_manager;\n", | |
"\n", | |
" // Check for shift+enter\n", | |
" if (event.shiftKey && event.which == 13) {\n", | |
" this.canvas_div.blur();\n", | |
" event.shiftKey = false;\n", | |
" // Send a \"J\" for go to next cell\n", | |
" event.which = 74;\n", | |
" event.keyCode = 74;\n", | |
" manager.command_mode();\n", | |
" manager.handle_keydown(event);\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" fig.ondownload(fig, null);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.find_output_cell = function(html_output) {\n", | |
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
" // IPython event is triggered only after the cells have been serialised, which for\n", | |
" // our purposes (turning an active figure into a static one), is too late.\n", | |
" var cells = IPython.notebook.get_cells();\n", | |
" var ncells = cells.length;\n", | |
" for (var i=0; i<ncells; i++) {\n", | |
" var cell = cells[i];\n", | |
" if (cell.cell_type === 'code'){\n", | |
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
" var data = cell.output_area.outputs[j];\n", | |
" if (data.data) {\n", | |
" // IPython >= 3 moved mimebundle to data attribute of output\n", | |
" data = data.data;\n", | |
" }\n", | |
" if (data['text/html'] == html_output) {\n", | |
" return [cell, data, j];\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"// Register the function which deals with the matplotlib target/channel.\n", | |
"// The kernel may be null if the page has been refreshed.\n", | |
"if (IPython.notebook.kernel != null) {\n", | |
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4Xuy9e3wU9b3///rsLgmEEAJJQCDhnpmEEKvQIkVbBbHipWp71Creb61a23PsOdX6/Vb789Tacjztqa3V2mI5KrT92dMj9VaVilURAQUtkGRnEq5yFSIQrrnszvfxSUh2N9nNXHayu7N5zT+t7Psz857X5/15f555z8znI8CDClABKkAFqAAVoAJUoF8pIPrV3fJmqQAVoAJUgApQASpABUAAZBBQASpABagAFaACVKCfKUAA7GcdztulAlSAClABKkAFqAABkDFABagAFaACVIAKUIF+pgABsJ91OG+XClABKkAFqAAVoAIEQMYAFaACVIAKUAEqQAX6mQIEwH7W4bxdKkAFqAAVoAJUgAoQABkDVIAKUAEqQAWoABXoZwoQAPtZh/N2qQAVoAJUgApQASpAAGQMUAEqQAWoABWgAlSgnylAAOxnHc7bpQJUgApQASpABagAAZAxQAWoABWgAlSAClCBfqYAAbCfdThvlwpQASpABagAFaACBEDGABWgAlSAClABKkAF+pkCBMB+1uG8XSpABagAFaACVIAKEAAZA1SAClABKkAFqAAV6GcKEAD7WYfzdqkAFaACVIAKUAEqQABkDFABKkAFqAAVoAJUoJ8pQADsZx3O26UCVIAKUAEqQAWoQL8GwMrKyqnhcHipYRi/0HX9FzIcVFX9DwBnAfCHw+H/qK+v/zPDhApQASpABagAFaAC2aRAvwXA0aNH5+Xn578khNANw6iVAFhRUXFOOBy+R9f1C6uqqoa3trZu0HV9TDZ1OO+FClABKkAFqAAVoAL9FgAB+MrLywf4fL7vGYZx4GQFUJSVlQ38+OOPj8vfFUXZp+v6CAAhhgoVoAJUgApQASpABbJFgf4MgO19qKrqD6IAsKtfFUX5uhDibE3TrsmWzuZ9UAEqQAWoABWgAlRAKuB5ACwvL5/i8/mWSJbTNC0vulurqqry29rafglgrmEYA4UQqwB8W9O0LZ128QBQVdVLDcP4v21tbedt3rz5EEOFClABKkAFqAAVoALZpICnAVBV1SsMw/g5gHeEEJd0B0BVVSUYlhmGcbXP52syDOOnAM7UNG0qACNeBbCiouJ8wzD+PScnZ96GDRsOZFNn816oABWgAlSAClABKuD5CmB5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\">" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(1, 1)\n", | |
"ax.errorbar(np.log10(1e10*sfr_ms[('StellarMass', 'mean')]), sfr_ms[('Sfr', 'mean')]*1e9,\n", | |
" yerr=sfr_ms[('Sfr', 'std')]*1e9, marker='o', ms=15)\n", | |
"sns.axlabel(R'$\\log_{10}(M_{*} h^{-1}/{\\rm M_{\\odot}})$', R'$M_{*} h^{-1}/{\\rm Gyr}$')\n", | |
"ax.set_yscale('log')\n", | |
"ax.text(0.05, 0.90, 'z=6', transform=ax.transAxes)\n", | |
"plt.tight_layout()" | |
] | |
} | |
], | |
"metadata": { | |
"hide_input": false, | |
"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.5.1" | |
}, | |
"latex_envs": { | |
"bibliofile": "biblio.bib", | |
"cite_by": "apalike", | |
"current_citInitial": 1, | |
"eqLabelWithNumbers": true, | |
"eqNumInitial": 0 | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment