cgddrd/CS39440-major-project

View on GitHub
src/template_matching_scaling/notebooks/motion_displacement_flat_10cm_scaled_exhaustive.ipynb

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Terrain Motion Displacement - Flat 10cm (Scaled  - Exhaustive)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1) IPython Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* \n",
       " * Force prevention of output scroll toggle.\n",
       " * Original source: https://github.com/ipython/ipython/issues/2172#issuecomment-53708976 \n",
       " */\n",
       "IPython.OutputArea.auto_scroll_threshold = 9999;"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%javascript\n",
    "/* \n",
    " * Force prevention of output scroll toggle.\n",
    " * Original source: https://github.com/ipython/ipython/issues/2172#issuecomment-53708976 \n",
    " */\n",
    "IPython.OutputArea.auto_scroll_threshold = 9999;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%load_ext ipycache\n",
    "%matplotlib inline\n",
    "\n",
    "import matplotlib as mpl\n",
    "mpl.rcParams['figure.figsize'] = (12, 8)\n",
    "\n",
    "# We have to add a reference to the parent folder in order to access the modules.\n",
    "import sys,os\n",
    "sys.path.insert(1, os.path.join(sys.path[0], '..'))\n",
    "\n",
    "import main as templ\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import cv2\n",
    "\n",
    "from tse.tse_matchmethod import tse_match_methods\n",
    "from tse.tse_matchtype import TSEMatchType\n",
    "from tse.tse_datautils import TSEDataUtils"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2) Calculate Displacement "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%%cache -d cache/ cache_flat_10cm_scaled_exhaustive.pkl results_dict\n",
    "\n",
    "config_file = \"../../eval_data/calib/calibdata_23_03_15_11_07_04.txt\"\n",
    "\n",
    "image_pairs = [\n",
    "                (\"../../eval_data/motion_images/flat_10cm/IMG1.JPG\", \"../../eval_data/motion_images/flat_10cm/IMG2.JPG\"),\n",
    "                (\"../../eval_data/motion_images/flat_10cm/IMG3.JPG\", \"../../eval_data/motion_images/flat_10cm/IMG4.JPG\"),\n",
    "                (\"../../eval_data/motion_images/flat_10cm/IMG5.JPG\", \"../../eval_data/motion_images/flat_10cm/IMG6.JPG\"),\n",
    "                (\"../../eval_data/motion_images/flat_10cm/IMG7.JPG\", \"../../eval_data/motion_images/flat_10cm/IMG8.JPG\"),\n",
    "                (\"../../eval_data/motion_images/flat_10cm/IMG9.JPG\", \"../../eval_data/motion_images/flat_10cm/IMG10.JPG\"),\n",
    "                (\"../../eval_data/motion_images/flat_10cm/IMG11.JPG\", \"../../eval_data/motion_images/flat_10cm/IMG12.JPG\")\n",
    "              ]\n",
    "\n",
    "patch_sizes = [50, 100, 200]\n",
    "\n",
    "match_method1 = TSEMatchType(\"DistanceEuclidean\", tse_match_methods.DISTANCE_ED, None, \"r\", reverse_score=True)\n",
    "match_method2 = TSEMatchType(\"HistCorrel\", tse_match_methods.HIST, cv2.cv.CV_COMP_CORREL, \"b\")\n",
    "match_method3 = TSEMatchType(\"HistChiSqr\", tse_match_methods.HIST, cv2.cv.CV_COMP_CHISQR, \"g\", reverse_score=True)\n",
    "match_method4 = TSEMatchType(\"DistanceCorr\", tse_match_methods.DISTANCE, cv2.cv.CV_TM_CCORR_NORMED, \"y\")\n",
    "\n",
    "match_methods = [match_method1, match_method2, match_method3, match_method4]\n",
    "\n",
    "results_dict = templ.start_tests(image_pairs, patch_sizes, match_methods, config_file, exhaustive_search=True, use_scaling=True, plot_results=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3) Tests"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test 1: IMG1/IMG2 - 50px patch - *DistanceEuclidean*, *DistanceCorr*, *HistCorrel*, *HistChiSqr*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "results_pair1_50 = results_dict['IMG1.JPG_IMG2.JPG'][50]\n",
    "\n",
    "final_results = {}\n",
    "format_ids = [\"b\", \"g\", \"r\", \"y\"]\n",
    "\n",
    "for method in results_pair1_50:\n",
    "        \n",
    "    if method not in final_results:\n",
    "        final_results[method] = {}\n",
    "\n",
    "    data = results_pair1_50[method]\n",
    "\n",
    "    final_results[method]['displacement'] = [o.displacement for o in data]\n",
    "\n",
    "    final_results[method]['row'] = [o.row for o in data]\n",
    "    \n",
    "    \n",
    "for i, result in enumerate(final_results):\n",
    "    \n",
    "    final_results[result]['cma'] = TSEDataUtils.calc_centered_moving_average(np.array(final_results[result]['displacement']), 10)\n",
    "    \n",
    "    plt.plot(np.array(final_results[result]['row']), np.array(final_results[result]['displacement']), \"{0}.\".format(format_ids[i]), label=result)\n",
    "    \n",
    "    plt.plot(final_results[result]['row'][len(final_results[result]['row']) - len(final_results[result]['cma']):], final_results[result]['cma'], \"{0}-\".format(format_ids[i]), label=\"{0}_CMA\".format(result))                                                 \n",
    "\n",
    "plt.title('Vertical Motion Displacement - IMG1/IMG2 - 50px patch height')\n",
    "plt.xlabel('Image Row Height (px)')\n",
    "plt.ylabel('Vertical Displacement (px)')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test 2: IMG1/IMG2 - 100px patch - *DistanceEuclidean*, *DistanceCorr*, *HistCorrel*, *HistChiSqr*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "results_pair1_100 = results_dict['IMG1.JPG_IMG2.JPG'][100]\n",
    "\n",
    "final_results = {}\n",
    "format_ids = [\"b\", \"g\", \"r\", \"y\"]\n",
    "\n",
    "for method in results_pair1_100:\n",
    "        \n",
    "    if method not in final_results:\n",
    "        final_results[method] = {}\n",
    "\n",
    "    data = results_pair1_100[method]\n",
    "\n",
    "    final_results[method]['displacement'] = [o.displacement for o in data]\n",
    "\n",
    "    final_results[method]['row'] = [o.row for o in data]\n",
    "    \n",
    "    \n",
    "for i, result in enumerate(final_results):\n",
    "    \n",
    "    final_results[result]['cma'] = TSEDataUtils.calc_centered_moving_average(np.array(final_results[result]['displacement']), 10)\n",
    "    \n",
    "    plt.plot(np.array(final_results[result]['row']), np.array(final_results[result]['displacement']), \"{0}.\".format(format_ids[i]), label=result)\n",
    "    \n",
    "    plt.plot(final_results[result]['row'][len(final_results[result]['row']) - len(final_results[result]['cma']):], final_results[result]['cma'], \"{0}-\".format(format_ids[i]), label=\"{0}_CMA\".format(result))                                                 \n",
    "\n",
    "plt.title('Vertical Motion Displacement - IMG1/IMG2 - 100px patch height')\n",
    "plt.xlabel('Image Row Height (px)')\n",
    "plt.ylabel('Vertical Displacement (px)')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test 3: IMG1/IMG2 - 200px patch - *DistanceEuclidean, DistanceCorr, HistCorrel, HistChiSqr*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "results_pair1_200 = results_dict['IMG1.JPG_IMG2.JPG'][200]\n",
    "\n",
    "final_results = {}\n",
    "format_ids = [\"b\", \"g\", \"r\", \"y\"]\n",
    "\n",
    "for method in results_pair1_200:\n",
    "        \n",
    "    if method not in final_results:\n",
    "        final_results[method] = {}\n",
    "\n",
    "    data = results_pair1_200[method]\n",
    "\n",
    "    final_results[method]['displacement'] = [o.displacement for o in data]\n",
    "\n",
    "    final_results[method]['row'] = [o.row for o in data]\n",
    "    \n",
    "    \n",
    "for i, result in enumerate(final_results):\n",
    "    \n",
    "    final_results[result]['cma'] = TSEDataUtils.calc_centered_moving_average(np.array(final_results[result]['displacement']), 10)\n",
    "    \n",
    "    plt.plot(np.array(final_results[result]['row']), np.array(final_results[result]['displacement']), \"{0}.\".format(format_ids[i]), label=result)\n",
    "    \n",
    "    plt.plot(final_results[result]['row'][len(final_results[result]['row']) - len(final_results[result]['cma']):], final_results[result]['cma'], \"{0}-\".format(format_ids[i]), label=\"{0}_CMA\".format(result))                                            \n",
    "\n",
    "plt.title('Vertical Motion Displacement - IMG1/IMG2 - 200px patch height')\n",
    "plt.xlabel('Image Row Height (px)')\n",
    "plt.ylabel('Vertical Displacement (px)')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test 4: IMG1/IMG2 - 100px, 200px patch - *DistanceEuclidean*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "results_pair1 = results_dict['IMG1.JPG_IMG2.JPG']\n",
    "\n",
    "raw_results_pair1_100_200 = []\n",
    "image_rows = []\n",
    "\n",
    "final_results = {}\n",
    "format_ids = [\"b\", \"g\", \"r\", \"y\"]\n",
    "\n",
    "for patch in results_pair1:\n",
    "        \n",
    "    if patch not in final_results:\n",
    "        final_results[patch] = {}\n",
    "        final_results[patch]['DistanceEuclidean'] = {}\n",
    "\n",
    "    data = results_pair1[patch]['DistanceEuclidean']\n",
    "\n",
    "    final_results[patch]['DistanceEuclidean']['displacement'] = [o.displacement for o in data]\n",
    "\n",
    "    final_results[patch]['DistanceEuclidean']['row'] = [o.row for o in data]\n",
    "    \n",
    "for i, result in enumerate(final_results):\n",
    "    \n",
    "    current_patch_data_euclidean = final_results[result]['DistanceEuclidean']\n",
    "    current_patch_data_euclidean['cma'] = TSEDataUtils.calc_centered_moving_average(np.array(current_patch_data_euclidean['displacement']), 10)\n",
    "    \n",
    "    plt.plot(np.array(current_patch_data_euclidean['row']), np.array(current_patch_data_euclidean['displacement']), \"{0}.\".format(format_ids[i]), label=result)\n",
    "    \n",
    "    plt.plot(current_patch_data_euclidean['row'][len(current_patch_data_euclidean['row']) - len(current_patch_data_euclidean['cma']):], current_patch_data_euclidean['cma'], \"{0}-\".format(format_ids[i]), label=\"{0}_CMA\".format(result))   \n",
    "\n",
    "plt.title('Average Vertical Motion Displacement - IMG1/IMG2 - 100px/200px patch height - Euclidean Distance')\n",
    "plt.xlabel('Image Row Height (px)')\n",
    "plt.ylabel('Average Vertical Displacement (px)')\n",
    "plt.legend(loc='upper left')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test 5: IMG1 - IMG12 - 50px patch - *DistanceEuclidean, DistanceCorr, HistCorrel, HistChiSqr*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "results = results_dict\n",
    "\n",
    "final_results = {}\n",
    "\n",
    "format_ids = [\"b\", \"g\", \"r\", \"y\"]\n",
    "\n",
    "for image_pair in results:\n",
    "    \n",
    "    for method in results[image_pair][50]:\n",
    "        \n",
    "        if method not in final_results:\n",
    "            final_results[method] = {}\n",
    "        \n",
    "        data = results[image_pair][50][method]\n",
    "        \n",
    "        if 'displacement' in final_results[method]:\n",
    "            final_results[method]['displacement'].append([o.displacement for o in data])\n",
    "        else:\n",
    "            final_results[method]['displacement'] = [[o.displacement for o in data]]\n",
    "            \n",
    "        final_results[method]['row'] = [o.row for o in data]\n",
    "        \n",
    "\n",
    "for i, result in enumerate(final_results):\n",
    "    \n",
    "    final_results[result]['average'] = TSEDataUtils.calc_element_wise_average(final_results[result]['displacement'])\n",
    "    \n",
    "    final_results[result]['filtered'] = TSEDataUtils.filter_outliers_ab_dist_median(final_results[result]['average'])\n",
    "    \n",
    "    final_results[result]['filtered_row'] = np.array(final_results[result]['row'])[TSEDataUtils.filter_outliers_ab_dist_median_indices(final_results[result]['average'])]\n",
    "    \n",
    "    final_results[result]['cma'] = TSEDataUtils.calc_centered_moving_average(np.array(final_results[result]['filtered']), 10)\n",
    "    \n",
    "    plt.plot(np.array(final_results[result]['filtered_row']), np.array(final_results[result]['filtered']), \"{0}.\".format(format_ids[i]), label=\"{0} (Filtered)\".format(result))\n",
    "    \n",
    "    plt.plot(final_results[result]['filtered_row'][len(final_results[result]['filtered_row']) - len(final_results[result]['cma']):], final_results[result]['cma'], \"{0}-\".format(format_ids[i]), label=\"{0}_CMA\".format(result))                                                                                         \n",
    "          \n",
    "plt.title('Average Vertical Motion Displacement - IMG1-IMG12 - 50px patch height')\n",
    "plt.xlabel('Image Row Height (px)')\n",
    "plt.ylabel('Average Vertical Displacement (px)')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test 6: IMG1 - IMG12 - 100px patch - *DistanceEuclidean, DistanceCorr, HistCorrel, HistChiSqr*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "results = results_dict\n",
    "\n",
    "final_results = {}\n",
    "\n",
    "format_ids = [\"b\", \"g\", \"r\", \"y\"]\n",
    "\n",
    "for image_pair in results:\n",
    "    \n",
    "    for method in results[image_pair][100]:\n",
    "        \n",
    "        if method not in final_results:\n",
    "            final_results[method] = {}\n",
    "        \n",
    "        data = results[image_pair][100][method]\n",
    "        \n",
    "        if 'displacement' in final_results[method]:\n",
    "            final_results[method]['displacement'].append([o.displacement for o in data])\n",
    "        else:\n",
    "            final_results[method]['displacement'] = [[o.displacement for o in data]]\n",
    "            \n",
    "        final_results[method]['row'] = [o.row for o in data]\n",
    "        \n",
    "\n",
    "for i, result in enumerate(final_results):\n",
    "    \n",
    "    final_results[result]['average'] = TSEDataUtils.calc_element_wise_average(final_results[result]['displacement'])\n",
    "    \n",
    "    final_results[result]['filtered'] = TSEDataUtils.filter_outliers_ab_dist_median(final_results[result]['average'])\n",
    "    \n",
    "    final_results[result]['filtered_row'] = np.array(final_results[result]['row'])[TSEDataUtils.filter_outliers_ab_dist_median_indices(final_results[result]['average'])]\n",
    "    \n",
    "    final_results[result]['cma'] = TSEDataUtils.calc_centered_moving_average(np.array(final_results[result]['filtered']), 10)\n",
    "    \n",
    "    plt.plot(np.array(final_results[result]['filtered_row']), np.array(final_results[result]['filtered']), \"{0}.\".format(format_ids[i]), label=\"{0} (Filtered)\".format(result))\n",
    "    \n",
    "    plt.plot(final_results[result]['filtered_row'][len(final_results[result]['filtered_row']) - len(final_results[result]['cma']):], final_results[result]['cma'], \"{0}-\".format(format_ids[i]), label=\"{0}_CMA\".format(result))                                                                                         \n",
    "          \n",
    "plt.title('Average Vertical Motion Displacement - IMG1-IMG12 - 100px patch height')\n",
    "plt.xlabel('Image Row Height (px)')\n",
    "plt.ylabel('Average Vertical Displacement (px)')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test 7: IMG1 - IMG12 - 200px patch - *DistanceEuclidean, DistanceCorr, HistCorrel, HistChiSqr*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "results = results_dict\n",
    "\n",
    "final_results = {}\n",
    "\n",
    "format_ids = [\"b\", \"g\", \"r\", \"y\"]\n",
    "\n",
    "for image_pair in results:\n",
    "    \n",
    "    for method in results[image_pair][200]:\n",
    "        \n",
    "        if method not in final_results:\n",
    "            final_results[method] = {}\n",
    "        \n",
    "        data = results[image_pair][200][method]\n",
    "        \n",
    "        if 'displacement' in final_results[method]:\n",
    "            final_results[method]['displacement'].append([o.displacement for o in data])\n",
    "        else:\n",
    "            final_results[method]['displacement'] = [[o.displacement for o in data]]\n",
    "            \n",
    "        final_results[method]['row'] = [o.row for o in data]\n",
    "        \n",
    "\n",
    "for i, result in enumerate(final_results):\n",
    "    \n",
    "    final_results[result]['average'] = TSEDataUtils.calc_element_wise_average(final_results[result]['displacement'])\n",
    "    \n",
    "    final_results[result]['filtered'] = TSEDataUtils.filter_outliers_ab_dist_median(final_results[result]['average'])\n",
    "    \n",
    "    final_results[result]['filtered_row'] = np.array(final_results[result]['row'])[TSEDataUtils.filter_outliers_ab_dist_median_indices(final_results[result]['average'])]\n",
    "    \n",
    "    final_results[result]['cma'] = TSEDataUtils.calc_centered_moving_average(np.array(final_results[result]['filtered']), 10)\n",
    "    \n",
    "    plt.plot(np.array(final_results[result]['filtered_row']), np.array(final_results[result]['filtered']), \"{0}.\".format(format_ids[i]), label=\"{0} (Filtered)\".format(result))\n",
    "    \n",
    "    plt.plot(final_results[result]['filtered_row'][len(final_results[result]['filtered_row']) - len(final_results[result]['cma']):], final_results[result]['cma'], \"{0}-\".format(format_ids[i]), label=\"{0}_CMA\".format(result))                                                                                         \n",
    "          \n",
    "plt.title('Average Vertical Motion Displacement - IMG1-IMG12 - 200px patch height')\n",
    "plt.xlabel('Image Row Height (px)')\n",
    "plt.ylabel('Average Vertical Displacement (px)')\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "results = results_dict\n",
    "\n",
    "final_results = {}\n",
    "\n",
    "format_ids = [\"b\", \"g\", \"r\", \"y\"]\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "mpl.rcParams['figure.figsize'] = (16, 20)\n",
    "mpl.rcParams.update({'font.size': 16})\n",
    "\n",
    "for i, patch in enumerate([50, 100, 200]):\n",
    "    \n",
    "    ax = plt.subplot2grid((3,1), (i,0))\n",
    "\n",
    "    for image_pair in results:\n",
    "\n",
    "        for method in results[image_pair][patch]:\n",
    "\n",
    "            if method not in final_results:\n",
    "                final_results[method] = {}\n",
    "\n",
    "            data = results[image_pair][patch][method]\n",
    "\n",
    "            if 'displacement' in final_results[method]:\n",
    "                final_results[method]['displacement'].append([o.displacement for o in data])\n",
    "            else:\n",
    "                final_results[method]['displacement'] = [[o.displacement for o in data]]\n",
    "\n",
    "            final_results[method]['row'] = [o.row for o in data]\n",
    "\n",
    "\n",
    "    for i, result in enumerate(final_results):\n",
    "\n",
    "        final_results[result]['average'] = TSEDataUtils.calc_element_wise_average(final_results[result]['displacement'])\n",
    "\n",
    "        final_results[result]['filtered'] = TSEDataUtils.filter_outliers_ab_dist_median(final_results[result]['average'])\n",
    "\n",
    "        final_results[result]['filtered_row'] = np.array(final_results[result]['row'])[TSEDataUtils.filter_outliers_ab_dist_median_indices(final_results[result]['average'])]\n",
    "\n",
    "        final_results[result]['cma'] = TSEDataUtils.calc_centered_moving_average(np.array(final_results[result]['filtered']), 10)\n",
    "\n",
    "        plt.plot(np.array(final_results[result]['filtered_row']), np.array(final_results[result]['filtered']), \"{0}.\".format(format_ids[i]), label=\"{0} (Filtered)\".format(result))\n",
    "\n",
    "        plt.plot(final_results[result]['filtered_row'][len(final_results[result]['filtered_row']) - len(final_results[result]['cma']):], final_results[result]['cma'], \"{0}-\".format(format_ids[i]), label=\"{0}_CMA\".format(result))                                                                                         \n",
    "\n",
    "    ax.spines['right'].set_visible(False)\n",
    "    ax.spines['top'].set_visible(False)\n",
    "    ax.xaxis.set_ticks_position('bottom')\n",
    "    ax.yaxis.set_ticks_position('left')\n",
    "\n",
    "    plt.title('Average Vertical Motion Displacement - IMG1-IMG12 - {0}px patch height'.format(patch))\n",
    "    plt.xlabel('Image Row Height (px)')\n",
    "    plt.ylabel('Average Vertical Displacement (px)')\n",
    "\n",
    "ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1),\n",
    "          fancybox=True, ncol=3)\n",
    "\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}