diff --git a/simpegPF/Magnetics.py b/simpegPF/Magnetics.py index b44c7fc9..e727d3b3 100644 --- a/simpegPF/Magnetics.py +++ b/simpegPF/Magnetics.py @@ -39,11 +39,11 @@ class MagneticIntegral(Problem.BaseProblem): # return self.G.dot(self.mapping*(m)) - def Jvec(self, m, v, u=None): + def Jvec(self, m, v, f=None): dmudm = self.mapping.deriv(m) return self.G.dot(dmudm*v) - def Jtvec(self, m, v, u=None): + def Jtvec(self, m, v, f=None): dmudm = self.mapping.deriv(m) return dmudm.T * (self.G.T.dot(v)) @@ -706,139 +706,139 @@ def Intgrl_Fwr_Data(mesh,B,M,rxLoc,model,actv,flag): return d -def Intrgl_Fwr_Op(mesh,B,M,rxLoc,actv,flag): - """ - - Magnetic forward operator in integral form - - INPUT: - mesh = Mesh in SimPEG format - B = Inducing field parameter [Binc, Bdecl, B0] - M = Magnetization information - [OPTIONS] - 1- [Minc, Mdecl] : Assumes uniform magnetization orientation - 2- [mx1,mx2,..., my1,...,mz1] : cell-based defined magnetization direction - 3- diag(M): Block diagonal matrix with [Mx, My, Mz] along the diagonal - - rxLox = Observation location informat [obsx, obsy, obsz] - - flag = 'tmi' | 'xyz' | 'full' - [OPTIONS] - 1- tmi : Magnetization direction used and data are projected onto the - inducing field direction F.shape([ndata, nc]) - - 2- xyz : Magnetization direction used and data are given in 3-components - F.shape([3*ndata, nc]) - - 3- full: Full tensor matrix stored with shape([3*ndata, 3*nc]) - - OUTPUT: - F = Linear forward modeling operation - - Created on Dec, 20th 2015 - - @author: dominiquef - - """ - # Find non-zero cells - #inds = np.nonzero(actv)[0] - if actv.dtype=='bool': - inds = np.asarray([inds for inds, elem in enumerate(actv, 1) if elem], dtype = int) - 1 - else: - inds = actv - - nC = len(inds) - - # Create active cell projector - P = sp.csr_matrix((np.ones(nC),(inds, range(nC))), - shape=(mesh.nC, nC)) - - # Create vectors of nodal location (lower and upper coners for each cell) - xn = mesh.vectorNx; - yn = mesh.vectorNy; - zn = mesh.vectorNz; - - yn2,xn2,zn2 = np.meshgrid(yn[1:], xn[1:], zn[1:]) - yn1,xn1,zn1 = np.meshgrid(yn[0:-1], xn[0:-1], zn[0:-1]) - - Yn = P.T*np.c_[mkvc(yn1), mkvc(yn2)] - Xn = P.T*np.c_[mkvc(xn1), mkvc(xn2)] - Zn = P.T*np.c_[mkvc(zn1), mkvc(zn2)] - - ndata = rxLoc.shape[0] - - # Convert Bdecination from north to cartesian - D = (450.-float(B[1]))%360. - - - # Pre-allocate space and create magnetization matrix if required - if (flag=='tmi') | (flag == 'xyz'): - # If assumes uniform magnetization direction - if M.shape != (nC,3): - - print 'Magnetization vector must be Nc x 3' - return - - - Mx = Utils.sdiag(M[:,0]*B[2]) - My = Utils.sdiag(M[:,1]*B[2]) - Mz = Utils.sdiag(M[:,2]*B[2]) - - Mxyz = sp.vstack((Mx,My,Mz)) - - - - if flag == 'tmi': - F = np.zeros((ndata, nC)) - - # Projection matrix - Ptmi = mkvc(np.r_[np.cos(np.deg2rad(B[0]))*np.cos(np.deg2rad(D)), - np.cos(np.deg2rad(B[0]))*np.sin(np.deg2rad(D)), - np.sin(np.deg2rad(B[0]))],2).T; - - elif flag == 'xyz': - - F = np.zeros((int(3*ndata), nC)) - - elif flag == 'full': - F = np.zeros((int(3*ndata), int(3*nC))) - - - else: - print """Flag must be either 'tmi' | 'xyz' | 'full', please revised""" - return - - - # Loop through all observations and create forward operator (ndata-by-nC) - print "Begin calculation of forward operator: " + flag - - # Add counter to dsiplay progress. Good for large problems - count = -1; - for ii in range(ndata): - - - tx, ty, tz = get_T_mat(Xn,Yn,Zn,rxLoc[ii,:]) - - if flag=='tmi': - F[ii,:] = Ptmi.dot(np.vstack((tx,ty,tz)))*Mxyz - - elif flag == 'xyz': - F[ii,:] = tx*Mxyz - F[ii+ndata,:] = ty*Mxyz - F[ii+2*ndata,:] = tz*Mxyz - - elif flag == 'full': - F[ii,:] = tx - F[ii+ndata,:] = ty - F[ii+2*ndata,:] = tz - - - # Display progress - count = progress(ii,count,ndata) - - print "Done 100% ...forward operator completed!!\n" - - return F +#def Intrgl_Fwr_Op(mesh,B,M,rxLoc,actv,flag): +# """ +# +# Magnetic forward operator in integral form +# +# INPUT: +# mesh = Mesh in SimPEG format +# B = Inducing field parameter [Binc, Bdecl, B0] +# M = Magnetization information +# [OPTIONS] +# 1- [Minc, Mdecl] : Assumes uniform magnetization orientation +# 2- [mx1,mx2,..., my1,...,mz1] : cell-based defined magnetization direction +# 3- diag(M): Block diagonal matrix with [Mx, My, Mz] along the diagonal +# +# rxLox = Observation location informat [obsx, obsy, obsz] +# +# flag = 'tmi' | 'xyz' | 'full' +# [OPTIONS] +# 1- tmi : Magnetization direction used and data are projected onto the +# inducing field direction F.shape([ndata, nc]) +# +# 2- xyz : Magnetization direction used and data are given in 3-components +# F.shape([3*ndata, nc]) +# +# 3- full: Full tensor matrix stored with shape([3*ndata, 3*nc]) +# +# OUTPUT: +# F = Linear forward modeling operation +# +# Created on Dec, 20th 2015 +# +# @author: dominiquef +# +# """ +# # Find non-zero cells +# #inds = np.nonzero(actv)[0] +# if actv.dtype=='bool': +# inds = np.asarray([inds for inds, elem in enumerate(actv, 1) if elem], dtype = int) - 1 +# else: +# inds = actv +# +# nC = len(inds) +# +# # Create active cell projector +# P = sp.csr_matrix((np.ones(nC),(inds, range(nC))), +# shape=(mesh.nC, nC)) +# +# # Create vectors of nodal location (lower and upper coners for each cell) +# xn = mesh.vectorNx; +# yn = mesh.vectorNy; +# zn = mesh.vectorNz; +# +# yn2,xn2,zn2 = np.meshgrid(yn[1:], xn[1:], zn[1:]) +# yn1,xn1,zn1 = np.meshgrid(yn[0:-1], xn[0:-1], zn[0:-1]) +# +# Yn = P.T*np.c_[mkvc(yn1), mkvc(yn2)] +# Xn = P.T*np.c_[mkvc(xn1), mkvc(xn2)] +# Zn = P.T*np.c_[mkvc(zn1), mkvc(zn2)] +# +# ndata = rxLoc.shape[0] +# +# # Convert Bdecination from north to cartesian +# D = (450.-float(B[1]))%360. +# +# +# # Pre-allocate space and create magnetization matrix if required +# if (flag=='tmi') | (flag == 'xyz'): +# # If assumes uniform magnetization direction +# if M.shape != (nC,3): +# +# print 'Magnetization vector must be Nc x 3' +# return +# +# +# Mx = Utils.sdiag(M[:,0]*B[2]) +# My = Utils.sdiag(M[:,1]*B[2]) +# Mz = Utils.sdiag(M[:,2]*B[2]) +# +# Mxyz = sp.vstack((Mx,My,Mz)) +# +# +# +# if flag == 'tmi': +# F = np.zeros((ndata, nC)) +# +# # Projection matrix +# Ptmi = mkvc(np.r_[np.cos(np.deg2rad(B[0]))*np.cos(np.deg2rad(D)), +# np.cos(np.deg2rad(B[0]))*np.sin(np.deg2rad(D)), +# np.sin(np.deg2rad(B[0]))],2).T; +# +# elif flag == 'xyz': +# +# F = np.zeros((int(3*ndata), nC)) +# +# elif flag == 'full': +# F = np.zeros((int(3*ndata), int(3*nC))) +# +# +# else: +# print """Flag must be either 'tmi' | 'xyz' | 'full', please revised""" +# return +# +# +# # Loop through all observations and create forward operator (ndata-by-nC) +# print "Begin calculation of forward operator: " + flag +# +# # Add counter to dsiplay progress. Good for large problems +# count = -1; +# for ii in range(ndata): +# +# +# tx, ty, tz = get_T_mat(Xn,Yn,Zn,rxLoc[ii,:]) +# +# if flag=='tmi': +# F[ii,:] = Ptmi.dot(np.vstack((tx,ty,tz)))*Mxyz +# +# elif flag == 'xyz': +# F[ii,:] = tx*Mxyz +# F[ii+ndata,:] = ty*Mxyz +# F[ii+2*ndata,:] = tz*Mxyz +# +# elif flag == 'full': +# F[ii,:] = tx +# F[ii+ndata,:] = ty +# F[ii+2*ndata,:] = tz +# +# +# # Display progress +# count = progress(ii,count,ndata) +# +# print "Done 100% ...forward operator completed!!\n" +# +# return F def get_T_mat(Xn,Yn,Zn,rxLoc): """ @@ -1193,7 +1193,7 @@ def getActiveTopo(mesh,topo,flag): return inds -def plot_obs_2D(rxLoc,d = None ,varstr = 'Mag Obs', vmin = None, vmax = None): +def plot_obs_2D(rxLoc,d = None ,varstr = 'Mag Obs', vmin = None, vmax = None, levels = None): """ Function plot_obs(rxLoc,d) Generate a 2d interpolated plot from scatter points of data @@ -1238,8 +1238,12 @@ def plot_obs_2D(rxLoc,d = None ,varstr = 'Mag Obs', vmin = None, vmax = None): d_grid = griddata(rxLoc[:,0:2],d,(X,Y), method ='linear') plt.imshow(d_grid, extent=[x.min(), x.max(), y.min(), y.max()],origin = 'lower', vmin = vmin, vmax = vmax) plt.colorbar(fraction=0.02) - plt.contour(X,Y, d_grid,10,vmin = vmin, vmax = vmax) - + + if levels is None: + plt.contour(X,Y, d_grid,10,vmin = vmin, vmax = vmax) + else: + plt.contour(X,Y, d_grid,levels = levels,colors = 'r', vmin = vmin, vmax = vmax) + plt.title(varstr) plt.gca().set_aspect('equal', adjustable='box') diff --git a/simpegPF/notebooks/SimPEG Tutorial - MAG Linear Problem.ipynb b/simpegPF/notebooks/SimPEG Tutorial - MAG Linear Problem.ipynb index 169b3cfc..d504509e 100644 --- a/simpegPF/notebooks/SimPEG Tutorial - MAG Linear Problem.ipynb +++ b/simpegPF/notebooks/SimPEG Tutorial - MAG Linear Problem.ipynb @@ -69,7 +69,8 @@ "%matplotlib notebook\n", "%pylab\n", "from SimPEG import *\n", - "import simpegPF as PF" + "import simpegPF as PF\n", + "from simpegPF import BaseMag as MAG\n" ] }, { @@ -79,16 +80,23 @@ "collapsed": false, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\dominiquef.MIRAGEOSCIENCE\\Documents\\GIT\\SimPEG\\simpeg\\SimPEG\\Maps.py:533: FutureWarning: `ActiveCells` is deprecated and will be removed in future versions. Use `InjectActiveCells` instead\n", + " FutureWarning)\n" + ] + } + ], "source": [ "# First we need to define the direction of the inducing field\n", "# As a simple case, we pick a vertical inducing field of magnitude 50,000nT. \n", "# From old convention, field orientation is given as an azimuth from North \n", "# (positive clockwise) and dip from the horizontal (positive downward).\n", - "H0 = np.array(([90.,0.,50000.]))\n", + "H0 = (50000.,90.,0.)\n", "\n", - "# Assume all induced so the magnetization M is also in the same direction\n", - "M = np.array([90,0])\n", "\n", "# Create a mesh\n", "dx = 5.\n", @@ -126,7 +134,11 @@ "# Let just put the observation above the topo\n", "Z = -np.exp( ( X**2 + Y**2 )/ 75**2 ) + mesh.vectorNz[-1] + 5. \n", "\n", - "rxLoc = np.c_[Utils.mkvc(X.T), Utils.mkvc(Y.T), Utils.mkvc(Z.T)]\n" + "# Create a MAGsurvey\n", + "rxLoc = np.c_[Utils.mkvc(X.T), Utils.mkvc(Y.T), Utils.mkvc(Z.T)]\n", + "rxLoc = MAG.RxObs(rxLoc)\n", + "srcField = MAG.SrcField([rxLoc],H0)\n", + "survey = MAG.LinearSurvey(srcField) \n" ] }, { @@ -164,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -173,7 +185,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Begin calculation of forward operator: tmi\n", + "Begin calculation of forward operator: ind\n", "Done 0.0 %\n", "Done 10.0 %\n", "Done 20.0 %\n", @@ -190,802 +202,27 @@ } ], "source": [ - "# First, convert the magnetization direction to Cartesian\n", - "mi = np.ones(nC) * M[0]\n", - "md = np.ones(nC) * M[1]\n", - "M_xyz = PF.Magnetics.dipazm_2_xyz( mi , md ) # Ouputs an nc x 3 array\n", + "# We can now create a susceptibility model and generate data\n", + "# Lets start with a simple block in half-space\n", + "model = np.zeros((mesh.nCx,mesh.nCy,mesh.nCz))\n", + "model[(midx-2):(midx+2),(midy-2):(midy+2),-6:-2] = 0.01\n", + "model = mkvc(model)\n", + "model = model[actv]\n", + "\n", + "# Create active map to go from reduce set to full\n", + "actvMap = Maps.InjectActiveCells(mesh, actv, -100)\n", + "\n", + "# Creat reduced identity map\n", + "idenMap = Maps.IdentityMap(nP = len(actv))\n", "\n", "# Create the forward model operator\n", - "F = PF.Magnetics.Intrgl_Fwr_Op(mesh,H0,M_xyz,rxLoc,actv,'tmi')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Begin calculation of distance weighting for R= 3.0\n", - "Done 0.0 %\n", - "Done 10.0 %\n", - "Done 20.0 %\n", - "Done 30.0 %\n", - "Done 40.0 %\n", - "Done 50.0 %\n", - "Done 60.0 %\n", - "Done 70.0 %\n", - "Done 80.0 %\n", - "Done 90.0 %\n", - "Done 100% ...distance weighting completed!!\n", - "\n" - ] - }, - { - "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 = $('
');\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", - " fig.waiting = false;\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", - " '
');\n", - " var titletext = $(\n", - " '
');\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 = $('
');\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 = $('');\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 = $('');\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Close figure', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\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= 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": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" ], "text/plain": [ "" @@ -2703,7 +2669,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -3447,7 +3413,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -3459,10 +3425,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 19, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -3470,7 +3436,7 @@ "source": [ "# Plot predicted data and residual\n", "plt.figure()\n", - "pred = F.dot(mrec) #: this is matrix multiplication!!\n", + "pred = prob.fields(mrec) #: this is matrix multiplication!!\n", "\n", "subplot(221)\n", "imshow(data.reshape(X.shape))\n",