{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Genesis Potential Index (GPI)\n", "* Wenchang Yang (wenchang@princeton.edu)\n", "* Department of Geoscience, Princeton University" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2019-05-20T19:17:45.248388Z", "start_time": "2019-05-20T19:17:23.357910Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "**2019-05-20T15:17:23.360906**\n", ">>> Importing Python 3.7.3 packages...\n", "[OK]: import sys, os, os.path, datetime, glob\n", "[OK]: import numpy as np-1.16.3\n", "[OK]: import matplotlib as mpl-3.0.3; backend: module://ipykernel.pylab.backend_inline\n", "[OK]: #---import matplotlib.pyplot as plt\n", "[OK]: #---from pylab import *\n", "[OK]: import xarray as xr-0.12.1\n", "[OK]: #---import netCDF4\n", "[OK]: #---import dask\n", "[OK]: #---import bottleneck\n", "[OK]: import pandas as pd-0.24.2\n", "[OK]: from mpl_toolkits.basemap import Basemap\n", " PROJ_LIB = /scratch/gpfs/GEOCLIM/wenchang/miniconda3/envs/geoclim/share/proj\n", ">>>Import packages from Wenchang Yang (wython)...\n", "[OK]: import geoplots as gt\n", "[OK]: from geoplots import geoplot, fxyplot, mapplot, xticksyear\n", "[OK]: import geoxarray\n", "[OK]: import filter\n", "[OK]: import xlearn\n", "[OK]: import mysignal as sig\n", "**Done**\n" ] } ], "source": [ "%run -im pythonstartup" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2019-05-20T19:17:59.962151Z", "start_time": "2019-05-20T19:17:59.887262Z" } }, "outputs": [], "source": [ "# from lib.util import year_shift\n", "# import xlearn\n", "from mystats import p2t\n", "\n", "%matplotlib notebook" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2018-09-06T15:28:11.557098Z", "start_time": "2018-09-06T15:28:11.554046Z" } }, "outputs": [], "source": [ "nino_ens = [1, 3, 4, 7, 9, 12, 17, 22, 26, 29]\n", "nina_ens = [2, 5, 6, 8, 10, 11, 16, 23, 27, 30]\n", "neut_ens = [13, 14, 15, 18, 19, 20, 21, 24, 25, 28]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2019-05-20T19:40:15.546680Z", "start_time": "2019-05-20T19:40:15.542169Z" } }, "outputs": [], "source": [ "def axscale(ax=None, right=0, left=0, up=0, down=0):\n", " '''scale the axes by the four sides'''\n", " if ax is None:\n", " ax = plt.gca()\n", " x0, y0, w, h = ax.get_position().bounds\n", " w_new = w*(1 + right + left)\n", " h_new = h*(1 + up + down)\n", " x0_new = x0 - w*left\n", " y0_new = y0 - h*down\n", " ax.set_position([x0_new, y0_new, w_new, h_new])\n", " return ax" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2019-05-20T19:18:02.924339Z", "start_time": "2019-05-20T19:18:02.921751Z" } }, "outputs": [], "source": [ "if 'das' in globals() or 'das' in locals():\n", " pass\n", "else:\n", " das = dict()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## GPI" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### data" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2019-05-20T19:28:10.025583Z", "start_time": "2019-05-20T19:28:10.003724Z" }, "code_folding": [ 0 ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GPI_Pinatubo; GPI_Agung; GPI_StMaria; GPI_ctl; " ] } ], "source": [ "# data\n", "datanames = ['GPI',]# 'eta', 'H', 'Vpot', 'Vshear']\n", "volcs = ['Pinatubo', 'Agung', 'StMaria']\n", "years = [1991, 1963, 1902]\n", "months = [6, 3, 10]\n", "n_years = 3\n", "\n", "for dataname in datanames:\n", " # volc\n", " ifiles = [f'data/{volc}_PI_ens_noleap.GPI.{dataname}.nc'\n", " for volc in volcs]\n", " for volc, ifile, yyyy, mm in zip(volcs, ifiles, years, months):\n", " key = f'{dataname}_{volc}'\n", " print(key, end='; ')\n", " da = xr.open_dataset(ifile)[dataname]\n", " das[key] = da\n", "\n", " # ctl\n", " ifile = f'data/CTL1860_noleap_tigercpu_intelmpi_18_576PE.GPI.{dataname}.nc'\n", " key = f'{dataname}_ctl'\n", " print(key, end='; ')\n", " da = xr.open_dataset(ifile)[dataname]\n", " das[key] = da\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### fig" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "ExecuteTime": { "end_time": "2019-05-20T20:41:20.096669Z", "start_time": "2019-05-20T20:41:18.009869Z" }, "code_folding": [ 0 ] }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# fig n_years = 3\n", "fig, axes = plt.subplots(3, 2, figsize=(8, 8), sharey=True, sharex='col')\n", "dataname = 'GPI'\n", "ctl_ens = das[f'{dataname}_ctl']\n", "dvs = dict()\n", "for volc in ('Pinatubo', 'Agung', 'StMaria'):\n", " dvs[volc] = das[f'{dataname}_{volc}']\n", "n_years = 3\n", "# lv = 2**np.arange(-3, 4.1)\n", "levels = np.arange(-1,1.01,0.1) # list(-lv[-1::-1]) + [0,] + list(lv)\n", "coastline_width = .5\n", "cbar_ticks = None#(-16, -4, -1, -0.25, 0, 0.25, 1, 4, 16)\n", "cbar_format = None#'%.2g'\n", "alpha=0.2\n", "hatches = ['//////']\n", "\n", "ax = axes[0, 0]\n", "volc_name, tag, mon_start = 'Pinatubo', 'Pinatubo', 6\n", "color = 'k'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='k')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color=color, alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(a) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "\n", "ax = axes[1, 0]\n", "# plt.sca(ax)\n", "# ax.set_aspect(aspect)\n", "# plt.sca(ax)\n", "volc_name, tag, mon_start = 'Agung', 'Agung', 3\n", "color = 'C0'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C0')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C0', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(c) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[2, 0]\n", "volc_name, tag, mon_start = 'StMaria', 'StMaria', 10\n", "color = 'C1'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C1')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C1', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(e) {tag}', loc='left')\n", "ax.set_xlabel(f'Zonal mean {dataname}')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[0, 1]\n", "volc_name, mon_start = 'Pinatubo', 6\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(b)', loc='left')\n", "# expand_ax(ax)\n", "ax.text(1, 1.02, f'n_years = {n_years}', \n", " transform=ax.transAxes, ha='right', va='bottom')\n", "\n", "ax = axes[1, 1]\n", "volc_name, mon_start = 'Agung', 3\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time')\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(d)', loc='left')\n", "# expand_ax(ax)\n", "\n", "\n", "\n", "ax = axes[2, 1]\n", "plt.sca(ax)\n", "volc_name, mon_start = 'StMaria', 10\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "ax.set_yticks(np.arange(-45,46,15))\n", "ax.set_yticklabels(['45$^\\circ$S', '30$^\\circ$S', '15$^\\circ$S', '0', '15$^\\circ$N', '30$^\\circ$N', '45$^\\circ$N'])\n", "plt.title('(f)', loc='left')\n", "# yticks2lat(np.arange(-45,46,15))\n", "# expand_ax(ax)\n", "\n", "\n", "ax.set_ylim(-30, 30)\n", "plt.tight_layout()\n", "for ax in axes[:, 0]:\n", " axscale(ax, right=-0.5)\n", "for ax in axes[:, 1]:\n", " axscale(ax, left=0.6)\n", "\n", "figname = f'figs/fig_GPI_nyears{n_years}.pdf'\n", "plt.savefig(figname)" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "ExecuteTime": { "end_time": "2019-05-21T19:36:33.146136Z", "start_time": "2019-05-21T19:36:24.722193Z" }, "code_folding": [], "scrolled": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# fig n_years = 3 lat/lon smoothed\n", "fig, axes = plt.subplots(3, 2, figsize=(8, 8), sharey=True, sharex='col')\n", "dataname = 'GPI'\n", "ctl_ens = das[f'{dataname}_ctl']\n", "dvs = dict()\n", "for volc in ('Pinatubo', 'Agung', 'StMaria'):\n", " dvs[volc] = das[f'{dataname}_{volc}']\n", "n_years = 3\n", "# lv = 2**np.arange(-3, 4.1)\n", "levels = np.arange(-0.6,0.61,0.1) # list(-lv[-1::-1]) + [0,] + list(lv)\n", "coastline_width = .5\n", "cbar_ticks = None#(-16, -4, -1, -0.25, 0, 0.25, 1, 4, 16)\n", "cbar_format = None#'%.2g'\n", "alpha=0.2\n", "hatches = ['//////']\n", "\n", "ax = axes[0, 0]\n", "volc_name, tag, mon_start = 'Pinatubo', 'Pinatubo', 6\n", "color = 'k'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='k')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color=color, alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(a) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "\n", "ax = axes[1, 0]\n", "# plt.sca(ax)\n", "# ax.set_aspect(aspect)\n", "# plt.sca(ax)\n", "volc_name, tag, mon_start = 'Agung', 'Agung', 3\n", "color = 'C0'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C0')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C0', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(c) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[2, 0]\n", "volc_name, tag, mon_start = 'StMaria', 'StMaria', 10\n", "color = 'C1'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C1')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C1', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(e) {tag}', loc='left')\n", "ax.set_xlabel(f'Zonal mean {dataname}')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[0, 1]\n", "volc_name, mon_start = 'Pinatubo', 6\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(b)', loc='left')\n", "# expand_ax(ax)\n", "ax.text(1, 1.02, f'n_years = {n_years}', \n", " transform=ax.transAxes, ha='right', va='bottom')\n", "\n", "ax = axes[1, 1]\n", "volc_name, mon_start = 'Agung', 3\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time')\n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(d)', loc='left')\n", "# expand_ax(ax)\n", "\n", "\n", "\n", "ax = axes[2, 1]\n", "plt.sca(ax)\n", "volc_name, mon_start = 'StMaria', 10\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "ax.set_yticks(np.arange(-45,46,15))\n", "ax.set_yticklabels(['45$^\\circ$S', '30$^\\circ$S', '15$^\\circ$S', '0', '15$^\\circ$N', '30$^\\circ$N', '45$^\\circ$N'])\n", "plt.title('(f)', loc='left')\n", "# yticks2lat(np.arange(-45,46,15))\n", "# expand_ax(ax)\n", "\n", "\n", "ax.set_ylim(-30, 30)\n", "plt.tight_layout()\n", "for ax in axes[:, 0]:\n", " axscale(ax, right=-0.5)\n", "for ax in axes[:, 1]:\n", " axscale(ax, left=0.6)\n", "\n", "figname = f'figs/fig_GPI_nyears{n_years}_smoothed.pdf'\n", "plt.savefig(figname)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "ExecuteTime": { "end_time": "2019-05-20T20:20:23.763081Z", "start_time": "2019-05-20T20:20:08.953489Z" }, "code_folding": [ 0 ] }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# fig n_years = 1\n", "fig, axes = plt.subplots(3, 2, figsize=(8, 8), sharey=True, sharex='col')\n", "dataname = 'GPI'\n", "ctl_ens = das[f'{dataname}_ctl']\n", "dvs = dict()\n", "for volc in ('Pinatubo', 'Agung', 'StMaria'):\n", " dvs[volc] = das[f'{dataname}_{volc}']\n", "n_years = 1\n", "# lv = 2**np.arange(-3, 4.1)\n", "levels = np.arange(-1,1.01,0.1) # list(-lv[-1::-1]) + [0,] + list(lv)\n", "coastline_width = .5\n", "cbar_ticks = None#(-16, -4, -1, -0.25, 0, 0.25, 1, 4, 16)\n", "cbar_format = None#'%.2g'\n", "alpha=0.2\n", "hatches = ['//////']\n", "\n", "ax = axes[0, 0]\n", "volc_name, tag, mon_start = 'Pinatubo', 'Pinatubo', 6\n", "color = 'k'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='k')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color=color, alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(a) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "\n", "ax = axes[1, 0]\n", "# plt.sca(ax)\n", "# ax.set_aspect(aspect)\n", "# plt.sca(ax)\n", "volc_name, tag, mon_start = 'Agung', 'Agung', 3\n", "color = 'C0'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C0')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C0', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(c) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[2, 0]\n", "volc_name, tag, mon_start = 'StMaria', 'StMaria', 10\n", "color = 'C1'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C1')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C1', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(e) {tag}', loc='left')\n", "ax.set_xlabel(f'Zonal mean {dataname}')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[0, 1]\n", "volc_name, mon_start = 'Pinatubo', 6\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(b)', loc='left')\n", "# expand_ax(ax)\n", "ax.text(1, 1.02, f'n_years = {n_years}', \n", " transform=ax.transAxes, ha='right', va='bottom')\n", "\n", "ax = axes[1, 1]\n", "volc_name, mon_start = 'Agung', 3\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time')\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(d)', loc='left')\n", "# expand_ax(ax)\n", "\n", "\n", "\n", "ax = axes[2, 1]\n", "plt.sca(ax)\n", "volc_name, mon_start = 'StMaria', 10\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "ax.set_yticks(np.arange(-45,46,15))\n", "ax.set_yticklabels(['45$^\\circ$S', '30$^\\circ$S', '15$^\\circ$S', '0', '15$^\\circ$N', '30$^\\circ$N', '45$^\\circ$N'])\n", "plt.title('(f)', loc='left')\n", "# yticks2lat(np.arange(-45,46,15))\n", "# expand_ax(ax)\n", "\n", "\n", "ax.set_ylim(-30, 30)\n", "plt.tight_layout()\n", "for ax in axes[:, 0]:\n", " axscale(ax, right=-0.5)\n", "for ax in axes[:, 1]:\n", " axscale(ax, left=0.6)\n", "\n", "figname = f'figs/fig_GPI_nyears{n_years}.pdf'\n", "plt.savefig(figname)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "ExecuteTime": { "end_time": "2019-05-20T20:36:47.560155Z", "start_time": "2019-05-20T20:36:22.691141Z" }, "code_folding": [ 0 ] }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# GPI_eta in control run\n", "fig, axes = plt.subplots(1, 2, figsize=(8,3), sharey=True)\n", "dataname = 'eta'\n", "lat_slice = slice(-30,30)\n", "ctl_ens = das[f'{dataname}_ctl'].sel(lat=lat_slice)\n", "da = ( np.abs(ctl_ens)*1e5 ) ** (3/2)\n", "levels = 10#2**np.arange(-2, 7).astype('float')\n", "cbar_kws = {}#dict(ticks=[0.25, 1, 4, 16, 64], format='%.2g')\n", "\n", "ax = axes[0]\n", "da.sel(time='0001').mean(['time', 'en', 'lon']).plot(ax=ax, y='lat', color='C1')\n", "plt.autoscale()\n", "ax.set_ylabel('lat')\n", "ax.set_xlabel(f'Zonal mean GPI_{dataname}')\n", "ax.set_title('(a)', loc='left')\n", "\n", "ax = axes[1]\n", "\n", "da.sel(time='0001').mean(['time', 'en']).rename(f'GPI_{dataname}') \\\n", " .plot.contourf(ax=ax, robust=False, levels=levels, cbar_kwargs=cbar_kws, cmap='Oranges')\n", "mapplot(coastlines_width=1/2)\n", "plt.ylabel('')\n", "ax.set_yticks(range(-45, 46, 15))\n", "ax.set_yticklabels([f'{-n}$^\\circ$S' for n in range(-45,0,15)]\n", " + ['0']\n", " + [f'{n}$^\\circ$S' for n in range(15, 46, 15)])\n", "ax.set_title('(b)', loc='left')\n", "ax.set_ylim(lat_slice.start, lat_slice.stop)\n", "\n", "\n", "plt.tight_layout()\n", "axscale(axes[0], right=-0.5)\n", "axscale(axes[1], left=0.6)\n", "\n", "plt.savefig(f'figs/fig_GPI_{dataname}_ctl.pdf')" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "ExecuteTime": { "end_time": "2019-05-21T17:31:08.094929Z", "start_time": "2019-05-21T17:30:28.676431Z" }, "code_folding": [] }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# fig GPI_eta n_years = 3 smoothed percentage\n", "fig, axes = plt.subplots(3, 2, figsize=(8, 8), sharey=True, sharex='col')\n", "dataname = 'eta'\n", "lat_slice = slice(-30,30)\n", "ctl_ens = ( np.abs( das[f'{dataname}_ctl'].sel(lat=lat_slice) ) * 1e5 )** (3/2)\n", "dvs = dict()\n", "for volc in ('Pinatubo', 'Agung', 'StMaria'):\n", " dvs[volc] = ( np.abs( das[f'{dataname}_{volc}'].sel(lat=lat_slice) ) * 1e5 )**(3/2)\n", "n_years = 3\n", "# lv = 2**np.arange(-3, 4.1)\n", "levels = np.arange(-16,17,2) # list(-lv[-1::-1]) + [0,] + list(lv)\n", "coastline_width = .5\n", "cbar_ticks = None#(-16, -4, -1, -0.25, 0, 0.25, 1, 4, 16)\n", "cbar_format = None#'%.2g'\n", "alpha=0.2\n", "hatches = ['//////']\n", "\n", "ax = axes[0, 0]\n", "volc_name, tag, mon_start = 'Pinatubo', 'Pinatubo', 6\n", "color = 'k'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en', 'lon'])\n", "spread = spread/ctl*100\n", "ts = ts.mean('en')/ctl*100\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='k')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color=color, alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(a) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "\n", "ax = axes[1, 0]\n", "# plt.sca(ax)\n", "# ax.set_aspect(aspect)\n", "# plt.sca(ax)\n", "volc_name, tag, mon_start = 'Agung', 'Agung', 3\n", "color = 'C0'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en', 'lon'])\n", "spread = spread/ctl*100\n", "ts = ts.mean('en')/ctl*100\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C0')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C0', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(c) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[2, 0]\n", "volc_name, tag, mon_start = 'StMaria', 'StMaria', 10\n", "color = 'C1'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en', 'lon'])\n", "spread = spread/ctl*100\n", "ts = ts.mean('en')/ctl*100\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C1')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C1', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(e) {tag}', loc='left')\n", "ax.set_xlabel(f'Zonal mean GPI_{dataname} % change')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[0, 1]\n", "volc_name, mon_start = 'Pinatubo', 6\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en'])\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "spread = spread/ctl*100\n", "da = da/ctl*100\n", "da.rename('%').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(b)', loc='left')\n", "# expand_ax(ax)\n", "ax.text(1, 1.02, f'n_years = {n_years}', \n", " transform=ax.transAxes, ha='right', va='bottom')\n", "\n", "ax = axes[1, 1]\n", "volc_name, mon_start = 'Agung', 3\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time')\n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en'])\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "spread = spread/ctl*100\n", "da = da/ctl*100\n", "da.rename('%').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(d)', loc='left')\n", "# expand_ax(ax)\n", "\n", "\n", "\n", "ax = axes[2, 1]\n", "plt.sca(ax)\n", "volc_name, mon_start = 'StMaria', 10\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en'])\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "spread = spread/ctl*100\n", "da = da/ctl*100\n", "da.rename('%').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "ax.set_yticks(np.arange(-45,46,15))\n", "ax.set_yticklabels(['45$^\\circ$S', '30$^\\circ$S', '15$^\\circ$S', '0', '15$^\\circ$N', '30$^\\circ$N', '45$^\\circ$N'])\n", "plt.title('(f)', loc='left')\n", "# yticks2lat(np.arange(-45,46,15))\n", "# expand_ax(ax)\n", "\n", "\n", "ax.set_ylim(-30, 30)\n", "plt.tight_layout()\n", "for ax in axes[:, 0]:\n", " axscale(ax, right=-0.5)\n", "for ax in axes[:, 1]:\n", " axscale(ax, left=0.6)\n", "\n", "figname = f'figs/fig_GPI_{dataname}_nyears{n_years}_smoothedPercent.pdf'\n", "plt.savefig(figname)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### fig GPI_H" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "ExecuteTime": { "end_time": "2019-05-21T19:27:24.658662Z", "start_time": "2019-05-21T19:27:16.006065Z" }, "code_folding": [] }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# fig GPI_H n_years = 3, smoothed\n", "fig, axes = plt.subplots(3, 2, figsize=(8, 8), sharey=True, sharex='col')\n", "dataname = 'H'\n", "lat_slice = slice(-30,30)\n", "ctl_ens = ( das[f'{dataname}_ctl'].sel(lat=lat_slice) /50 )** 3\n", "dvs = dict()\n", "for volc in ('Pinatubo', 'Agung', 'StMaria'):\n", " dvs[volc] = ( das[f'{dataname}_{volc}'].sel(lat=lat_slice) / 50 )**3\n", "n_years = 3\n", "# lv = 2**np.arange(-3, 4.1)\n", "levels = np.arange(-0.25,0.26,0.05) # list(-lv[-1::-1]) + [0,] + list(lv)\n", "coastline_width = .5\n", "cbar_ticks = None#(-16, -4, -1, -0.25, 0, 0.25, 1, 4, 16)\n", "cbar_format = None#'%.2g'\n", "alpha=0.2\n", "hatches = ['//////']\n", "\n", "ax = axes[0, 0]\n", "volc_name, tag, mon_start = 'Pinatubo', 'Pinatubo', 6\n", "color = 'k'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='k')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color=color, alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(a) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "\n", "ax = axes[1, 0]\n", "# plt.sca(ax)\n", "# ax.set_aspect(aspect)\n", "# plt.sca(ax)\n", "volc_name, tag, mon_start = 'Agung', 'Agung', 3\n", "color = 'C0'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C0')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C0', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(c) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[2, 0]\n", "volc_name, tag, mon_start = 'StMaria', 'StMaria', 10\n", "color = 'C1'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C1')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C1', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(e) {tag}', loc='left')\n", "ax.set_xlabel(f'Zonal mean GPI_{dataname}')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[0, 1]\n", "volc_name, mon_start = 'Pinatubo', 6\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'GPI_{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(b)', loc='left')\n", "# expand_ax(ax)\n", "ax.text(1, 1.02, f'n_years = {n_years}', \n", " transform=ax.transAxes, ha='right', va='bottom')\n", "\n", "ax = axes[1, 1]\n", "volc_name, mon_start = 'Agung', 3\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time')\n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'GPI_{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(d)', loc='left')\n", "# expand_ax(ax)\n", "\n", "\n", "\n", "ax = axes[2, 1]\n", "plt.sca(ax)\n", "volc_name, mon_start = 'StMaria', 10\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'GPI_{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "ax.set_yticks(np.arange(-45,46,15))\n", "ax.set_yticklabels(['45$^\\circ$S', '30$^\\circ$S', '15$^\\circ$S', '0', '15$^\\circ$N', '30$^\\circ$N', '45$^\\circ$N'])\n", "plt.title('(f)', loc='left')\n", "# yticks2lat(np.arange(-45,46,15))\n", "# expand_ax(ax)\n", "\n", "\n", "ax.set_ylim(lat_slice.start, lat_slice.stop)\n", "plt.tight_layout()\n", "for ax in axes[:, 0]:\n", " axscale(ax, right=-0.5)\n", "for ax in axes[:, 1]:\n", " axscale(ax, left=0.6)\n", "\n", "figname = f'figs/fig_GPI_{dataname}_nyears{n_years}.pdf'\n", "plt.savefig(figname)" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "ExecuteTime": { "end_time": "2019-05-21T16:47:10.522991Z", "start_time": "2019-05-21T16:46:27.930154Z" }, "code_folding": [ 0 ], "scrolled": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# GPI_Vpot in control run\n", "fig, axes = plt.subplots(1, 2, figsize=(8,3), sharey=True)\n", "dataname = 'Vpot'\n", "lat_slice = slice(-30,30)\n", "ctl_ens = das[f'{dataname}_ctl'].sel(lat=lat_slice)\n", "da = ( ctl_ens/70 ) ** 3\n", "levels = 10#2**np.arange(-2, 7).astype('float')\n", "cbar_kws = {}#dict(ticks=[0.25, 1, 4, 16, 64], format='%.2g')\n", "\n", "ax = axes[0]\n", "da.sel(time='0001').mean(['time', 'en', 'lon']).plot(ax=ax, y='lat', color='C1')\n", "plt.autoscale()\n", "ax.set_ylabel('lat')\n", "ax.set_xlabel(f'Zonal mean GPI_{dataname}')\n", "ax.set_title('(a)', loc='left')\n", "\n", "ax = axes[1]\n", "\n", "da.sel(time='0001').mean(['time', 'en']).rename(f'GPI_{dataname}') \\\n", " .plot.contourf(ax=ax, robust=False, levels=levels, cbar_kwargs=cbar_kws, cmap='Oranges')\n", "mapplot(coastlines_width=1/2)\n", "plt.ylabel('')\n", "ax.set_yticks(range(-45, 46, 15))\n", "ax.set_yticklabels([f'{-n}$^\\circ$S' for n in range(-45,0,15)]\n", " + ['0']\n", " + [f'{n}$^\\circ$S' for n in range(15, 46, 15)])\n", "ax.set_title('(b)', loc='left')\n", "ax.set_ylim(lat_slice.start, lat_slice.stop)\n", "\n", "\n", "plt.tight_layout()\n", "axscale(axes[0], right=-0.5)\n", "axscale(axes[1], left=0.6)\n", "\n", "plt.savefig(f'figs/fig_GPI_{dataname}_ctl.pdf')" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "ExecuteTime": { "end_time": "2019-05-21T17:37:37.847300Z", "start_time": "2019-05-21T17:36:59.730738Z" }, "code_folding": [] }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# fig GPI_Vpot n_years = 3 smoothed percentage\n", "fig, axes = plt.subplots(3, 2, figsize=(8, 8), sharey=True, sharex='col')\n", "dataname = 'Vpot'\n", "lat_slice = slice(-30,30)\n", "ctl_ens = ( das[f'{dataname}_ctl'].sel(lat=lat_slice) /70 )** 3\n", "dvs = dict()\n", "for volc in ('Pinatubo', 'Agung', 'StMaria'):\n", " dvs[volc] = ( das[f'{dataname}_{volc}'].sel(lat=lat_slice) / 70 )**3\n", "n_years = 3\n", "# lv = 2**np.arange(-3, 4.1)\n", "levels = np.arange(-20,21,2) # list(-lv[-1::-1]) + [0,] + list(lv)\n", "coastline_width = .5\n", "cbar_ticks = None#(-16, -4, -1, -0.25, 0, 0.25, 1, 4, 16)\n", "cbar_format = None#'%.2g'\n", "alpha=0.2\n", "hatches = ['//////']\n", "\n", "ax = axes[0, 0]\n", "volc_name, tag, mon_start = 'Pinatubo', 'Pinatubo', 6\n", "color = 'k'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en', 'lon'])\n", "spread = spread/ctl*100\n", "ts = ts.mean('en')/ctl*100\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='k')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color=color, alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(a) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "\n", "ax = axes[1, 0]\n", "# plt.sca(ax)\n", "# ax.set_aspect(aspect)\n", "# plt.sca(ax)\n", "volc_name, tag, mon_start = 'Agung', 'Agung', 3\n", "color = 'C0'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en', 'lon'])\n", "spread = spread/ctl*100\n", "ts = ts.mean('en')/ctl*100\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C0')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C0', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(c) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[2, 0]\n", "volc_name, tag, mon_start = 'StMaria', 'StMaria', 10\n", "color = 'C1'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en', 'lon'])\n", "spread = spread/ctl*100\n", "ts = ts.mean('en')/ctl*100\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C1')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C1', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(e) {tag}', loc='left')\n", "ax.set_xlabel(f'Zonal mean GPI_{dataname} % change')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[0, 1]\n", "volc_name, mon_start = 'Pinatubo', 6\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en'])\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "spread = spread/ctl*100\n", "da = da/ctl*100\n", "da.rename('%').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(b)', loc='left')\n", "# expand_ax(ax)\n", "ax.text(1, 1.02, f'n_years = {n_years}', \n", " transform=ax.transAxes, ha='right', va='bottom')\n", "\n", "ax = axes[1, 1]\n", "volc_name, mon_start = 'Agung', 3\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time')\n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en'])\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "spread = spread/ctl*100\n", "da = da/ctl*100\n", "da.rename('%').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(d)', loc='left')\n", "# expand_ax(ax)\n", "\n", "\n", "\n", "ax = axes[2, 1]\n", "plt.sca(ax)\n", "volc_name, mon_start = 'StMaria', 10\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "ctl = ctl_ens.isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean(['time', 'en'])\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "spread = spread/ctl*100\n", "da = da/ctl*100\n", "da.rename('%').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "ax.set_yticks(np.arange(-45,46,15))\n", "ax.set_yticklabels(['45$^\\circ$S', '30$^\\circ$S', '15$^\\circ$S', '0', '15$^\\circ$N', '30$^\\circ$N', '45$^\\circ$N'])\n", "plt.title('(f)', loc='left')\n", "# yticks2lat(np.arange(-45,46,15))\n", "# expand_ax(ax)\n", "\n", "\n", "ax.set_ylim(-30, 30)\n", "plt.tight_layout()\n", "for ax in axes[:, 0]:\n", " axscale(ax, right=-0.5)\n", "for ax in axes[:, 1]:\n", " axscale(ax, left=0.6)\n", "\n", "figname = f'figs/fig_GPI_{dataname}_nyears{n_years}_smoothedPercent.pdf'\n", "plt.savefig(figname)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### fig GPI_Vshear" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "ExecuteTime": { "end_time": "2019-05-21T19:28:53.634248Z", "start_time": "2019-05-21T19:28:44.450655Z" }, "code_folding": [], "scrolled": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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('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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# fig GPI_Vshear n_years = 3, smoothed\n", "fig, axes = plt.subplots(3, 2, figsize=(8, 8), sharey=True, sharex='col')\n", "dataname = 'Vshear'\n", "lat_slice = slice(-30,30)\n", "ctl_ens = ( 1 + 0.1*das[f'{dataname}_ctl'].sel(lat=lat_slice) )** (-2)\n", "dvs = dict()\n", "for volc in ('Pinatubo', 'Agung', 'StMaria'):\n", " dvs[volc] = ( 1 + 0.1*das[f'{dataname}_{volc}'].sel(lat=lat_slice) )**(-2)\n", "n_years = 3\n", "# lv = 2**np.arange(-3, 4.1)\n", "levels = 10#np.arange(-0.25,0.26,0.05) # list(-lv[-1::-1]) + [0,] + list(lv)\n", "coastline_width = .5\n", "cbar_ticks = None#(-16, -4, -1, -0.25, 0, 0.25, 1, 4, 16)\n", "cbar_format = None#'%.2g'\n", "alpha=0.2\n", "hatches = ['//////']\n", "\n", "ax = axes[0, 0]\n", "volc_name, tag, mon_start = 'Pinatubo', 'Pinatubo', 6\n", "color = 'k'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='k')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color=color, alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(a) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "\n", "ax = axes[1, 0]\n", "# plt.sca(ax)\n", "# ax.set_aspect(aspect)\n", "# plt.sca(ax)\n", "volc_name, tag, mon_start = 'Agung', 'Agung', 3\n", "color = 'C0'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C0')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C0', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "ax.set_xlabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(c) {tag}', loc='left')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[2, 0]\n", "volc_name, tag, mon_start = 'StMaria', 'StMaria', 10\n", "color = 'C1'\n", "ts = dvs[volc_name].pipe(lambda x: x-ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \\\n", " .mean('lon')\n", "spread = p2t(0.05, df=ts.en.size-1) * ts.std('en') * ts.en.size**(-1/2)\n", "ts = ts.mean('en')\n", "ts.plot(ax=ax, y='lat', label=tag, lw=1.5, color='C1')\n", "ax.fill_betweenx(y=ts.lat, x1=ts-spread, x2=ts+spread, color='C1', alpha=alpha)\n", "ax.autoscale()\n", "ax.set_ylim(-30, 30)\n", "ax.set_ylabel('')\n", "# ax.grid('on')\n", "ax.set_title(f'(e) {tag}', loc='left')\n", "ax.set_xlabel(f'Zonal mean GPI_{dataname}')\n", "ax.set_yticks(range(-45,46,15))\n", "ax.axhline(0, color='gray', lw=1, ls='--')\n", "ax.axvline(0, color='gray', lw=1, ls='--')\n", "\n", "ax = axes[0, 1]\n", "volc_name, mon_start = 'Pinatubo', 6\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'GPI_{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(b)', loc='left')\n", "# expand_ax(ax)\n", "ax.text(1, 1.02, f'n_years = {n_years}', \n", " transform=ax.transAxes, ha='right', va='bottom')\n", "\n", "ax = axes[1, 1]\n", "volc_name, mon_start = 'Agung', 3\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time')\n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'GPI_{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "plt.title('(d)', loc='left')\n", "# expand_ax(ax)\n", "\n", "\n", "\n", "ax = axes[2, 1]\n", "plt.sca(ax)\n", "volc_name, mon_start = 'StMaria', 10\n", "da = dvs[volc_name].pipe(lambda x: x - ctl_ens.assign_coords(time=x.time)) \\\n", " .isel(time=slice(mon_start-1, mon_start-1 + n_years*12)).mean('time') \n", "da = da.rolling(lon=9, center=True, min_periods=1).mean() \\\n", " .rolling(lat=9, center=True, min_periods=1).mean()\n", "spread = p2t(0.05, df=da.en.size-1) * da.std('en') * da.en.size**(-1/2)\n", "da = da.mean('en')\n", "sigmask = np.abs(da) > spread\n", "da.rename(f'GPI_{dataname}').plot(ax=ax, levels=levels, cbar_kwargs={'ticks': cbar_ticks, 'format': cbar_format}, rasterized=True)\n", "da.where(sigmask).pipe(lambda x: x*0).plot.contourf(ax=ax, colors='none', hatches=hatches, \n", " add_colorbar=False)\n", "mapplot(ax=ax, lon=da.lon, lat=(-50, 50), linewidth=coastline_width)\n", "ax.set_xlabel('')\n", "ax.set_ylabel('')\n", "ax.set_yticks(np.arange(-45,46,15))\n", "ax.set_yticklabels(['45$^\\circ$S', '30$^\\circ$S', '15$^\\circ$S', '0', '15$^\\circ$N', '30$^\\circ$N', '45$^\\circ$N'])\n", "plt.title('(f)', loc='left')\n", "# yticks2lat(np.arange(-45,46,15))\n", "# expand_ax(ax)\n", "\n", "\n", "ax.set_ylim(lat_slice.start, lat_slice.stop)\n", "plt.tight_layout()\n", "for ax in axes[:, 0]:\n", " axscale(ax, right=-0.5)\n", "for ax in axes[:, 1]:\n", " axscale(ax, left=0.6)\n", "\n", "figname = f'figs/fig_GPI_{dataname}_nyears{n_years}.pdf'\n", "plt.savefig(figname)" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "ExecuteTime": { "end_time": "2019-05-21T15:50:24.437578Z", "start_time": "2019-05-21T15:49:38.604886Z" }, "code_folding": [ 0 ], "scrolled": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\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", " fig.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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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 = $('