{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# VCS Text Objects \n", "\n", "Text objects allow you to insert text anywhere on a plot.\n", "\n", "To [download this Jupyter Notebook](VCS_Text_Objects.ipynb), right click on the link and choose \"Download Linked File As...\" or \"Save Link as...\". Remember where you saved the downloaded file, which should have an .ipynb extension. (You'll need to launch the Jupyter notebook or JupyterLab instance from the location where you store the notebook file.)\n", "\n", "For this particular notebook, you will also need to download the sample font file, **\"FFF_Tusj.ttf\"**, from the GitHub repository for this notebook: https://github.com/CDAT/Jupyter-notebooks/tree/master/vcs/VCS_Text_Objects. Save the font file in the same location as this notebook.\n", "\n", "One additional file, **\"clt.nc\"** is needed for the notebook. Follow the instructions in the [VCS Basics](https://cdat.llnl.gov/Jupyter-notebooks/vcs/VCS_Basics/VCS_Basics.html) or [VCS Principles](https://cdat.llnl.gov/Jupyter-notebooks/vcs/VCS_Principles/VCS_Principles.html) notebooks to download the \"clt.nc\" sample data file. Alternatively, copy the following lines of code into a new cell early on in this notebook and run the cell which will download the files to a \"sample data\" directory within the conda environment you are using to run this notebook.\n", "\n", "```\n", "import vcs\n", "import cdms2\n", "import os\n", "vcs.download_sample_data_files()\n", "```" ] }, { "cell_type": "markdown", "metadata": { "toc": true }, "source": [ "

Table of Contents

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Introduction\n", "\n", "[Back to Top](#top)\n", "\n", "The first code block below does the following:\n", "- imports the VCS library, \n", "- creates and initializes an 800 px by 600 px canvas called `canvas`, \n", "- creates a text object, `txt`, and \n", "- lists all the attributes of the text object using `txt.list()`.\n", "\n", "As the output of the last line of code shows, a VCS text object is composed of two VCS objects: a **Text Table** object and a **Text Orientation** object. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import vcs\n", "canvas=vcs.init(geometry=(800,600),bg=True)\n", "txt = vcs.createtext()\n", "txt.list()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The **Text Table** is mainly used to control the following:\n", "\n", "- font: which font to use\n", "- spacing: deprecated and not used\n", "- expansion: deprecated and not used\n", "- color: string or rgb[a]\n", "- fillincolor: deprecated and not used\n", "- priority: essentially the layer on the VCS canvas onto which to draw the text\n", "- string: text to draw\n", "- viewport: area on the canvas where VCS should draw the text object. Initialized at `[0,1,0,1]`.\n", "- worldcoordinate: corner values of the viewport area. Initialized at `[0,1,0,1]`.\n", "- x: x position (to be located using the worldcoordinate)\n", "- y: y position (to be located using the worldcoordinate)\n", "- projection: if you want to use a projection, this is the VCS projection object\n", "\n", "\n", "The **Text Orientation** is mainly used to control the following:\n", "\n", "- height: size of the text (font size)\n", "- angle: rotation of the text (positive angle means rotating clockwise)\n", "- path: deprecated, no longer used\n", "- halign: horizontal alignment\n", "- valign: vertical alignment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Text Orientation \n", "\n", "[Back to Top](#top)\n", "\n", "The following section shows how to control the different attributes of the Text Orientation object.\n", "\n", "To get started, though, it is useful to understand the basics of the `.x` and `.y` positioning attributes from the Text Table, since they are used extensively throughout this notebook. \n", "\n", "To plot the text string \"Hello VCS User\" in the center of the plot area, first assign the string to the `.string` attribute of the `txt` text object, then use the x and y attributes. \n", "\n", "By default, the lower-left corner of the viewport (the area available for plotting) has an (x, y) coordinate of (0, 0) and (1, 1) for the upper-right corner. Therefore use .5 for the x and y coordinates to plot the text in the center." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt.string = 'Hello VCS User'\n", "txt.x = .5 \n", "txt.y = .5\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Size\n", "\n", "[Back to Top](#top)\n", "\n", "You can control the size (or **height**) of text objects as follows:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "txt = vcs.createtext()\n", "txt.string = \"Example of BIG Text\"\n", "txt.x = .5\n", "txt.y = .5\n", "txt.height = 30\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Angle\n", "\n", "[Back to Top](#top)\n", "\n", "The `.angle` attribute controls the rotation of a text object from horizontal as shown below. A positive angle in degrees will rotate the text in a clockwise direction." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "txt.angle = 45 \n", "txt.height =20.\n", "txt.string = \"Rotated Text\"\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Alignment\n", "\n", "[Back to Top](#top)\n", "\n", "You can control the alignment of text in both the horizontal and vertical directions.\n", "\n", "Before exploring these options, let's reset the rotation back to horizontal with an angle value of 0." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "txt.angle = 0 \n", "txt.height =20.\n", "txt.string = \"Non-rotated Text\"\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Horizontal Alignment\n", "\n", "[Back to Top](#top)\n", "\n", "You can control the horizontal alignment via the **halign** attribute. Possible values are: *('left', 'center', 'right') or (0, 1, 2)*." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "line = vcs.createline()\n", "line.x = [.5,.5]\n", "line.y = [0.,1.]\n", "line.type =\"dot\"\n", "line.color=[\"grey\"]\n", "center = vcs.createtext()\n", "center.x = .5\n", "center.y = .5\n", "center.string = \"Centered Text\"\n", "center.halign = \"center\"\n", "right = vcs.createtext()\n", "right.x = .5\n", "right.y = .25\n", "right.string = \"Right Aligned Text\"\n", "right.halign = \"right\"\n", "left = vcs.createtext()\n", "left.x = .5\n", "left.y = .75\n", "left.string = \"Left Aligned Text\"\n", "left.halign = \"left\"\n", "canvas.plot(center)\n", "canvas.plot(right)\n", "canvas.plot(left)\n", "canvas.plot(line)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Vertical Alignment\n", "\n", "[Back to Top](#top)\n", "\n", "You can control the vertical alignment via the **valign** attribute. Possible values are: *('top', 'cap', 'half', 'base', 'bottom') or (0, 1, 2, 3, 4)*.\n", "\n", "Note that currently, **cap** and **top** should not be used at the same time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "line = vcs.createline()\n", "line.y = [.5,.5]\n", "line.x = [0.,1.]\n", "line.type =\"dot\"\n", "line.color=[\"grey\"]\n", "\n", "half = vcs.createtext()\n", "half.height = 20\n", "half.halign = \"center\"\n", "half.x = .5\n", "half.y = .5\n", "half.string = \"Half Aligned Text\"\n", "half.valign = \"Half\"\n", "\n", "bottom = vcs.createtext()\n", "bottom.halign='center'\n", "bottom.height=20\n", "bottom.x = .25\n", "bottom.y = .5\n", "bottom.string = \"Bottom Aligned Text\"\n", "bottom.valign = \"bottom\"\n", "\n", "top = vcs.createtext()\n", "top.halign='center'\n", "top.height=20\n", "top.x = .75\n", "top.y = .5\n", "top.string = \"Top Aligned Text\"\n", "top.valign = \"top\"\n", "\n", "cap = vcs.createtext()\n", "cap.x = .75\n", "cap.y = .75\n", "cap.string = \"Cap Aligned Text\"\n", "cap.valign = \"cap\"\n", "\n", "canvas.plot(half)\n", "canvas.plot(bottom)\n", "canvas.plot(top)\n", "#canvas.plot(cap)\n", "canvas.plot(line)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Text Table \n", "\n", "[Back to Top](#top)\n", "\n", "The following section shows how to control the different attributes of the Text Table object." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fonts\n", "\n", "[Back to Top](#top)\n", "\n", "#### Changing the Font\n", "\n", "\n", "You can control the fonts via the `font` attribute.\n", "\n", "For a list of available default fonts, use the `vcs.listelements(\"font\")` option." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(vcs.listelements(\"font\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to names, fonts can be identified by their number. \n", "The first line of code below shows how to get the number of the \"Times\" font.\n", "The second line of code illustrates how to return the name of a font, given its number, \"5\" in this case." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"The 'Times' font number is:\",vcs.getfontnumber(\"Times\"))\n", "print(\"The name of number 5 is:\", vcs.getfont(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Default Font\n", "\n", "[Back to Top](#top)\n", "\n", "If you wish to change VCS's default font, which will affect every object using font 1, you can use `setdefaultfont`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "t = vcs.createtext()\n", "t.string = \"Default as default font\"\n", "t.x = .3\n", "t.halign = \"center\"\n", "t.y = .5\n", "canvas.plot(t)\n", "vcs.setdefaultfont(\"DejaVuSans-Bold\")\n", "t = vcs.createtext()\n", "t.string = \"DejaVuSans-Bold as default font\"\n", "t.x = .7\n", "t.halign = \"center\"\n", "t.y = .5\n", "canvas.plot(t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's reset the default font to AvantGarde from DejaVuSans-Bold and display all the different fonts in a grid. Since the font names will overlap each other when displayed, let's use an angle of 30." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# reset default font to AvantGarde from DejaVuSans-Bold\n", "vcs.setdefaultfont(\"AvantGarde\")\n", "txt.angle = 30\n", "fonts = vcs.listelements(\"font\")\n", "N = len(fonts)\n", "grid = 5. # 5x5 grid\n", "delta = 1./6.\n", "canvas.clear()\n", "for i, font in enumerate(fonts):\n", " print(\"I,f:\",i,font)\n", " txt.font = font\n", " txt.string = font\n", " yindx = i % grid\n", " xindx = int(i/grid)\n", " txt.x = delta + xindx*delta\n", " txt.y = delta + yindx*delta\n", " dsp = canvas.plot(txt)\n", "\n", "dsp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To be ready for the next example, let's reset the canvas, text string, angle, font size (height), and plotting location." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "txt.string = \"A VCS Text Object\"\n", "txt.angle = 0\n", "txt.height = 12\n", "txt.x = [.5]\n", "txt.y = [.5]\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Adding Fonts\n", "\n", "[Back to Top](#top)\n", "\n", "You can add TrueType fonts to VCS by using the `canvas.addfont` function.\n", "\n", "For the next lines of code to work properly, you need to download the sample font file, **\"FFF_Tusj.ttf\"**, from the GitHub repo for this notebook: https://github.com/CDAT/Jupyter-notebooks/tree/master/vcs/VCS_Text_Objects. If you have not already done so, save the font file in the same location as this notebook." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "vcs.addfont(\"FFF_Tusj.ttf\", name=\"Myfont\")\n", "txt.font = \"Myfont\"\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Color\n", "\n", "[Back to Top](#top)\n", "\n", "You can control the font `color` via the color attribute. You can use a string representing the color name (e.g. \"Red\") or an index (e.g. 5) to set the color.\n", "\n", "You can change the colormap via the `colormap` attribute.\n", "\n", "Here we'll build a plot with the text string \"A VCS Text Object\" displayed in three different colors at three different horizontal (x) locations in the center of the plot.\n", "\n", "First let's plot a red version in the center of the plot. Since the last time we assigned a value to `txt.x` it was 0.5 (`txt.x = [.5]`), we do not need to change that value here." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "txt.font = \"default\"\n", "txt.color = \"Red\"\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we'll add the text string in color 5 from the default colormap (a purplish color), a bit to the right of the red string." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt.x[0] += .2\n", "txt.color = 5\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we'll add a yellow version to the left of the red by changing the colormap from the default to \"AMIP\" which has a yellow color as index 5 as opposed to a purple color. The change in color is solely due to the change in the colormap." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt.colormap = \"AMIP\" # Changing the colormap which will change the color of index 5\n", "txt.x[0] -= .4\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Viewport and World Coordinates\n", "\n", "[Back to Top](#top)\n", "\n", "The world coordinate attribute determines the coordinate values at the corners of the plot area or viewport. By default the viewport covers the whole canvas.\n", "\n", "As mentioned above, within the viewport, the default lower-left corner has an (x, y) coordinate of (0, 0) and the upper-right corner (1, 1)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Non-standard Viewport\n", "\n", "Sometimes we do not want the coordinate system to cover the whole page, but rather an area where data is plotted.\n", "\n", "As an example, to move the viewport to display in the lower, right section of the canvas use the following code:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt.viewport=[0.5,1,0,.5] # list the x bounds first, then y bounds\n", "fa = vcs.createfillarea()\n", "fa.x = [0.5, 1, 1, .5]\n", "fa.y = [0, 0, .5, .5]\n", "fa.color=[(80,80,80)]\n", "fa.style=\"hatch\"\n", "fa.index=12\n", "canvas.clear()\n", "canvas.plot(fa)\n", "\n", "txt.color=\"Red\"\n", "txt.height=15\n", "canvas.plot(txt) # we do not need to tweak our text object coordinates at all" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Real-world Coordinates Example\n", "\n", "[Back to Top](#top)\n", "\n", "Sometimes we would like to position the text based on actual, real-world coordinates rather than on a percentage of the page (e.g. .5 or 50%). In order to do this, we need to let VCS know about the world coordinates of its viewing area or viewport.\n", "\n", "For context, let's plot a map of the Total Cloudiness, `clt`, over the contiguous United States from the \"clt.nc\" NetCDF file that is part of the VSC sample data set. Once we've plotted the data, we'll add a text object.\n", "\n", "First we open the data file and read its contents into the `f` (for file) variable.\n", "\n", "Next we define the latitude and longitude coordinates of our area of interest, the contiguous U.S.\n", "\n", "We subset the total cloudiness data, create a template to use for plotting, and create an isofill of the data.\n", "\n", "Next we define the bounds of the viewport and world coordinates.\n", "\n", "Finally, we plot the subsetted data using the template. By specifying continents=3, the boundaries between Canada and Mexico are drawn as well as the U.S. state lines." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "canvas.clear()\n", "\n", "import cdms2, os\n", "f=cdms2.open(os.path.join(vcs.sample_data,\"clt.nc\"))\n", "\n", "lon1 = -130.\n", "lon2 = -70.\n", "lat1= 25.\n", "lat2 = 50\n", "subset = f(\"clt\",latitude=(lat1,lat2), longitude=(lon1, lon2))\n", "tmpl = vcs.createtemplate()\n", "iso = vcs.createisofill()\n", "iso.datawc_x1 = lon1\n", "iso.datawc_x2 = lon2\n", "iso.datawc_y1 = lat1\n", "iso.datawc_y2 = lat2\n", "\n", "txt.viewport = [tmpl.data.x1, tmpl.data.x2, tmpl.data.y1, tmpl.data.y2]\n", "txt.worldcoordinate = [lon1, lon2, lat1, lat2]\n", "\n", "canvas.plot(subset,tmpl,iso, continents=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we'll plot the location of Washington D.C. which is at -77.0369 latitude and 38.9072 longitude." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt.font = \"default\"\n", "txt.color = \"Red\"\n", "txt.height = 20\n", "txt.halign = \"center\"\n", "txt.valign = \"half\"\n", "txt.x = -77.0369 \n", "txt.y = 38.9072\n", "txt.string = \"Washington D.C.\"\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Projection\n", "\n", "[Back to Top](#top)\n", "\n", "If your world coordinates represent latitude and longitude, you can use the `projection` attribute to apply a projection (and its settings) to your text location.\n", "\n", "The following example again uses the Total Cloudiness sample data file, \"clt.nc\".\n", "\n", "The final image includes two plots, the top of which plots the data on a rectangle covering the globe from -180 to 180 degrees longitude and -90 to 90 degrees latitude. The bottom, or second, plot uses a Polar projection.\n", "\n", "The first use of the text object for plotting \"Non proj\" in blue on the top plot, does not use a projection, but does use the world coordinate. The second use of the text object to plot \"PROJECTED\" in red, does use the Polar projection." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "\n", "bot = canvas.gettemplate(\"bot_of2\")\n", "top = canvas.gettemplate(\"top_of2\")\n", "gm = canvas.createisofill()\n", "gm.datawc_x1 = -180\n", "gm.datawc_x2 = 180\n", "gm.datawc_y1 = -90\n", "gm.datawc_y2 = 90\n", "canvas.plot(f(\"clt\", slice(0,1)),gm,top)\n", "\n", "proj = \"polar\"\n", "gm.projection = proj\n", "canvas.plot(f(\"clt\",slice(0,1),longitude=(-180,181)),gm,bot)\n", "\n", "txt = vcs.createtext()\n", "txt.string = \"Non proj\"\n", "txt.worldcoordinate = [-180,180,-90,90]\n", "txt.x = -30\n", "txt.y = 80\n", "txt.color=\"blue\"\n", "txt.height = 15\n", "txt.halign = \"center\"\n", "txt.viewport = top.data.x1, top.data.x2, top.data.y1, top.data.y2\n", "canvas.plot(txt)\n", "\n", "txt.projection = proj\n", "txt.color = \"red\"\n", "txt.string = \"PROJECTED\"\n", "txt.viewport = bot.data.x1, bot.data.x2, bot.data.y1, bot.data.y2\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ordering Plot Layers\n", "\n", "[Back to Top](#top)\n", "\n", "You can control the `layer` on which the object will be drawn via the `priority` attribute. Objects with a `priority` value that is numerically larger than other objects (e.g. 2 instead of 1) are drawn on top of objects with smaller `priority` values." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt.priority = 0 # Turn off\n", "txt.priority = 2 # Move to a layer on top of the \"default\" layer (1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Deprecated Attributes\n", "\n", "The following attributes are left over from XGKS and are not used anymore:\n", "\n", "`spacing`, `fillingcolor`, `expansion`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Mathematical Expressions and Symbols\n", "\n", "Please see the separate notebook dedicated to plotting [Mathematical Expressions and Symbols](https://cdat.llnl.gov/Jupyter-notebooks/vcs/Mathematical_Expressions_and_Symbols/Mathematical_Expressions_and_Symbols.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example: Bringing It All Together\n", "\n", "[Back to Top](#top)\n", "\n", "Let's plot the Total Cloudiness over the contiguous United States using real-world coordinates and a Lambert projection, then plot a colored text object containing three city names on top of the map." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "canvas.clear()\n", "\n", "# Continental U.S.A. region\n", "lat1 = 15.\n", "lat2 = 70.\n", "lon1 = -140.\n", "lon2 = -60.\n", "proj = \"lambert\"\n", "\n", "# Read this subset of data in\n", "clt = f(\"clt\",time=slice(0,1),latitude=(lat1,lat2),longitude=(lon1,lon2),squeeze=1)\n", "\n", "# Use the Isofill method to plot the total cloudiness data\n", "gm = vcs.createisofill()\n", "gm.datawc_x1 = lon1\n", "gm.datawc_x2 = lon2\n", "gm.datawc_y1 = lat1\n", "gm.datawc_y2 = lat2\n", "gm.projection = proj\n", "\n", "# Use the default template, but don't modify it\n", "templ = vcs.createtemplate()\n", "\n", "# Create and define the text object\n", "txt = vcs.createtext()\n", "txt.string = [\"Washington D.C.\", \"New York\", \"Los Angeles\"]\n", "txt.halign = \"center\"\n", "txt.valign = \"half\"\n", "txt.color = \"red\"\n", "txt.font = \"Myfont\"\n", "txt.height = 15\n", "txt.priority = 2\n", "txt.angle = -5\n", "txt.y = [38.9072, 40.7128, 34.0522]\n", "txt.x = [-77.0369, -74.0060, -118.2437]\n", "txt.worldcoordinate = [lon1, lon2, lat1, lat2]\n", "txt.viewport = [templ.data.x1, templ.data.x2, templ.data.y1, templ.data.y2]\n", "txt.projection = proj\n", "\n", "canvas.plot(clt,gm)\n", "canvas.plot(txt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The CDAT software was developed by LLNL. This work was performed under the auspices of the U.S. Department of Energy by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344.\n", "\n", "If you have questions about this notebook, please email our [CDAT Support](cdat-support@llnl.gov) address, cdat-support@llnl.gov." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }