cantera-jupyter-test/reactors/stirred_reactor.ipynb
Santosh Shanbhogue 118dd56071 Add continuous reactor example
Resolves #6
2016-09-20 18:52:31 -04:00

2152 lines
195 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Continuous Reactor Example \n",
"### Simulation of a CSTR/PSR/WSR \n",
"\n",
"In this example we will illustrate how Cantera can be used to simulate a Continuously Stirred Tank Reactor (CSTR), also interchangeably referred to as a Perfectly Stirred Reactor or a Well Stirred Reactor, a Jet Stirred Reactor or a Longwell Reactor (there may well be more \"aliases\"). A cartoon of such a reactor is shown below\n",
"\n",
"<img src=\"images/stirredReactorCartoon.png\" alt=\"Cartoon of a Stirred Reactor\" style=\"width: 300px;\"/>\n",
"\n",
"As the figure illustrates, this is an open system (unlike a Batch Reactor which is isolated). P, V and T are the reactor's pressure, volume and temperature respectively. The mass flow rate at which reactants come in is the same as that of the products which exit; and these stay in the reactor for a characteristic time $\\tau$, called the *residence time*. This is a key quantity in sizing the reactor and is defined as follows:\n",
"\n",
"\\begin{equation*}\n",
"\\tau = \\frac{m}{\\dot{m}}\n",
"\\end{equation*}\n",
"\n",
"where $m$ is the mass of the gas"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Running Cantera version: 2.3.0a2\n"
]
}
],
"source": [
"from __future__ import division\n",
"from __future__ import print_function\n",
"\n",
"import pandas as pd\n",
"import numpy as np\n",
"import time\n",
"import cantera as ct\n",
"\n",
"print(\"Running Cantera version: {}\".format(ct.__version__))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Define the gas\n",
"In this example, we will work with $nC\n",
"_{7}H_{16}$/$O_{2}$/$He$ mixtures, for which experimental data can be found in the paper by [Zhang et al.](http://dx.doi.org/10.1016/j.combustflame.2015.08.001). We will use the same mechanism reported in the paper. It consists of 1268 species and 5336 reactions"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n",
"**** WARNING ****\n",
"For species OHV, discontinuity in h/RT detected at Tmid = 1000\n",
"\tValue computed using low-temperature polynomial: 53.6206\n",
"\tValue computed using high-temperature polynomial: 53.5842\n",
"\n",
"\n",
"**** WARNING ****\n",
"For species CHV, discontinuity in h/RT detected at Tmid = 1000\n",
"\tValue computed using low-temperature polynomial: 107.505\n",
"\tValue computed using high-temperature polynomial: 107.348\n",
"\n",
"\n",
"**** WARNING ****\n",
"For species CH2CO, discontinuity in cp/R detected at Tmid = 1000\n",
"\tValue computed using low-temperature polynomial: 10.0876\n",
"\tValue computed using high-temperature polynomial: 10.1013\n",
"\n",
"\n",
"**** WARNING ****\n",
"For species C5H9B-A,COOH, discontinuity in cp/R detected at Tmid = 1675\n",
"\tValue computed using low-temperature polynomial: 47.645\n",
"\tValue computed using high-temperature polynomial: 47.5845\n",
"\n",
"\n",
"**** WARNING ****\n",
"For species C5H9B-C,DOOH, discontinuity in cp/R detected at Tmid = 1675\n",
"\tValue computed using low-temperature polynomial: 47.645\n",
"\tValue computed using high-temperature polynomial: 47.5845\n",
"\n",
"\n",
"**** WARNING ****\n",
"For species C5H9C-A,AOOH, discontinuity in cp/R detected at Tmid = 1681\n",
"\tValue computed using low-temperature polynomial: 48.5491\n",
"\tValue computed using high-temperature polynomial: 48.4914\n",
"\n",
"\n",
"**** WARNING ****\n",
"For species C5H9C-A,DOOH, discontinuity in cp/R detected at Tmid = 1681\n",
"\tValue computed using low-temperature polynomial: 48.5491\n",
"\tValue computed using high-temperature polynomial: 48.4914\n"
]
}
],
"source": [
"gas = ct.Solution('data/galway.cti')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Define initial conditions\n",
"#### Inlet conditions for the gas and reactor parameters"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Inlet gas conditions\n",
"reactorTemperature = 925 #Kelvin\n",
"reactorPressure = 1.046138*ct.one_atm #in atm. This equals 1.06 bars\n",
"concentrations = {'NC7H16': 0.005, 'O2': 0.0275, 'HE': 0.9675}\n",
"gas.TPX = reactorTemperature, reactorPressure, concentrations \n",
"\n",
"# Reactor parameters\n",
"residenceTime = 2 #s\n",
"reactorVolume = 30.5*(1e-2)**3 #m3\n",
"\n",
"# Instrument parameters\n",
"\n",
"# This is the \"conductance\" of the pressure valve and will determine its efficiency in \n",
"# holding the reactor pressure to the desired conditions. \n",
"pressureValveCoefficient = 0.01\n",
"\n",
"# This parameter will allow you to decide if the valve's conductance is acceptable. If there\n",
"# is a pressure rise in the reactor beyond this tolerance, you will get a warning\n",
"maxPressureRiseAllowed = 0.01"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Simulation parameters"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Simulation termination criterion\n",
"maxSimulationTime = 50 # seconds"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Reactor arrangement\n",
"\n",
"We showed a cartoon of the reactor in the first figure in this notebook; but to actually simulate that, we need a few peripherals. A mass-flow controller upstream of the stirred reactor will allow us to flow gases in, and in-turn, a \"reservoir\" which simulates a gas tank is required to supply gases to the mass flow controller. Downstream of the reactor, we install a pressure regulator which allows the reactor pressure to stay within. Downstream of the regulator we will need another reservoir which acts like a \"sink\" or capture tank to capture all exhaust gases (even our simulations are environmentally friendly !). This arrangment is illustrated below\n",
"\n",
"<img src=\"images/stirredReactorCanteraSimulation.png\" alt=\"Cartoon of a Stirred Reactor\" style=\"width: 600px;\"/>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Initialize the stirred reactor and connect all peripherals"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"fuelAirMixtureTank = ct.Reservoir(gas)\n",
"exhaust = ct.Reservoir(gas)\n",
"\n",
"stirredReactor = ct.IdealGasReactor(gas, energy='off', volume=reactorVolume)\n",
"\n",
"massFlowController = ct.MassFlowController(upstream=fuelAirMixtureTank,\n",
" downstream=stirredReactor,\n",
" mdot=stirredReactor.mass/residenceTime)\n",
"\n",
"pressureRegulator = ct.Valve(upstream=stirredReactor,\n",
" downstream=exhaust,\n",
" K=pressureValveCoefficient)\n",
"\n",
"reactorNetwork = ct.ReactorNet([stirredReactor])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# now compile a list of all variables for which we will store data\n",
"columnNames = [stirredReactor.component_name(item) for item in range(stirredReactor.n_vars)]\n",
"columnNames = ['pressure'] + columnNames\n",
"\n",
"# use the above list to create a DataFrame\n",
"timeHistory = pd.DataFrame(columns=columnNames)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Simulation Took 80.92s to compute, with 1264 steps\n"
]
}
],
"source": [
"# Start the stopwatch\n",
"tic = time.time()\n",
"\n",
"# Set simulation start time to zero\n",
"t = 0\n",
"counter = 1\n",
"while t < maxSimulationTime:\n",
" t = reactorNetwork.step()\n",
"\n",
" # We will store only every 10th value. Remember, we have 1200+ species, so there will be\n",
" # 1200 columns for us to work with\n",
" if(counter%10 == 0):\n",
" #Extract the state of the reactor\n",
" state = np.hstack([stirredReactor.thermo.P, stirredReactor.mass, \n",
" stirredReactor.volume, stirredReactor.T, stirredReactor.thermo.X])\n",
" \n",
" #Update the dataframe\n",
" timeHistory.loc[t] = state\n",
" \n",
" counter += 1\n",
"\n",
"# Stop the stopwatch\n",
"toc = time.time()\n",
"\n",
"print('Simulation Took {:3.2f}s to compute, with {} steps'.format(toc-tic, counter))\n",
"\n",
"# We now check to see if the pressure rise during the simulation, a.k.a the pressure valve\n",
"# was okay\n",
"pressureDifferential = timeHistory['pressure'].max()-timeHistory['pressure'].min()\n",
"if(abs(pressureDifferential/reactorPressure) > maxPressureRiseAllowed):\n",
" print(\"WARNING: Non-trivial pressure rise in the reactor. Adjust K value in valve\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot the results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Import modules and set plotting defaults"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib as mpl\n",
"%matplotlib notebook\n",
"\n",
"plt.style.use('ggplot')\n",
"plt.style.use('seaborn-pastel')\n",
"\n",
"plt.rcParams['axes.labelsize'] = 18\n",
"plt.rcParams['xtick.labelsize'] = 14\n",
"plt.rcParams['ytick.labelsize'] = 14\n",
"plt.rcParams['figure.autolayout'] = True"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As a test, we plot the mole fraction of $CO$ and see if the simulation has converged. If not, go back and adjust max. number of steps and/or simulation time"
]
},
{
"cell_type": "code",
"execution_count": 9,
"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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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": [
"plt.figure()\n",
"plt.semilogx(timeHistory.index, timeHistory['CO'],'-o')\n",
"plt.xlabel('Time (s)')\n",
"plt.ylabel(r'Mole Fraction : $X_{CO}$');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Illustration : Modeling experimental data\n",
"### Let us see if the reactor can reproduce actual experimental measurements\n",
"\n",
"We first load the data. This is also supplied in the paper by [Zhang et al.](http://dx.doi.org/10.1016/j.combustflame.2015.08.001) as an excel sheet"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>T</th>\n",
" <th>NC7H16</th>\n",
" <th>O2</th>\n",
" <th>CO</th>\n",
" <th>CO2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>500</td>\n",
" <td>0.00507</td>\n",
" <td>0.0293</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>525</td>\n",
" <td>0.00492</td>\n",
" <td>0.0286</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>550</td>\n",
" <td>0.00466</td>\n",
" <td>0.0285</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>575</td>\n",
" <td>0.00416</td>\n",
" <td>0.0263</td>\n",
" <td>0.000243</td>\n",
" <td>0.000101</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>600</td>\n",
" <td>0.00355</td>\n",
" <td>0.0233</td>\n",
" <td>0.000968</td>\n",
" <td>0.000251</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" T NC7H16 O2 CO CO2\n",
"0 500 0.00507 0.0293 0.000000 0.000000\n",
"1 525 0.00492 0.0286 0.000000 0.000000\n",
"2 550 0.00466 0.0285 0.000000 0.000000\n",
"3 575 0.00416 0.0263 0.000243 0.000101\n",
"4 600 0.00355 0.0233 0.000968 0.000251"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"expData = pd.read_csv('data/zhangExpData.csv')\n",
"expData.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Define all the temperatures at which we will run simulations. These should overlap\n",
"# with the values reported in the paper as much as possible\n",
"T = [650, 700, 750, 775, 825, 850, 875, 925, 950, 1075, 1100]\n",
"\n",
"# Create a data frame to store values for the above points\n",
"tempDependence = pd.DataFrame(columns=timeHistory.columns)\n",
"tempDependence.index.name = 'Temperature'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we simply run the reactor code we used above for each temperature"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Simulation at T=650K took 58.23s to compute\n",
"Simulation at T=700K took 100.27s to compute\n",
"Simulation at T=750K took 28.14s to compute\n",
"Simulation at T=775K took 41.86s to compute\n",
"Simulation at T=825K took 47.44s to compute\n",
"Simulation at T=850K took 48.12s to compute\n",
"Simulation at T=875K took 40.04s to compute\n",
"Simulation at T=925K took 45.77s to compute\n",
"Simulation at T=950K took 31.00s to compute\n",
"Simulation at T=1075K took 59.79s to compute\n",
"Simulation at T=1100K took 36.80s to compute\n"
]
}
],
"source": [
"inletConcentrations = {'NC7H16': 0.005, 'O2': 0.0275, 'HE': 0.9675}\n",
"concentrations = inletConcentrations\n",
"\n",
"for temperature in T:\n",
" #Re-initialize the gas\n",
" reactorTemperature = temperature #Kelvin\n",
" reactorPressure = 1.046138*ct.one_atm #in atm. This equals 1.06 bars\n",
" reactorVolume = 30.5*(1e-2)**3 #m3\n",
"\n",
" gas.TPX = reactorTemperature, reactorPressure, inletConcentrations\n",
"\n",
" # Re-initialize the dataframe used to hold values\n",
" timeHistory = pd.DataFrame(columns=columnNames)\n",
" \n",
" # Re-initialize all the reactors, reservoirs, etc\n",
" fuelAirMixtureTank = ct.Reservoir(gas)\n",
" exhaust = ct.Reservoir(gas)\n",
" \n",
" # We will use concentrations from the previous iteration to speed up convergence\n",
" gas.TPX = reactorTemperature, reactorPressure, concentrations\n",
" \n",
" stirredReactor = ct.IdealGasReactor(gas, energy='off', volume=reactorVolume)\n",
" massFlowController = ct.MassFlowController(upstream=fuelAirMixtureTank,\n",
" downstream=stirredReactor,\n",
" mdot=stirredReactor.mass/residenceTime)\n",
" pressureRegulator = ct.Valve(upstream=stirredReactor, \n",
" downstream=exhaust, \n",
" K=pressureValveCoefficient)\n",
" reactorNetwork = ct.ReactorNet([stirredReactor])\n",
" \n",
" # Re-run the isothermal simulations\n",
" tic = time.time()\n",
" t = 0\n",
" while t < maxSimulationTime:\n",
" t = reactorNetwork.step()\n",
" \n",
" state = np.hstack([stirredReactor.thermo.P, \n",
" stirredReactor.mass, \n",
" stirredReactor.volume, \n",
" stirredReactor.T, \n",
" stirredReactor.thermo.X])\n",
"\n",
" toc = time.time()\n",
" print('Simulation at T={}K took {:3.2f}s to compute'.format(temperature, toc-tic))\n",
" \n",
" concentrations = stirredReactor.thermo.X\n",
" \n",
" # Store the result in the dataframe that indexes by temperature\n",
" tempDependence.loc[temperature] = state\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Compare the model results with experimental data"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c6QAAQABJREFUeAHsnQmcjdX/x79jZywzdilkKSJbSVmi/MtS9lBE/JQUqWSJsktEiVIhCRFClqzZo02hxZJKabPP2Mfu//me5pmeGXeWO3d97v2c1+vMeZ7znPV97tz7fb7nnO8RoSMBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkiJQERKDwP9rE2bNqUuX778BtpRG/5sRETE3Li4uN5Lliw5k1rbWrVq1QBpXoK/CX7/lStXxs+bN+91e74HHnjgTZR5N+Kuhb8C/xPux86dO/dDezq9Rnk9EXSHLwK/A77fRx999ClCOhIgARIgARIgARJwFIEMwdradu3a5Ybwtw7ti4Lw1hKCWQ8Ns2XLNi21Nrds2bI60ixC+u0IGyB8B/lHt27dups9L+KywY/H8+bwrfBsG8KZSPewPV288DcSad+KL+9HhEtQTxV7Ol6TAAmQAAmQAAmQgBMIBK0GENq5PhC4Bl28eLHYxx9/fFRhQhBrjmA+BMNb5s+fvy05wEi3DM/yQ0N3m5UG5Y1DeW1xXxjxl6z4pCHybkLcWaT5P32G+ywIDkAwnAINYm+Ng4tA/FaEfyBdUxPDPyRAAiRAAiRAAiTgEAJBqwGEsNYQDNdawl88z8UIT2XMmPH+5PjGC2w6rTvbngblzcR9XghyNezxLq5jEJfZFn8HrvMgv708FHNFp4nvqVu3biZbWl6SAAmQAAmQAAmQQNATCFoBEOR07d4uO8F4zd0eaADL2ePt1xkyZCiF+ywQ2Hbb43G9Ex7REVflhdCYsVmzZlHQEnZCmnvgdd2h5bQdcvbs2URtQZSWl7VQoUIl9XlqDtPK9VNL4/Tn4dBHHSP20+mf1P/az7H8j4XTrziWTh/BxO0Ph/EMdB+DWQCMhrB2LPFHwtzFIj6vi3gTdenSpWhcXIGQmCgvhMdTiNep30R5IfTpFO6FzJkzx6Dcd6DZewZp5yHOOMRpeZeSbjyBoBkbnyRRefFxVwVoT8gLgOHQRx1Y9vOqj7djIziWjh26qxrOsbwKiaMjwmE8A93HYBYA/fLhzZo16zoIc7eiMl3zp7uC34zXBPqlflZCAiRAAiRAAiRAAv4mEMzr12KhjYtyASQa8XtcxJsorA+MhVQdAaEuUV5M8+ZEgozwusYvwc2cOfMEbnRDh7q1SJcdQuBruH4fHlVdUU1fxsaNG+ewawFRh2oo8ShxeRqR1KGMiF69ekUizJ30WSjdP/7441lCvY86Xuxn6HxqOZYcS6cR4GfWaSOWfHvj5QKIEhFqhs7vLmh3AUMQWw8aJzEd29iiMnjw4Aw7duw4BlijYatvmBVvD5FPd+2egCDyAnbtvmo9Q7zuCP4S8XUQ/5kVnzREus6Im4Tdx0WwAeUQtIF1Ud8axN2GtnxrpcfcfV+UNfjw4cO51q9ff9GKt0Kd27fUu8WLF48cM2ZMF+sZQxIgARIgARIgARKAEDhp3759p5UEFFcrIdus9BeVoNUAQrhaBsFrYPPmzfNZO4F37tzZBGAiEb80OUAQ0s5DiFuLNK2RJkEAxLWagIk5cuTIF8nl1XjUWxt5T1SqVOkI6tVdI58jWrWEbeATBECk0/JXuRL+EC/xg2gGEmlV89flwIEDWr4+DkmXK1cuOXnyZEj2zd4p9tNOw9nXHEtnj5+99RxLOw3nX4f6eEK2kMKFCwuUQ71V5gjEiAWtAAggEwGke6ZMmRZDoFNtn5pwUYFu4Zw5c7ZasPBsIK4HYOq35OzZs//UeEjRQ6F92wDt3RSUMx351DD0Ewh7WQIb8tVCXC88/xhp9yHMDd8Madoj7Att42UtSwVKlDMccS8hz2E834LojvDl4d3S6iFvSAuA4BHy/dM+qtOxDAcXDv0Mhz6Gy2eWYxla30rhMp6BGrWg3QQCwes4oNwNr+FH8GrIeQHMsbTHdYLDB0SnsSOw+zdhOhsC4pdI2wS+Mp6tQNgV6fpi6jfBvAvS/4m4c/BD8Xw50ukO4OLwTaG9G5NQAS7ip5L74/IJTQt/M64b26eE7el5TQIkQAIkQAIkQALBTCBBaArmRjq9bRAqdQr4+P79+0Nac5Q7d245cSIgmmy/fkTYT7/i9mllHEuf4vVr4RxLv+L2eWWhPp5QJEmRIkWUox40EZAfzqDVAPr808UKSIAESIAESIAESCBMCQTtGsAwHQ92Ow0EunfvLtg1dVVK7LaWN99886p4RpAACZBAMBHQDQ6qAUqPw3p3Ue1YqLtQ6idmAYNygyQFwFD/LwrB/qnwt3Vrwj6gEOwhu0QCJBDKBFT4C4flMqE8hu70LVgFdk4BuzOKTEsCJEACJEACJEACIUCAAmAIDCK7QAIkQAIkQAIkQALuEKAA6A4tpiUBEiABEiABEiCBECBAATAEBpFdIAESIAESIAESIAF3CHATiDu0mDYoCOhuX1cuuXhXaRlHAiRAAiRAAuFMgAJgOI++Q/tOUy8OHTg2mwRIICwJ4LhVPaI1LPsezJ2mABjMo+OAttlt8qndJhyxZ1pNm3wOGDw2kQRIgAS8SODo0aMyZcoUuXDhgqitwyxZskjNmjVl+vTpMnr06GRrUtNe7777rkydOlXat28v9913n1SpUkXeeecdY9v17rvvliZNmkjTpk2TLYMP3CdAAdB9ZsxhI0CbfDYYvCQBEiCBMCWwceNGI+S99tprUqZMmQQKL774YqpGkFVhoELe0qVL5eWXX07I27FjRxk/fry8+uqrEhUVlRDPC+8QoADoHY4shQRIgARIgATCksC2bdvkqaeekmXLlknRokUTMbjzzjvl4MGDieJc3Xz++edSvXr1RI+++uorufHGGyn8JaLivRsKgN5jyZJIgARIgARIIKQIHDp0SBYvXizffPONPPLII/Lbb7/Jnj175J577jHTu9rZvn37SufOna8S/vRZ6dKl5eabb9bLFJ0KgK1bt06U5ssvv5Q77rgjURxvvEeAAqD3WLKkECbAtY4hPLjsGgkEGwGcHRtx6pRXW3UlZ07BAcRul7lmzRrp1KmTmYbt2rWrtG3bVlavXi3Lly83AuD3338vu3btkvfff99l2SVLlnQZb488efKk/Pjjj1KtWjV56623zCM9PzfplLA9D689J0AB0HOGLCEMCHCtYxgMMrtIAkFCQIW/ImXLerU1+3fvlivYmOGua9y4sRHOypcvL5UrVzbZd+zYIaVKlTLXqhGMjo6Wa665xmXRe/fulf3798vIkSMlT548cvbsWXnyySfNmj8rg2r6tIzBgwdbURITE2PWFN5+++0m7vjx4+YMeN1QoptF1M2bN0/y5s0ra9euleHDh5s4/kk7AQqAaWfFlC4I2G3vJd0F7CI5o0iABEiABFIhoNo6Fdi86YwGMB0F5kRbdHpWd/NabsWKFUYIU6FMBT818+LKbd++3Zh/UcFvyZIlJsnHH3+cSPjTyC+++CJR+Rr32WefSbly5SR37tx6a4THu+66K0FDqG3SenXziHo69wlQAHSfGXPYCNht8uk/6okTJ2xPeek0ApzqdtqIsb0hSQBTtenR1vmKhQpb3bp1M8WrRi979uyigqFO0bZp08as8/vkk0/k/vvvT2jCzz//LL/++qu0bNkyIU6FQF07mNRp+brj1+42bdokNWrUsEclul65cqUUKVJEvv32W6Oh1PWJdO4RoADoHi+mJoGQJsCp7pAeXnaOBNJF4PDhw1K1alWTV7V5utN37ty5Zj2gRs6YMUNeeeUV0d3ABQoUkGzZsomu/bMLf2oj9rvvvhOdUracptcNJjt37pQtW7aYKebIyEiZPXu2qJZRbQGqJrB27dpWloRQbQ3qBpNbbrnF2B5s1KiRqTshAS9SJUABMFVETEACgSFg18bZWxBKRrYD0Ud7nUmXLdg12nbmvCaBcCagwpjl8uXLJ2+88YZ1a0I1+jxs2LBEcUlvtm7dKvr/Zncq4KkfNGiQPVp69+5tfKLI+BvdHKJO1yRa1xHQmKrRaTr3CFAAdI8XU4cpgUCsdQwHbVwg+hiIOsP034bdJoEEArGxsZI/f/6Ee3cvzpw5Y6acdUPJqlWrjHZxwoQJ5tQRtTWomkk69whQAHSPF1OHKQG7ZohrHcP0Q8BukwAJpJvAvffem+68mjFHjhzSqlUr462CnnvuOeuSYToI8HTmdEBjFhIgARIgARIgARJwMgFqAJ08ei7abl/fZH8cSuvG7P3itXcJBGKq27s9YGkkQAIkQAJpIUABMC2UHJSG65scNFhB2FROdQfhoLBJJEACJOADAhQAfQCVRZKANwjYtXH28pKLt6dxynVyfUku3hv9speddBewN8pnGSRAAiTgBAIUAJ0wSmxjWBKwa+NCFUAg+mivkxt6QvWTxX6RAAmkRoCbQFIjxOckQAIkQAIkQAIkEGIEqAEMsQENRHdOnjwp69evN1be1VaTOjXMaTnr2gqTPk96b6WzQvtzK84KXT2zx+m1urSmt9JZoT2vFafmCNSqfaZMmYzxUQ0zZ85svP1a45JLo0ZLXaXVPFY9puH8QwIkQAIkQAI+IEAB0AdQA1mkfX2TvR3JxdvTuHP9119/yaeffmq8nuNYokQJqVevnjkf0rLOruVZ11boKi7pM723x1ntsuKs0FVZruJcpbfKTGt6exkZMmQQFXQvXrxojJDqkUTq9f78+fMmtF9bz6001n1yB6irYGgXHFVY1EPR9cBzZeztsbSz4DUJkAAJkEB4EKAAGGLjbF/f5M2uqbDy/fffGwvsKvjt2bNHbrvtNnOw90svvSTXX3+9hMt6Km/1U7WISYXCpPcqSJ49e9acsamHnw8dOtQIgCoIqkCoY8AjkLz5SWdZJEACJBAeBCgAhsc4p6uXcXFxsmnTJqPlW716tdF6qdDx5JNPyl133SVRUVHpKpeZ/iWgO1CTno2ZHJtq1apJly5dRKfbdUzWrFkjPXr0kNOnT4seg6QCoY5JoUKFkiuC8SRAAiSQbgK7du0yZwB/+eWX5nsnb968csstt0jXrl2lQoUKJu61116T5cuXy6FDh0TPB65Vq5b06tWLsxbppu7bjBQAfcvXcaXrP64KF3rW4saNG6VgwYJGyzdu3DipXr06tU0BHlH9Um3YsKHxOi29Y8cOUeF85syZ0qdPH7npppuMMKgCYaVKldIsYAa4W6yeBEggiAnoMp/27dsbv2TJEilatKh5GVVhb+nSpVKqVClp3ry5+X2YPHmy+R7SM3vHjBkjjRo1ksWLF5s0QdzFsGzafyv1w7L7/uk0fqhzo6bj+g9hX0vmn9pTrkXbs3v3bqPlU6FPp3lVcNBzG++55x658cYb07wpwVtToym3OPBPg7WfMTExsm7dOiPAb9iwQXStomoFVRisU6eO2xrbYO2nNz8B4dBH5RUO/XRSH53UVv386CxD1apV5fXXX9fbq9z48eNl4sSJsnnz5qu+Z1QwzJkzp8yYMeOqfOES4Wq8dbNfkSJFFEEeXJ8IBAtqAANBPcB16kYFVeOr5kiFvsOHDxsB4eGHHzbCQoECBQLcQlafHgI6JdOyZUvjde3g1q1bjTD4xhtvyFNPPSW33nqrGV+dxi9btmyaBfv0tIV5SIAEQoPAb7/9Jnv37hVd652c01kjfdF0tSyoVatW8sILL5gNclyvnBzBwMRTAAwMd7/XGhsba7RDuoFDtURqyuT//u//ZPjw4VKzZk3Jnj2739vECn1HQHcR6wYR9f369ZO///5b1q5da/zYsWMlOjo6YVexrtPRzwMdCZBAcBDAxIycOuXdCbqcOa/gpc/9/h05csS8LMZrq1wWcPToUbn99ttdPtN8+kJ67Ngxs6TIZSJGBoQABcCAYPdPpfrmpho+Ffq2bNlipnN1WlcX7d58881mitA/LWEtgSaga3asNTy6q1g1wCoQDhkyRHRpwh133GHe4PUtnmZmAj1arD/cCajwV7asmR70Gordu/djYwYkSzdd/vz5zdIl/Z4oXbq0y9z58uUz3yOuHv7zzz/GrJUr7aCr9IzzH4F0vA/4r3GhUpO/1gCqWRGd9lOhT/2+ffuMdk+FPvUqBPjSuVrn4Mv6AlV2KPVT14D++uuvRhjUaZyvvvpKihUrZoTBJk2aSPny5UN6408ojWVK/w/h0E8n9TG1tgaTBlA/V2lZAzhp0iSzBjBPnjyJPootWrSQyMhIrgE8kXiZH9cAJvqY8CY9BE6dOiW64F+1fPoDrj/oqsXp3bu3Wdenu0bpSCA5AvolpG/16tXMjH6ePvvsM/NZevTRR809zcwkR4/xJOAbAjpVmx5tnW9aIzJq1Cgzg6DrjDt37myUCfpdsWLFCrM+UNcY607fDh06yIgRI4zhetUYqlmYn376SRYtWuSrprFcDwhQA+gBvLRm9bYGUNdzqcCnmzh019V1112XsGtX7TLp+q9AuNTeagPRJl/UGS791JeHL774wnzOdLp4+/btCWZmdCNJ5cqVHW9mJlzGMhz66aQ+Oqmt1neoWovQ3b5qEkZtxKowqBvLdEmRzhSoQKjri5ctW2Y2FqrWr3bt2sYOYIkSJaxiwjJ0Nd7BoAGkAOiHj6OnAqBq9X744YeE9XxqkFMNA1tTu2qDKRicqw95MLTL220I135aZmZUGNSznz01M+PtcUlPeeE6lulhFex5nDSWTmprsI+7E9rnarwpADph5LzQxvQIgLpQX7V7upZPNX36dlW3bl2j6VPbbvr2FWzO1Yc82Nrojfawn2J29VlmZnTpgR4NqNoA1QzqEgSnmJnhWHrjPyI4ynDSWDqprcExus5uhavxpgDo7DFNc+vTKgDqdnv9MVWhT9f16c4q1fKpUWbdYh/sNpRcfcjTDMlBCdnPqwdLlyVYRqh1DaFTzMxwLK8eS6fGOGksndRWp34egqndrsabAmAwjZAP25KcAKhTu6o50fV8KvTpGquKFSsa+3wq9JUrV85Rxnpdfch9iDVgRbOfKaNX7bXuJtaXGfV2MzOqIQym9UAcy5TH0klPnTSWTmqrkz4DwdpWV+NNATBYR8vL7bILgHoKh/44qtCn/uDBg2ahrAp8OnVWqFAhL9fuv+Jcfcj9V7v/amI/085aX3L0FAFLGLSbmVFhMNDnS3Ms0z6WwZ7SSWPppLYG+7g7oX2uxpsCoBNGzgtttATAtm3bmoOzs2bNmrCBQ3dJhcopHK4+5F7AF3RFsJ/pHxK7mRndTHL69GljY8xaO1iwYMH0F56OnBzLdEAL0ixOGksntTVIh9tRzXI13sEgAAbGXoijhs57jb322mtl1qxZUqlSJZ7C4T2sLMlBBPRQ+IYNGxqv2sEdO3YY7eCHH34oAwcOlI8//lgqVKjgoB6xqSRAAiTgTAI0A+OHcbM0gLoWSn/0QtW5essJxb6yn74Z1XHjxsncuXONHbGkpwn4pkYRjqWvyPq/XCeNpZPa6v+RDL0aXY13MGgAM4QeavaIBEjAiQT0NIGSJUtKz549Q/pFyYljwzaTAAmEHgEKgKE3puwRCTiSgBqWVi2gGj2fOHGiI/vARpMACZCAUwhQAHTKSLGdJBAGBNTAuQp/Y8aMka+//joMeswukgAJkEBgCFAADAx31koCJJAMgSpVqsgLL7wgTzzxhKhxdDoSIIHAE/j++++lU6dO5tzfMmXKiJ5I9cYbb5hTgQLfOrYgPQQoAKaHGvOQAAn4lEDHjh3ltttuk27dusmlS5d8WhcLJwESSJnApk2bpHnz5nLjjTeaU6r0PPpRo0aZTVv/+9//Us7Mp0FLgAJg0A4NG0YC4UtAd8iNHj3anCLy2muvhS8I9pwEgoBA//795f7775fnn39e8ufPL5kyZTIvaFOnTpWNGzfK4sWLg6CVbIK7BCgAukuM6UmABPxCQG0GTp482Xg1Gk1HAiTgfwJ6ko/6Vq1aXVV56dKlpXLlyrJ69eqrnjEi+AkEtSHoNm3alLp8+fIbwFgb/iy0AnPj4uJ6L1my5ExqaPFhbYA0L8HfBL8f9vfGz5s373UrX5MmTXJly5btOcQ3RNwN8DrPtB11DIItss1WOg1R1noEd+q1zSHrlVYoc4EtjpckQAJeJKBTTiNGjBA1EaPnZRctWtSLpbMoEghOAvhtET01x5tOX6hUs+6uO3r0qMlXuHBhl1mLFCkimobOeQSCVgBs165dbpybuw5I/8I/Q0uYiMiHcCyENj0r6upXERv7li1bVsftIqT/AB/4ngirIxzdunXrCxDuJmjSzJkzF0N8F/ipuB2A56oN7Yr79RD46n/00Ud2lYNab/4CbXgGAmnCf9DFixf3IJ6OBEjAhwQeeOAB2bJlizz++OOyYMECyZIliw9rY9EkEHgCKvyVLVvWqw3ZvXu35MqVy+0y8+XLZ+xyHjhwQFTjl9TpAQfFihUz0b/99pvo+sBDhw5JxowZpX379kmT8z6ICAStAHju3LmuEMryQciqguOhzOsFBLOzYDcfAl6V+fPnb0uOIwS1QXj2HbRznePTbMCPiKoOBqOMdyDcXUKavZGRkSXff/99LdM4PPsUFz/C94S3C4D6/PicOXO26AUdCZCAfwkMGTJEmjVrJsOHD5ehQ4f6t3LWRgJ+JqDaOhXYvOm0zPQ4Nc5eokQJwe+p1KpVK1ERv/zyi2zfvl2sjSDLli2TihUrSqNGjeS+++6Ttm3bGkEwUSbeBA2BoBUAIfzp1OxaS/iLJ6YrTU/hzeJ+hC4FQAhxqh64G74/fIJDeTNx0x0avhoIP4MQGJfwMP5CBUPk/w63NyZ9xnsSIIHAEYDm39gH1HOEb731VsESjsA1hjWTgI8J4PcqXdo6XzVLl2GoCRid7u3cubNERUXJ1q1bpXfv3lK7dm1p3LixqVp37avD7J3kyJGDwp+hEbx/glYABDJduzfNji5eQNuDadhy9nj7NTR7um4wC/6Bkr4+7UQ6REdo3s/seazrunXrKo874DdZcbawJoTDk7hXAVPXCr6M6eSFtue8JAES8CGB4sWLy+uvv27WA950000up6N8WD2LJoGwJXDnnXcKlDGiO/Lr1KkjmKEz63F1eYba68TvYSI2M2bMkJdffjlRHG+Cj0Aw7wKOxofqmAtksYjP6yLeRMFmWDQurkAITJQXwqOuqNWNHsnmLVCgwAA8vwY+kd0J1LcB/lnEN4QGsTXCGIQLsKbwIVzTkQAJ+InAvffeKx06dJAuXbrImTOp7gXzU6tYDQmEPgGd2sWSKdmxY4fo1O+GDRvMy5iahLG7devWSYMGDYxQiN9J+yNeBxmBxCMXZI3zZ3Og3WuO+l6AHwRh8Vt73dD0Dbbf43oR0m/Eh1t3GX+Y5BlvSYAEfEigb9++ZvqpX79+RiOIlzMf1saiSYAE0krgk08+kTfffFOio6ONADhr1qy0ZmW6ABAIZgEwFgJWlAsm0YhPdvct1gfG6k5dTAUnyguBTVfAZoSPSVom1Nh1ETcL5U7GQlcV6lJ1SPsRfnheh3X0fEnWKZq80A7WRzvq6w12L2bR803TswMr1YYEUQLdnZk7d+4gapFvmsJ++oarO6XqFFONGjXMtJSeGpJex7FML7ngy+eksdQdsqHo1Fi0errEBHS8k/tthHwwAjLIec0BuWUlFE4rE+f23V0wC4C70O1Ea/0GDx6cAernGwBpUXJIIHT9imfnEWreZbZ0uqZQt7NruQkOguEtuNHylkL4ezLhgYcX8YNoBhJ1qlTU7eTJk2Y7vYdFB212/YCfOHEiaNvnrYaxn94imf5ydIH5hAkT5JFHHpEbbrhBKlSokK7COJbpwhaUmZw0ltpWuvAhoMdZJv1t1JkL3ZkN5VB/XAfkhzNo1wBCaFLh7S7VsFkfk507dzbBdSRgLbXikoaYvlVJei3StE7yrC3uY3C4/BdWPMzJqKGl5fDfwOvztC5YQPERDyL97660f4inIwES8DGBmjVrSo8ePcx6wOPHj/u4NhZPAiRAAqFFIGg1gBCwJgJ1dywwXQwt3TBc54VQ+CrChbDHt9UaBjwbiOsBULGWnD179p8aDw3hUGgA1fbfFJQzHfmqI/oJhL3Wr19/UdMgXwEEq+AvI83LkNCrQCDUR5r/HATJ7XqNdGr4qDfyzkf4B3wBpH8c4e3wbeDpSIAEAkSge/fuxkj0s88+K1OmTLlqN2KAmsVqSYAESCDoCQStAAgB7DiEL7XnNx7+I/iEo+DsVCGYQR6LiIAAl7ASHALil1iDp9rCEfBt8ViPguuLKd43bHl1SticK4VnKyH02R7JPtyU1AjE74cwmQllaFn54c/Cq8awAdqohqPT7HC0nZw+fVrUnIUulKUjARLwjID+344fP97sOtR1tl27dvWsQB/lVkF13z79Wkns+F2QmAfvSIAE/EcgQWjyX5XhVxMETF3wcVzXfeg6wKpVqwrOMw45EE5ag+MJfPbTE3q+ybtt2zbV1svMmTOlenVV+KfN+Wss1VCuGs5N6vz1XeCvfibtnz/vndRHJ7XVn2MYqnW5Gm8olYxhbfQ5D665BjBUB5/9IgES8C2BKlWqyIsvvmiM0h4+fNi3lbF0EiABEggBAonmPUOgP+wCCZBAmBLQHcG333676HFUuuuOjgRIgARIIHkCFACTZ8MnJEACDiKgUyqvvPKKHDx4UF59VfeL0ZEACZAACSRHgAJgcmQYTwIk4DgCaldr0qRJ8u6778ratWsd1342mARIgAT8RSBodwH7C4A/66lcuXLCLmB/1su6SCCcCNx4443mIPqnnnpKVq5cKddee23Au6+7fV255OJdpWUcCZAACXiTAAVAb9JMpSyYpwnpk0BS6T4fk4DfCKhNz6+//tqYhVmwYIHoMWGBdDT7FEj6rJsESMAVAU4Bu6LCOBIgAccTGDJkiFy8eFGGDVM78nQkQALhRkD////6669w63aa+0sBMM2omJAESMBJBLJly2bWA86fP18WLUr2+HAndYltJQFHEsBhCn5vt9b51ltvSf78en6Dd92hQ4dk+vTp3i00AKVRAAwAdFZJAiTgHwLFihWT119/Xfr06SO//PKLfyplLSTgIYHz58+b3ewaeuq8WVZqbTl69KjZif/SSy+ZE3reeecd+eGHH6Rv374pZtVTcgYMGGDW6/br1082bdpk1svrbv7rr79eOnfu7PZLnApo9957r+iLoLddwYIFRb9bnH6gA9cAevuTwfJIgASCioD+CKiNwC5dusgnn3wiOXLkCKr2sTEkYBFQrdXkoUPl0Jo1UuzUKfkDu9oL1qsnjw0cqMeSWsnSFHqzrLRUuHHjRhk9erS89tprUqZMmYQsaqBdT8BKyelmqLvvvluWLl1qNnBZaTt27GgESRUEo6KirOhUw7Nnz5o1wJrfV65u3brmO6V+/foBX2Oc3j5SAEwvOeYjARJwDAHVAH777bfy/PPPy7hx40RtBtKRQLARUOGvDjRXd58792/TMNW49u+/ZTLuHh882K3merOs1CrWoxh11/2yZcukaNGiiZLfeeedRpuZKNLFzeeff37VMY5fffWV6K5+d4Q/LVqF0UqVKrmoxbtRanheLQ3oUY9OdBQAnThqbDMJkIBbBDJlymTWA+nb+qxZs6Rdu3Zu5WdiEvA1AZ2qVc1fgvAXX6Hez0X8+f7906xp8mZZut5t8eLF8s033xhN+m+//SZ79uyRe+65R2rWrGlaqVO8Ok2bVPjTh6VLl5abb745vjfJByoAtm7dOlGCL7/8Uu64445EcWm50Snk++67L1FSPR1I1wRGR0cb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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure()\n",
"plt.plot(tempDependence.index, tempDependence['NC7H16'], 'r-', label=r'$nC_{7}H_{16}$')\n",
"plt.plot(tempDependence.index, tempDependence['CO'], 'b-', label='CO')\n",
"plt.plot(tempDependence.index, tempDependence['O2'], 'k-', label='O$_{2}$')\n",
"\n",
"plt.plot(expData['T'], expData['NC7H16'],'ro', label=r'$nC_{7}H_{16} (exp)$')\n",
"plt.plot(expData['T'], expData['CO'],'b^', label='CO (exp)')\n",
"plt.plot(expData['T'], expData['O2'],'ks', label='O$_{2}$ (exp)')\n",
"\n",
"plt.xlabel('Temperature (K)')\n",
"plt.ylabel(r'Mole Fractions')\n",
"\n",
"plt.xlim([650, 1100])\n",
"plt.legend(loc=1);"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}