{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Volcanic Forcings and Feedback\n", "* Wenchang Yang (wenchang@princeton.edu)\n", "* Department of Geoscience, Princeton University" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2019-05-14T16:33:36.764043Z", "start_time": "2019-05-14T16:33:22.679074Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[2021-06-08_13:43:59]: start //home/wenchang/wython/wystart.py\n", "[imported]: os.path, sys, os, datetime, glob\n", "[imported]: xarray(0.18.2) as xr, numpy(1.20.3) as np, pandas(1.2.4) as pd, matplotlib(3.4.2) as mpl\n", "[imported]: import matplotlib.pyplot as plt\n", "\n", "**wython plot settings (//home/wenchang/wython/wyconfig.py)**\n", "[config]: plt.rcParams['figure.dpi'] = 128.0\n", "[config]: plt.rcParams['figure.figsize'] = [6.4, 6.4*9/16]\n", "[config]: plt.rcParams['figure.constrained_layout.use'] = True\n", " plt.tight_layout() is NOT needed if plt.rcParams['figure.constrained_layout.use'] = True\n", "[registered colormaps]: tc and tc_r\n", "[registered colormaps]: parula and parula_r\n", "[imported]: import misc.colormaps\n", "[config]: xr.set_options(cmap_sequential=\"parula\")\n", "[shortcut functions]:\n", " constrained_layout_on(): plt.rcParams['figure.constrained_layout.use'] = True\n", " constrained_layout_off(): plt.rcParams['figure.constrained_layout.use'] = False\n", "[iPython config]: InlineBackend.figure_format ='retina'\n", "[imported]: from matplotlib.pyplot import plot, figure, close, show\n", "[executed]: plt.ion()\n", "\n", "[2021-06-08_13:44:10]: **done**; **11** seconds from \"start //home/wenchang/wython/wystart.py\"\n" ] } ], "source": [ "%run -im wystart" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2019-05-14T17:38:35.017843Z", "start_time": "2019-05-14T17:38:35.013964Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[added]: PROJ_LIB = /tigress/wenchang/miniconda3/share/proj\n" ] } ], "source": [ "from lib.util import year_shift\n", "import xlearn\n", "import seaborn as sns\n", "from mystats import p2t\n", "import geoxarray\n", "%matplotlib notebook" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2019-05-14T16:33:45.005422Z", "start_time": "2019-05-14T16:33:44.670832Z" } }, "outputs": [], "source": [ "land_mask = xr.open_dataset('/tigress/wenchang/MODEL_OUT/CTL1860_noleap_tigercpu_intelmpi_18_576PE/POSTP/00010101.atmos_month.nc') \\\n", " .land_mask.rename({'grid_xt': 'lon', 'grid_yt': 'lat'})" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2019-05-14T16:45:58.415494Z", "start_time": "2019-05-14T16:33:47.415404Z" }, "code_folding": [], "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Agung_netrad_toa\n", "Agung_netrad_toa_nh\n", "Agung_netrad_toa_sh\n", "StMaria_netrad_toa\n", "StMaria_netrad_toa_nh\n", "StMaria_netrad_toa_sh\n", "Pinatubo_netrad_toa\n", "Pinatubo_netrad_toa_nh\n", "Pinatubo_netrad_toa_sh\n", "Agung_ctl_netrad_toa\n", "Agung_ctl_netrad_toa_nh\n", "Agung_ctl_netrad_toa_sh\n", "StMaria_ctl_netrad_toa\n", "StMaria_ctl_netrad_toa_nh\n", "StMaria_ctl_netrad_toa_sh\n", "Pinatubo_ctl_netrad_toa\n", "Pinatubo_ctl_netrad_toa_nh\n", "Pinatubo_ctl_netrad_toa_sh\n", "Agung_t_surf\n", "Agung_t_surf_nh\n", "Agung_t_surf_sh\n", "StMaria_t_surf\n", "StMaria_t_surf_nh\n", "StMaria_t_surf_sh\n", "Pinatubo_t_surf\n", "Pinatubo_t_surf_nh\n", "Pinatubo_t_surf_sh\n", "Agung_ctl_t_surf\n", "Agung_ctl_t_surf_nh\n", "Agung_ctl_t_surf_sh\n", "StMaria_ctl_t_surf\n", "StMaria_ctl_t_surf_nh\n", "StMaria_ctl_t_surf_sh\n", "Pinatubo_ctl_t_surf\n", "Pinatubo_ctl_t_surf_nh\n", "Pinatubo_ctl_t_surf_sh\n", "Agung_nudge_netrad_toa\n", "Agung_nudge_netrad_toa_nh\n", "Agung_nudge_netrad_toa_sh\n", "StMaria_nudge_netrad_toa\n", "StMaria_nudge_netrad_toa_nh\n", "StMaria_nudge_netrad_toa_sh\n", "Pinatubo_nudge_netrad_toa\n", "Pinatubo_nudge_netrad_toa_nh\n", "Pinatubo_nudge_netrad_toa_sh\n", "Agung_nudge_ctl_netrad_toa\n", "Agung_nudge_ctl_netrad_toa_nh\n", "Agung_nudge_ctl_netrad_toa_sh\n", "StMaria_nudge_ctl_netrad_toa\n", "StMaria_nudge_ctl_netrad_toa_nh\n", "StMaria_nudge_ctl_netrad_toa_sh\n", "Pinatubo_nudge_ctl_netrad_toa\n", "Pinatubo_nudge_ctl_netrad_toa_nh\n", "Pinatubo_nudge_ctl_netrad_toa_sh\n" ] } ], "source": [ "# data\n", "if 'das' in globals() or 'das' in locals():\n", " pass\n", "else:\n", " das = dict()\n", "\n", "volcs = ['Agung', 'StMaria', 'Pinatubo']\n", "years = [1963, 1902, 1991]\n", "\n", "# non-nudged\n", "datanames = ('netrad_toa', 't_surf',)# 'precip')\n", "for dataname in datanames:\n", " # volc\n", " ifiles = [f'data/{volc}_PI_ens_noleap.atmos_month.{dataname}.nc'\n", " for volc in volcs]\n", " for volc, ifile in zip(volcs, ifiles):\n", " key = f'{volc}_{dataname}'\n", " if key in das.keys():\n", " print('\\t[Exists]:', key)\n", " else:\n", " print(key)\n", " da = xr.open_dataarray(ifile).geo.fldmean()\n", " das[key] = da\n", "\n", " # NH \n", " key_ = key + '_nh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(0,90)).geo.fldmean()\n", " das[key_] = da\n", "\n", "\n", " # SH\n", " key_ = key + '_sh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(-90,0)).geo.fldmean()\n", " das[key_] = da\n", " \n", " if dataname in ('precip',):\n", " # global land \n", " key_ = key + '_land'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).where(land_mask>0.5).geo.fldmean()\n", " das[key_] = da\n", "\n", " # NH land\n", " key_ = key + '_nhland'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).where(land_mask>0.5).sel(lat=slice(0,90)).geo.fldmean()\n", " das[key_] = da\n", "\n", " # SH land\n", " key_ = key + '_shland'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).where(land_mask>0.5).sel(lat=slice(-90,0)).geo.fldmean()\n", " das[key_] = da\n", "\n", "\n", " # ctl\n", " ifile = f'data/CTL1860_noleap_tigercpu_intelmpi_18_576PE.atmos_month.{dataname}.nc'\n", " for volc, year in zip(volcs, years):\n", " key = f'{volc}_ctl_{dataname}'\n", " if key in das.keys():\n", " print('\\t[Exists]:', key)\n", " else:\n", " print(key)\n", " da = xr.open_dataarray(ifile).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key] = da\n", "\n", " # NH \n", " key_ = key + '_nh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(0,90)).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n", "\n", " # SH\n", " key_ = key + '_sh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(-90,0)).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n", " \n", " if dataname in ('precip',):\n", " # global land \n", " key_ = key + '_land'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).where(land_mask>0.5).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n", "\n", " # NH land\n", " key_ = key + '_nhland'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).where(land_mask>0.5).sel(lat=slice(0,90)).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n", "\n", " # SH land\n", " key_ = key + '_shland'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).where(land_mask>0.5).sel(lat=slice(-90,0)).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n", "\n", "\n", "# nudged\n", "datanames = ('netrad_toa',)\n", "for dataname in datanames:\n", " # volc_nudge\n", " ifiles = [f'data/{volc}_ens_noleap_nudgeclimo_all_model1860.atmos_month.{dataname}.nc'\n", " for volc in volcs]\n", " for volc, ifile in zip(volcs, ifiles):\n", " key = f'{volc}_nudge_{dataname}'\n", " if key in das.keys():\n", " print('\\t[Exists]:', key)\n", " else:\n", " print(key)\n", " da = xr.open_dataarray(ifile).geo.fldmean()\n", " das[key] = da\n", "\n", " # NH \n", " key_ = key + '_nh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(0,90)).geo.fldmean()\n", " das[key_] = da\n", "\n", "\n", " # SH\n", " key_ = key + '_sh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(-90,0)).geo.fldmean()\n", " das[key_] = da\n", "\n", " # ctl_nudge\n", " ifile = f'data/nudgeclimo_all_model_CTL1860_tigercpu_intelmpi_18_576PE.atmos_month.{dataname}.nc'\n", " for volc, year in zip(volcs, years):\n", " key = f'{volc}_nudge_ctl_{dataname}'\n", " if key in das.keys():\n", " print('\\t[Exists]:', key)\n", " else:\n", " print(key)\n", " da = xr.open_dataarray(ifile).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key] = da\n", "\n", " # NH \n", " key_ = key + '_nh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(0,90)).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n", "\n", "\n", " # SH\n", " key_ = key + '_sh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(-90,0)).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "ExecuteTime": { "end_time": "2019-05-28T20:51:07.218758Z", "start_time": "2019-05-28T20:49:24.182668Z" }, "code_folding": [ 0 ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Agung_nudge_t_surf\n", "Agung_nudge_t_surf_nh\n", "Agung_nudge_t_surf_sh\n", "StMaria_nudge_t_surf\n", "StMaria_nudge_t_surf_nh\n", "StMaria_nudge_t_surf_sh\n", "Pinatubo_nudge_t_surf\n", "Pinatubo_nudge_t_surf_nh\n", "Pinatubo_nudge_t_surf_sh\n", "Agung_nudge_ctl_t_surf\n", "Agung_nudge_ctl_t_surf_nh\n", "Agung_nudge_ctl_t_surf_sh\n", "StMaria_nudge_ctl_t_surf\n", "StMaria_nudge_ctl_t_surf_nh\n", "StMaria_nudge_ctl_t_surf_sh\n", "Pinatubo_nudge_ctl_t_surf\n", "Pinatubo_nudge_ctl_t_surf_nh\n", "Pinatubo_nudge_ctl_t_surf_sh\n" ] } ], "source": [ "# nudged\n", "datanames = ('t_surf',)\n", "for dataname in datanames:\n", " # volc_nudge\n", " ifiles = [f'data/{volc}_ens_noleap_nudgeclimo_all_model1860.atmos_month.{dataname}.nc'\n", " for volc in volcs]\n", " for volc, ifile in zip(volcs, ifiles):\n", " key = f'{volc}_nudge_{dataname}'\n", " if key in das.keys():\n", " print('\\t[Exists]:', key)\n", " else:\n", " print(key)\n", " da = xr.open_dataarray(ifile).geo.fldmean()\n", " das[key] = da\n", "\n", " # NH \n", " key_ = key + '_nh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(0,90)).geo.fldmean()\n", " das[key_] = da\n", "\n", "\n", " # SH\n", " key_ = key + '_sh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(-90,0)).geo.fldmean()\n", " das[key_] = da\n", "\n", " # ctl_nudge\n", " ifile = f'data/nudgeclimo_all_model_CTL1860_tigercpu_intelmpi_18_576PE.atmos_month.{dataname}.nc'\n", " for volc, year in zip(volcs, years):\n", " key = f'{volc}_nudge_ctl_{dataname}'\n", " if key in das.keys():\n", " print('\\t[Exists]:', key)\n", " else:\n", " print(key)\n", " da = xr.open_dataarray(ifile).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key] = da\n", "\n", " # NH \n", " key_ = key + '_nh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(0,90)).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n", "\n", "\n", " # SH\n", " key_ = key + '_sh'\n", " if key_ in das.keys():\n", " print('\\t[Exists]:', key_)\n", " else:\n", " print(key_)\n", " da = xr.open_dataarray(ifile).sel(lat=slice(-90,0)).geo.fldmean()\n", " da = year_shift(da, n=year-1, to_datetime=True)\n", " das[key_] = da\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## netrad_toa" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "ExecuteTime": { "end_time": "2018-09-05T19:53:14.902423Z", "start_time": "2018-09-05T19:53:14.513559Z" }, "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.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", " 'ui-button-icon-only');\n", " button.attr('role', 'button');\n", " button.attr('aria-disabled', 'false');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", "\n", " var icon_img = $('');\n", " icon_img.addClass('ui-button-icon-primary ui-icon');\n", " icon_img.addClass(image);\n", " icon_img.addClass('ui-corner-all');\n", "\n", " var tooltip_span = $('');\n", " tooltip_span.addClass('ui-button-text');\n", " tooltip_span.html(tooltip);\n", "\n", " button.append(icon_img);\n", " button.append(tooltip_span);\n", "\n", " nav_element.append(button);\n", " }\n", "\n", " var fmt_picker_span = $('');\n", "\n", " var fmt_picker = $('');\n", " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", " fmt_picker_span.append(fmt_picker);\n", " nav_element.append(fmt_picker_span);\n", " this.format_dropdown = fmt_picker[0];\n", "\n", " for (var ind in mpl.extensions) {\n", " var fmt = mpl.extensions[ind];\n", " var option = $(\n", " '', {selected: fmt === mpl.default_extension}).html(fmt);\n", " fmt_picker.append(option)\n", " }\n", "\n", " // Add hover states to the ui-buttons\n", " $( \".ui-button\" ).hover(\n", " function() { $(this).addClass(\"ui-state-hover\");},\n", " function() { $(this).removeClass(\"ui-state-hover\");}\n", " );\n", "\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "}\n", "\n", "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", " // which will in turn request a refresh of the image.\n", " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", "}\n", "\n", "mpl.figure.prototype.send_message = function(type, properties) {\n", " properties['type'] = type;\n", " properties['figure_id'] = this.id;\n", " this.ws.send(JSON.stringify(properties));\n", "}\n", "\n", "mpl.figure.prototype.send_draw_message = function() {\n", " if (!this.waiting) {\n", " this.waiting = true;\n", " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", " }\n", "}\n", "\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " var format_dropdown = fig.format_dropdown;\n", " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", " fig.ondownload(fig, format);\n", "}\n", "\n", "\n", "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", " var size = msg['size'];\n", " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", " fig._resize_canvas(size[0], size[1]);\n", " fig.send_message(\"refresh\", {});\n", " };\n", "}\n", "\n", "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", " var x0 = msg['x0'] / mpl.ratio;\n", " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", " var x1 = msg['x1'] / mpl.ratio;\n", " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", " x0 = Math.floor(x0) + 0.5;\n", " y0 = Math.floor(y0) + 0.5;\n", " x1 = Math.floor(x1) + 0.5;\n", " y1 = Math.floor(y1) + 0.5;\n", " var min_x = Math.min(x0, x1);\n", " var min_y = Math.min(y0, y1);\n", " var width = Math.abs(x1 - x0);\n", " var height = Math.abs(y1 - y0);\n", "\n", " fig.rubberband_context.clearRect(\n", " 0, 0, fig.canvas.width, fig.canvas.height);\n", "\n", " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", "}\n", "\n", "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", " // Updates the figure title.\n", " fig.header.textContent = msg['label'];\n", "}\n", "\n", "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", " var cursor = msg['cursor'];\n", " switch(cursor)\n", " {\n", " case 0:\n", " cursor = 'pointer';\n", " break;\n", " case 1:\n", " cursor = 'default';\n", " break;\n", " case 2:\n", " cursor = 'crosshair';\n", " break;\n", " case 3:\n", " cursor = 'move';\n", " break;\n", " }\n", " fig.rubberband_canvas.style.cursor = cursor;\n", "}\n", "\n", "mpl.figure.prototype.handle_message = function(fig, msg) {\n", " fig.message.textContent = msg['message'];\n", "}\n", "\n", "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", " // Request the server to send over a new figure.\n", " fig.send_draw_message();\n", "}\n", "\n", "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", " fig.image_mode = msg['mode'];\n", "}\n", "\n", "mpl.figure.prototype.updated_canvas_event = function() {\n", " // Called whenever the canvas gets updated.\n", " this.send_message(\"ack\", {});\n", "}\n", "\n", "// A function to construct a web socket function for onmessage handling.\n", "// Called in the figure constructor.\n", "mpl.figure.prototype._make_on_message_function = function(fig) {\n", " return function socket_on_message(evt) {\n", " if (evt.data instanceof Blob) {\n", " /* FIXME: We get \"Resource interpreted as Image but\n", " * transferred with MIME type text/plain:\" errors on\n", " * Chrome. But how to set the MIME type? It doesn't seem\n", " * to be part of the websocket stream */\n", " evt.data.type = \"image/png\";\n", "\n", " /* Free the memory for the previous frames */\n", " if (fig.imageObj.src) {\n", " (window.URL || window.webkitURL).revokeObjectURL(\n", " fig.imageObj.src);\n", " }\n", "\n", " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", " evt.data);\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " }\n", " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", " fig.imageObj.src = evt.data;\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " }\n", "\n", " var msg = JSON.parse(evt.data);\n", " var msg_type = msg['type'];\n", "\n", " // Call the \"handle_{type}\" callback, which takes\n", " // the figure and JSON message as its only arguments.\n", " try {\n", " var callback = fig[\"handle_\" + msg_type];\n", " } catch (e) {\n", " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", " return;\n", " }\n", "\n", " if (callback) {\n", " try {\n", " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", " callback(fig, msg);\n", " } catch (e) {\n", " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", " }\n", " }\n", " };\n", "}\n", "\n", "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", "mpl.findpos = function(e) {\n", " //this section is from http://www.quirksmode.org/js/events_properties.html\n", " var targ;\n", " if (!e)\n", " e = window.event;\n", " if (e.target)\n", " targ = e.target;\n", " else if (e.srcElement)\n", " targ = e.srcElement;\n", " if (targ.nodeType == 3) // defeat Safari bug\n", " targ = targ.parentNode;\n", "\n", " // jQuery normalizes the pageX and pageY\n", " // pageX,Y are the mouse positions relative to the document\n", " // offset() returns the position of the element relative to the document\n", " var x = e.pageX - $(targ).offset().left;\n", " var y = e.pageY - $(targ).offset().top;\n", "\n", " return {\"x\": x, \"y\": y};\n", "};\n", "\n", "/*\n", " * return a copy of an object with only non-object keys\n", " * we need this to avoid circular references\n", " * http://stackoverflow.com/a/24161582/3208463\n", " */\n", "function simpleKeys (original) {\n", " return Object.keys(original).reduce(function (obj, key) {\n", " if (typeof original[key] !== 'object')\n", " obj[key] = original[key]\n", " return obj;\n", " }, {});\n", "}\n", "\n", "mpl.figure.prototype.mouse_event = function(event, name) {\n", " var canvas_pos = mpl.findpos(event)\n", "\n", " if (name === 'button_press')\n", " {\n", " this.canvas.focus();\n", " this.canvas_div.focus();\n", " }\n", "\n", " var x = canvas_pos.x * mpl.ratio;\n", " var y = canvas_pos.y * mpl.ratio;\n", "\n", " this.send_message(name, {x: x, y: y, button: event.button,\n", " step: event.step,\n", " guiEvent: simpleKeys(event)});\n", "\n", " /* This prevents the web browser from automatically changing to\n", " * the text insertion cursor when the button is pressed. We want\n", " * to control all of the cursor setting manually through the\n", " * 'cursor' event from matplotlib */\n", " event.preventDefault();\n", " return false;\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " // Handle any extra behaviour associated with a key event\n", "}\n", "\n", "mpl.figure.prototype.key_event = function(event, name) {\n", "\n", " // Prevent repeat events\n", " if (name == 'key_press')\n", " {\n", " if (event.which === this._key)\n", " return;\n", " else\n", " this._key = event.which;\n", " }\n", " if (name == 'key_release')\n", " this._key = null;\n", "\n", " var value = '';\n", " if (event.ctrlKey && event.which != 17)\n", " value += \"ctrl+\";\n", " if (event.altKey && event.which != 18)\n", " value += \"alt+\";\n", " if (event.shiftKey && event.which != 16)\n", " value += \"shift+\";\n", "\n", " value += 'k';\n", " value += event.which.toString();\n", "\n", " this._key_event_extra(event, name);\n", "\n", " this.send_message(name, {key: value,\n", " guiEvent: simpleKeys(event)});\n", " return false;\n", "}\n", "\n", "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", " if (name == 'download') {\n", " this.handle_save(this, null);\n", " } else {\n", " this.send_message(\"toolbar_button\", {name: name});\n", " }\n", "};\n", "\n", "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", " this.message.textContent = tooltip;\n", "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", "\n", "mpl.default_extension = \"pdf\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", " // object with the appropriate methods. Currently this is a non binary\n", " // socket, so there is still some room for performance tuning.\n", " var ws = {};\n", "\n", " ws.close = function() {\n", " comm.close()\n", " };\n", " ws.send = function(m) {\n", " //console.log('sending', m);\n", " comm.send(m);\n", " };\n", " // Register the callback with on_msg.\n", " comm.on_msg(function(msg) {\n", " //console.log('receiving', msg['content']['data'], msg);\n", " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", " ws.onmessage(msg['content']['data'])\n", " });\n", " return ws;\n", "}\n", "\n", "mpl.mpl_figure_comm = function(comm, msg) {\n", " // This is the function which gets called when the mpl process\n", " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", "\n", " var id = msg.content.data.id;\n", " // Get hold of the div created by the display call when the Comm\n", " // socket was opened in Python.\n", " var element = $(\"#\" + id);\n", " var ws_proxy = comm_websocket_adapter(comm)\n", "\n", " function ondownload(figure, format) {\n", " window.open(figure.imageObj.src);\n", " }\n", "\n", " var fig = new mpl.figure(id, ws_proxy,\n", " ondownload,\n", " element.get(0));\n", "\n", " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", " // web socket which is closed, not our websocket->open comm proxy.\n", " ws_proxy.onopen();\n", "\n", " fig.parent_element = element.get(0);\n", " fig.cell_info = mpl.find_output_cell(\"\");\n", " if (!fig.cell_info) {\n", " console.error(\"Failed to find cell for figure\", id, fig);\n", " return;\n", " }\n", "\n", " var output_index = fig.cell_info[2]\n", " var cell = fig.cell_info[0];\n", "\n", "};\n", "\n", "mpl.figure.prototype.handle_close = function(fig, msg) {\n", " var width = fig.canvas.width/mpl.ratio\n", " fig.root.unbind('remove')\n", "\n", " // Update the output cell to use the data from the current canvas.\n", " fig.push_to_output();\n", " var dataURL = fig.canvas.toDataURL();\n", " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", " // the notebook keyboard shortcuts fail.\n", " IPython.keyboard_manager.enable()\n", " $(fig.parent_element).html('| q | \n", "Tsdt | \n", "Ndt | \n", "
|---|---|---|
| en | \n", "\n", " | \n", " |
| 1 | \n", "-1.410777 | \n", "-2.396934 | \n", "
| 2 | \n", "-1.544913 | \n", "-3.641125 | \n", "
| 3 | \n", "-1.283308 | \n", "-3.332464 | \n", "
| 4 | \n", "-1.251664 | \n", "-2.989739 | \n", "
| 5 | \n", "-1.799976 | \n", "-3.113419 | \n", "
| 6 | \n", "-1.410317 | \n", "-2.606992 | \n", "
| 7 | \n", "-1.698044 | \n", "-3.613707 | \n", "
| 8 | \n", "-1.015986 | \n", "-3.683339 | \n", "
| 9 | \n", "-1.365102 | \n", "-2.939938 | \n", "
| 10 | \n", "-1.339806 | \n", "-2.724603 | \n", "
| 11 | \n", "-1.348999 | \n", "-2.780333 | \n", "
| 12 | \n", "-1.468885 | \n", "-2.832493 | \n", "
| 13 | \n", "-1.258269 | \n", "-3.861162 | \n", "
| 14 | \n", "-1.212877 | \n", "-3.179629 | \n", "
| 15 | \n", "-1.812860 | \n", "-2.942334 | \n", "
| 16 | \n", "-1.585625 | \n", "-2.622573 | \n", "
| 17 | \n", "-1.682549 | \n", "-2.780244 | \n", "
| 18 | \n", "-1.846676 | \n", "-3.413348 | \n", "
| 19 | \n", "-1.599941 | \n", "-2.786212 | \n", "
| 20 | \n", "-1.429933 | \n", "-3.916901 | \n", "
| 21 | \n", "-1.438541 | \n", "-4.547146 | \n", "
| 22 | \n", "-1.576373 | \n", "-3.577597 | \n", "
| 23 | \n", "-1.936339 | \n", "-3.184802 | \n", "
| 24 | \n", "-1.399108 | \n", "-4.457642 | \n", "
| 25 | \n", "-1.583301 | \n", "-3.778446 | \n", "
| 26 | \n", "-1.326066 | \n", "-2.187220 | \n", "
| 27 | \n", "-0.839537 | \n", "-3.636241 | \n", "
| 28 | \n", "-0.983941 | \n", "-4.171244 | \n", "
| 29 | \n", "-1.408472 | \n", "-4.162449 | \n", "
| 30 | \n", "-1.271095 | \n", "-3.043448 | \n", "