{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# NCL_unique_5.py\nConcepts illustrated:\n  - Drawing multiple bar charts on a page\n  - Drawing three custom legends outside a bar chart\n  - Using bar charts to draw standard deviations for four time series\n  - Drawing a time series plot\nSee following URLs to see the reproduced NCL plot & script:\n    - Original NCL script: https://www.ncl.ucar.edu/Applications/Scripts/unique_5.ncl\n    - Original NCL plot: https://www.ncl.ucar.edu/Applications/Images/unique_5_lg.png\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Import packages:\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import numpy as np\nimport matplotlib.pyplot as plt\nimport random\n\nfrom geocat.viz import util as gvutil"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Generate labels:\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "x = np.arange(1, 13)\nlabels = [\n    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov',\n    'Dec'\n]\n\n# Generate random data:\nobs = []\nccsm2_t42 = []\nccsm3_t42 = []\nccsm3_t85 = []\n\nfor i in range(12):\n    obs.append(random.uniform(0.4, 1.2))\n    ccsm2_t42.append(random.uniform(0.4, 1.2))\n    ccsm3_t42.append(random.uniform(0.4, 1.2))\n    ccsm3_t85.append(random.uniform(0.4, 1.2))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Create the custom color list.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "color_list = ['red', 'lightsteelblue', 'blue', 'lime']"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Plot bar chart with a legend\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Axis Settings\nplot_y_max = 1.2\n\n# Generate figure\nplt.figure(2, figsize=(6, 5))\nax = plt.gca()\n\n# Set width of each column\nw = 0.15\n\n# Create subplots for each category\nsub = plt.subplot(111)\nsub.bar(x + w,\n        obs,\n        width=0.15,\n        color=color_list[0],\n        edgecolor='black',\n        linewidth=0.25,\n        align='center')\nsub.bar((x + (2 * w)),\n        ccsm2_t42,\n        width=0.15,\n        color=color_list[1],\n        edgecolor='black',\n        linewidth=0.25,\n        align='center')\nsub.bar(x + 3 * w,\n        ccsm3_t42,\n        width=0.15,\n        color=color_list[2],\n        edgecolor='black',\n        linewidth=0.25,\n        align='center')\nsub.bar(x + 4 * w,\n        ccsm3_t85,\n        width=0.15,\n        color=color_list[3],\n        edgecolor='black',\n        linewidth=0.25,\n        align='center')\n\n# Add the legend\nplt.legend(['OBS', 'CCSM2 (T42)', 'CCSM3 (T42)', 'CCSM3 (T85)'],\n           loc='lower center',\n           bbox_to_anchor=(0.5, -0.30),\n           ncol=2)\n\n# Use geocat.viz.util convenience function to set axes limits & tick values without calling several matplotlib functions\ngvutil.set_axes_limits_and_ticks(ax,\n                                 ylim=(0.4, plot_y_max),\n                                 xticks=x,\n                                 xticklabels=labels,\n                                 yticks=np.linspace(0.4, plot_y_max, 5))\n\n# Use geocat.viz.util convenience function to add minor and major tick lines\ngvutil.add_major_minor_ticks(ax,\n                             x_minor_per_major=1,\n                             y_minor_per_major=4,\n                             labelsize=12)\n\n# Use geocat.viz.util convenience function to set titles and labels\ngvutil.set_titles_and_labels(ax,\n                             maintitle='Nino3.4 Monthly Standard Deviation',\n                             maintitlefontsize=16,\n                             ylabel=\"(\" + u'\\N{DEGREE SIGN}' + \"C)\")\n\n# Show the plot\nplt.tight_layout()\nplt.show()"
      ]
    }
  ],
  "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.7.9"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}