{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

\n", "NASA Goddard Space Flight Center
\n", " Python User Group
\n", "2014 Python Boot Camp
\n", "

\n", "
" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Numpy and Matplotlib" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Reference Documents" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
    \n", "
  1. Tentative Numpy Tutorial\n", "
  2. NumPy Reference\n", "
  3. NumPy for MATLAB Users\n", "
  4. NumPy for R (and S-Plus) Users\n", "
  5. NumPy and Matplotlib (Practical Cumputing for Biologists)\n", "
  6. Matplotlib: Plotting\n", "
" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "In case you prefer a video:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.display import YouTubeVideo\n", "#YouTubeVideo(\"http://www.youtube.com/watch?v=3Fp1zn5ao2M\")\n", "YouTubeVideo(\"3Fp1zn5ao2M\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "What is Numpy?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Making Numpy Arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we want to import the appropriate modules into our name space (note this is done automatically with the \"--pylab\" flag." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "raw", "metadata": {}, "source": [ "The primary building block of the numpy module is the class \"ndarray\". A ndarray object represents a multidimensional, homogeneous array of fixed-sized items. An associated date-type object describes the format of each element in the array. An ndarray object is (almost) never instantiated directly, but instead using a method that returns an instance of the class." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.array([1, 2, 3])\n", "print a" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "raw", "metadata": {}, "source": [ "The \"ones\" and \"zeros\" methods return an array object of the requested shape and type." ] }, { "cell_type": "code", "collapsed": false, "input": [ "b = np.ones((3,2))\n", "print b\n", "print b.shape" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "c = np.zeros((1,3), int)\n", "print c\n", "print type(c)\n", "print c.dtype" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "d = np.zeros(3, complex)\n", "print d\n", "print d.dtype\n", "id = np.eye(5)\n", "print id" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "raw", "metadata": {}, "source": [ "linspace(a, b, n) generates n uniformly spaced coordinates, starting with a and ending with b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linspace(-5, 5, 11)\n", "print x" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.r_[-5:5:11j] # same as linspace(-1, 1, 11)\n", "print a" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.arange(-5, 5, 1, float) # upper limit 5 is not included!!\n", "print x" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Changing Array Dimension" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.array([0, 1.2, 4, -9.1, 5, 8])\n", "print a.shape\n", "a.shape = (2,3) # turn a into a 2x3 matrix\n", "print a.size\n", "a.shape = (a.size,) # turn a into a vector of length 6 again\n", "print a.shape\n", "a = a.reshape(2,3) # same effect as setting a.shape\n", "print a.shape" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Array Initialization from a Python Function" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def myfunc(i, j):\n", " return (i+1)*(j+4-i)\n", "\n", "# make 3x6 array where a[i,j] = myfunc(i,j):\n", "a = fromfunction(myfunc, (3,6))\n", "print a" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Array Indexing" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.linspace(-1, 1, 6)\n", "a[2:4] = -1 # set a[2] and a[3] equal to -1\n", "a[-1] = a[0] # set last element equal to first one\n", "a[:] = 0 # set all elements of a equal to 0\n", "a.fill(0) # set all elements of a equal to 0\n", "\n", "i = 1\n", "j = 2\n", "k = 2\n", "a.shape = (2,3) # turn a into a 2x3 matrix\n", "print a[0,1] # print element (0,1)\n", "a[i,j] = 10 # assignment to element (i,j)\n", "a[i][j] = 10 # equivalent syntax (slower)\n", "print a[:,k] # print column with index k\n", "print a[1,:] # print second row\n", "a[:,:] = 0 # set all elements of a equal to 0" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.linspace(0, 29, 30)\n", "a.shape = (5,6)\n", "print a" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "print a[1:3,:-1:2] # a[i,j] for i=1,2 and j=0,2,4" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "print a[::3,2:-1:2] # a[i,j] for i=0,3 and j=2,4" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Array Slicing" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import Image \n", "Image(filename='ArraySlicing.png') " ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "png": "iVBORw0KGgoAAAANSUhEUgAAAfoAAAEqCAIAAABySQUxAAAWBWlDQ1BJQ0MgUHJvZmlsZQAAWIW1\nWAdQVEGTnvc2LyxpyTnnjGTJWTJIlJyzhCUKKkFUwAACkhQFJAoYSCKCgIAKIkEBBRRFBAQRBUTy\nrXr3/3dXd3V1VXddNfu+7Zqa92b6q+6vBwCmCffQ0CCYBoDgEFK4lYE2t72DIzdmGkAAD3AABozu\nnhGhWhYWJuC/tZ9j5NlkG5X4vdZ/P++/NFov7whPACALMvbwivAMJuMGMpb0DA0nkfEnMh6KJoWS\nMfzbTx9O/kAyfvob+/7FU7+xx1+8+mfOUSsdABBIALCU7u7hvgBQkHcIuKM8fcnrUEgDgKYL8fIP\nIb9el4zVPf3cvQBgSiHPEQ8OPv4b3yFjYY9/t47vf1jT4x9rurv7/gP/3csfw+r6R4QGucf+L4/j\nf7bgoMh/e8fvU6f0DrGxJj/pyIMd6IDjIIg8wgE3MCH/I++O5B1D+j1Z53hobLi/rx+JW4scJW9x\nbqMQT0lxbllpGbn/82/8/7Tf/PyL1qz+nADE+PKfvuBkAJSzyTw49k+f5wwAzd8BwH3+p08gAgCq\neAB6lzwjw6P++pC/f1Bk3lMDesACOAEfEAYSQBYoAFWgCfTAEWAOjgIH4AI8gR8IJp9yNIgHiSAV\npIPLIAcUgGJQCipBLbgHmkEb6AS9oB8MgddgEsyAObAEVsFPsANBEAYiQESIBeKCBCAxSBZSgtQh\nPcgEsoIcIDfIFwqBIqF4KBlKh7KgAugmVAXdhR5AndAzaBh6A32AFqEf0DaMgClhepgDFoSlYCVY\nCzaGj8LOsC8cBsfBKfBFOA8ugW/DTXAn3A+/hmfgJXgDARAUCEYED0ICoYTQQZgjHBE+iHDESUQa\nIhdRgqhDtCL6EKOIGcQyYguJRhKR3EgJpCrSEGmD9ESGIU8iM5AFyEpkE/IJchT5AbmK3EcRUOwo\nMZQKyghlj/JFRaNSUbmoclQjqgf1GjWH+olGoxnRQmhFtCHaAR2APoHOQF9D16Mfo4fRs+gNDAbD\nghHDqGHMMe4YEiYVk4+5jenAjGDmML+wFFgurCxWH+uIDcEmYXOx1dh27Ah2HruDo8EJ4FRw5jgv\nXCzuEq4M14p7iZvD7eBp8UJ4NfxRfAA+EZ+Hr8P34KfwaxQUFLwUyhSWFP4UpynyKO5QPKX4QLFF\nSUcpSqlD6UQZSXmRsoLyMeUbyjUCgSBI0CQ4EkiEi4QqQjfhHeEXFZFKksqIyovqFFUhVRPVCNUK\nNY5agFqL2oU6jjqX+j71S+plGhyNII0OjTvNSZpCmgc04zQbtERaGVpz2mDaDNpq2me0C3QYOkE6\nPTovuhS6UrpuulkigshH1CF6EpOJZcQe4hw9ml6I3og+gD6dvpZ+kH6VgY7hEIMtQwxDIcMjhhlG\nBKMgoxFjEOMlxnuMY4zbTBxMWkzeTOeZ6phGmDaZ2Zg1mb2Z05jrmV8zb7Nws+ixBLJksjSzTLMi\nWUVZLVmjWa+z9rAus9GzqbJ5sqWx3WN7yw6zi7JbsZ9gL2UfYN/g4OQw4AjlyOfo5ljmZOTU5Azg\nzOZs51zkInKpc/lzZXN1cH3hZuDW4g7izuN+wr3Kw85jyBPJc5NnkGeHV4jXhjeJt553mg/Pp8Tn\nw5fN18W3ys/Fb8ofz1/D/1YAJ6Ak4CdwVaBPYFNQSNBO8Kxgs+CCELOQkVCcUI3QlDBBWEM4TLhE\n+JUIWkRJJFDkmsiQKCwqL+onWij6UgwWUxDzF7smNiyOElcWDxEvER+XoJTQkoiSqJH4IMkoaSKZ\nJNksuSLFL+UolSnVJ7UvLS8dJF0mPSlDJ3NEJkmmVeaHrKisp2yh7Cs5gpy+3Cm5Frnvh8QOeR+6\nfmhCnihvKn9Wvkt+T0FRIVyhTmFRkV/RTbFIcVyJXslCKUPpqTJKWVv5lHKb8paKggpJ5Z7KN1UJ\n1UDVatWFw0KHvQ+XHZ5V41VzV7upNqPOre6mfkN9RoNHw12jROOjJp+ml2a55ryWiFaA1m2tFW1p\n7XDtRu1NHRWdBJ3HughdA9003UE9Oj0bvQK9d/q8+r76NfqrBvIGJwweG6IMjQ0zDceNOIw8jaqM\nVo8oHkk48sSY0tjauMD4o4moSbhJqylsesT0iumUmYBZiFmzOTA3Mr9iPm0hZBFm8dASbWlhWWj5\n2UrGKt6qz5po7Wpdbf3zqPbRS0cnbYRtIm26bKltnWyrbDftdO2y7GbspewT7PsdWB38HVocMY62\njuWOG8f0juUcm3OSd0p1GnMWco5xfubC6hLk8siV2tXd9b4bys3Ordpt193cvcR9w8PIo8hj1VPH\n86rnkpemV7bXoread5b3vI+aT5bPgq+a7xXfRT8Nv1y/ZX8d/wL/7wGGAcUBm4HmgRWBB0F2QfXB\n2GC34AchdCGBIU+Ocx6POT4cKhaaGjoTphKWE7YabhxeHgFFOEe0kOjJQmAgUjjyTOSHKPWowqhf\n0bbR92NoY0JiBmJFY8/Hzsfpx906gTzheaIrnic+Mf5DglbCzZPQSY+TXaf4TqWcmjttcLoyEZ8Y\nmPgiSTopK2k92S65NYUj5XTK7BmDMzWpVKnhqeNnVc8Wn0Oe8z83eF7ufP75/TSvtOfp0um56bsZ\nnhnPL8hcyLtwcNHn4uAlhUvXL6Mvh1wey9TIrMyizYrLmr1ieqUpmzs7LXs9xzXnWe6h3OKr+KuR\nV2fyTPJa8vnzL+fvFvgVvC7ULqwvYi86X7R5zevayHXN63XFHMXpxds3/G9M3DS42VQiWJJbii6N\nKv1cZlvWd0vpVlU5a3l6+V5FSMVMpVXlkyrFqqpq9upLNXBNZM3ibafbQ7W6tS11EnU36xnr0++A\nO5F3vtx1uzt2z/he132l+3UNAg1FjcTGtCaoKbZptdmveabFoWX4wZEHXa2qrY0PJR9WtPG0FT5i\neHSpHd+e0n7QEdex8Tj08XKnb+dsl2vXZLd996snlk8Ge4x7nvbq93b3afV1PFV72vZM5dmD50rP\nm/sV+psG5AcaX8i/aBxUGGx6qfiyZUh5qHX48HD7iMZI56juaO8ro1f9r81eD4/ZjE2MO43PTHhN\nLLwJevP9bdTbncnTU6iptGma6dx37O9K3ou8r59RmHn0QffDwEfrj5OznrNLnyI+7c6lfCZ8zp3n\nmq9akF1oW9RfHPpy7MvcUujSznLqV9qvRSvCKw3fNL8NrNqvzn0P/37wI2ONZa1i/dB614bFxruf\nwT93NtN+sfyq3FLa6tu2257fid7F7Obtiey17hvvTx0EHxyEuoe7/5ECCPKAfXwA+FEBAMEBAOIQ\nAHiqv/rxXw1BFh8w+Ykm6y5dsgoYhTghZ6gKBrA9/BAhhChAMiGLUOKoPnQIhgszis3BueElKZAU\n7yi/UxGo5WiO0SbR3SXOM7AzOjBdZZ5iFWALZW/npOby5W7nZeEL528T2BZSEA4VqRB9K46RkJA0\nk/KRjpFJlD0jl3QoQZ6k4KtoqSSqjFR+p/JANfdwpJqNuqIGmyasuaw1rt2j06hboVekn2WQZphk\ndOIIyTjExN/U28zL3MvCy9LPKsSadDTBJtX2ot1V+2KHCsf6Y01Obc5dLr2u/W4v3Uc9xj0nvT56\n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\n", "prompt_number": 5, "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Slices Refer the Array Data\n", "" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print a\n", "b = a[1,:] # extract 2nd column of a\n", "print a[1,1]\n", "b[1] = 2\n", "print a[1,1]" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "# Take a copy to avoid referencing via slices:\n", "b = a[1,:].copy()\n", "print a[1,1]\n", "b[1] = 7777 # b and a are two different arrays now\n", "print a[1,1]\n" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Array Computations" ] }, { "cell_type": "code", "collapsed": false, "input": [ "b = 3*a - 1 # a is array, b becomes array" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above operation generates a temporary array:\n", "
    \n", "
  1. tb = 3*a\n", "
  2. b = tb - 1\n", "
\n", "As far as possible, we want to avoid the creation\n", " of temporary arrays to limit the memory usage and\n", " to decrease the computational time associated with\n", " with array computations." ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "In-Place Array Arithmetics" ] }, { "cell_type": "code", "collapsed": false, "input": [ "b = a\n", "b *= 3 # or multiply(b, 3, b)\n", "b -= 1 # or subtract(b, 1, b)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 }, { "cell_type": "raw", "metadata": {}, "source": [ "In-place operations:\n", " \n", " a *= 3.0 # multiply a's elements by 3\n", " a -= 1.0 # subtract 1 from each element\n", " a /= 3.0 # divide each element by 3\n", " a += 1.0 # add 1 to each element\n", " a **= 2.0 # square all elements" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Math Functions and Array Arguments" ] }, { "cell_type": "raw", "metadata": {}, "source": [ " # let b be an array\n", " c = sin(b) \n", " c = arcsin(c) \n", " c = sinh(b)\n", " # same functions for the cos and tan families\n", " c = b**2.5 # power function\n", " c = log(b)\n", " c = exp(b)\n", " c = sqrt(b)\n", " \n", " # a is an array\n", " a.clip(min=3, max=12) \t# clip elements\n", " a.mean(); mean(a) \t# mean value\n", " a.var(); var(a) \t# variance\n", " a.std(); std(a) \t# standard deviation\n", " median(a)\n", " cov(x,y) \t# covariance\n", " trapz(a) \t# Trapezoidal integration\n", " diff(a) \t# finite differences (da/dx)" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "NumPy Matrices" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x1 = np.array([1, 2, 3], float)\n", "x2 = np.matrix(x) # or just mat(x)\n", "print x2 # row vector" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "x3 = mat(x).transpose() # column vector\n", "print x3\n", "type(x3)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "A = np.eye(10) # identity matrix\n", "print A\n", "B = np.mat(A) # turn array to matrix\n", "print B\n", "y2 = x2*B # vector-matrix product\n", "print y2\n", "y3 = B*x3 # matrix-vector product\n", "print y3\n" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.array([[1,2],[3,4]])\n", "print \"a = \", a\n", "m = np.mat(a)\n", "print \"m = \", m\n", "print \"a[0] = \", a[0]\n", "print \"m[0] = \", m[0]\n", "print \"a*a = \", a*a\n", "print \"m*m = \", m*m\n", "print \"dot = \", dot(a, a)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Universal Functions and Loops" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "Universal functions run much faster than for loops, which should be avoided whenever possible" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def mult1(a,b):\n", " return a * b\n", "\n", "def mult2(a,b):\n", " c = np.empty(a.shape)\n", " for i in range(a.shape[0]):\n", " for j in range(a.shape[1]):\n", " c[i,j] = a[i,j] * b[i,j]\n", " return c" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.random.random((800,800))\n", "b = np.random.random((800,800))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "timeit mult1(a,b)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "timeit mult2(a,b)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Matplotlib\n", "\n", "\n" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Simple Plot" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pylab as plt\n", "\n", "x = [2, 3, 5, 7, 11]\t\n", "y = [4, 9, 5, 9, 1]\t\n", "plt.plot(x, y)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Useful Syntax" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "plot(x,y)\n", "xlabel('string') # label the x-axis\n", "ylabel('string') # label the y-axis\n", "title('string') # write the title of the plot\n", "grid(true/false) # adds grid boxes\n", "savefig('fileName.type') # type can be png, ps, pdf, etc\n", "show() # display the graph on the screen\n", "xlim(xmin,xmax) # set/get the xlimits\n", "ylim(ymin,ymax) # set/get the ylimits\n", "hold(True/False) # to overlay figures on the same graph" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Cosine Plot" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import math\n", "\n", "t = np.arange(0.0, 1.0+0.01, 0.01)\n", "s = np.cos(2*2*math.pi*t)\n", "plt.plot(t, s)\n", "\n", "plt.xlabel('time (s)')\n", "plt.ylabel('voltage (mV)')\n", "plt.title('About as simple as it gets, folks')\n", "plt.grid(True)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Add Legend" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linspace(0, 2*np.pi, 300)\n", "y = np.sin(x)\n", "y2 = np.sin(x**2)\n", "plt.plot(x, y, label=r'$\\sin(x)$')\n", "plt.plot(x, y2, label=r'$\\sin(x^2)$')\n", "plt.title('Some functions')\n", "plt.xlabel('x')\n", "plt.ylabel('y')\n", "plt.grid()\n", "plt.legend(loc=0)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Multiple Figures on the Same Plot" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def f(t):\n", " return np.exp(-t) * np.cos(2*np.pi*t)\n", "\n", "t1 = np.arange(0.0, 5.0, 0.1)\n", "t2 = np.arange(0.0, 5.0, 0.02)\n", "\n", "plt.figure(1)\n", "plt.subplot(211)\n", "plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')\n", "\n", "plt.subplot(212)\n", "plt.plot(t2, np.cos(2*np.pi*t2), 'r--')" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Annotating Text" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ax = plt.subplot(111)\n", "t = np.arange(0.0, 5.0, 0.01)\n", "s = np.cos(2*np.pi*t)\n", "line, = plt.plot(t, s, lw=2)\n", "\n", "plt.annotate('local max', xy=(2, 1), \\\n", " xytext=(3, 1.5), \\\n", " arrowprops=dict(facecolor='black', \\\n", " shrink=0.05), )\n", "\n", "plt.ylim(-2,2)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Plot with Fill" ] }, { "cell_type": "code", "collapsed": false, "input": [ "t = np.arange(0.0, 1.01, 0.01)\n", "s = np.sin(2*2*np.pi*t)\n", "\n", "plt.fill(t, s*np.exp(-5*t), 'r')\n", "plt.grid(True)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Histogram" ] }, { "cell_type": "code", "collapsed": false, "input": [ "mu, sigma = 100, 15\n", "x = mu + sigma * np.random.randn(10000)\n", "\n", "# the histogram of the data\n", "n, bins, patches = plt.hist(x, 50, normed=1, \\\n", " facecolor='g', alpha=0.75)\n", "\n", "plt.xlabel('Smarts')\n", "plt.ylabel('Probability')\n", "plt.title('Histogram of IQ')\n", "plt.text(60, .025, r'$\\mu=100,\\ \\sigma=\\frac{1}{\\sqrt{15}}$')\n", "plt.axis([40, 160, 0, 0.03])\n", "plt.grid(True)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Log Plot" ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.subplots_adjust(hspace=0.4)\n", "t = np.arange(0.01, 20.0, 0.01)\n", "\n", "# log y axis\n", "plt.subplot(221)\n", "plt.semilogy(t, np.exp(-t/5.0))\n", "plt.title('semilogy')\n", "plt.grid(True)\n", "\n", "# log x axis\n", "plt.subplot(222)\n", "plt.semilogx(t, np.sin(2*np.pi*t))\n", "plt.title('semilogx')\n", "plt.grid(True)\n", "\n", "# log x and y axis\n", "plt.subplot(223)\n", "plt.loglog(t, 20*np.exp(-t/10.0), basex=2)\n", "plt.grid(True)\n", "plt.title('loglog base 4 on x')\n", "\n", "# with errorbars: clip non-positive values\n", "ax = plt.subplot(224)\n", "ax.set_xscale(\"log\", nonposx='clip')\n", "ax.set_yscale(\"log\", nonposy='clip')\n", "\n", "x = 10.0**np.linspace(0.0, 2.0, 20)\n", "y = x**2.0\n", "plt.errorbar(x, y, xerr=0.1*x, yerr=5.0+0.75*y)\n", "ax.set_ylim(ymin=0.1)\n", "ax.set_title('Errorbars go negative')\n" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Pie Chart" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# make a square figure and axes\n", "fig = plt.figure(1, figsize=(6,6))\n", "ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])\n", "labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'\n", "fracs = [15,30,45, 10]\n", "explode=(0, 0.1, 0, 0)\n", "ax.pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)\n", "ax.set_title('Raining Hogs and Dogs', bbox={'facecolor':'0.9', 'pad':15})" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Contour Plot and Colorbar" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from pylab import *\n", "delta = 0.01\n", "x = arange(-3.0, 3.0, delta)\n", "y = arange(-3.0, 3.0, delta)\n", "X,Y = meshgrid(x, y)\n", "Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)\n", "Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)\n", "Z = Z2 - Z1 # difference of Gaussians\n", "\n", "cmap = cm.get_cmap('jet', 10) # 10 discrete colors\n", "\n", "im = imshow(Z, cmap=cmap, interpolation='bilinear')\n", "axis('off')\n", "colorbar()\n" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Scatter Plot" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy import random\n", "\n", "random.seed(0)\n", "mu_1 = random.randn(2)\n", "sigma_1 = random.randn()\n", "x_1 = (random.randn(1000)*sigma_1)+mu_1[0]\n", "y_1 = (random.randn(1000)*sigma_1)+mu_1[1]\n", "\n", "mu_2 = random.randn(2)\n", "sigma_2 = random.randn()\n", "x_2 = (random.randn(1000)*sigma_2)+mu_2[0]\n", "y_2 = (random.randn(1000)*sigma_2)+mu_2[1]\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(1,1,1)\n", "ax.scatter(x_1,y_1,color='r',edgecolor='k',alpha=0.25)\n", "ax.scatter(x_2,y_2,color='b',edgecolor='k',alpha=0.25)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Breakout Session: Applications in Earth Science and Space Science" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
    \n", "
  1. Earth Science \n", "
      \n", "
    • We want to reproduce the Global Land-Ocean Temperature Index plot available at this GISS website\n", "
        \n", "
      1. Obtain the temperature anomaly data from the link and save it in a file. Note that there are missing data.\n", "
      2. Write a function that read the file and populate the three lists years, annualMeanTemp and fiveYearMean. Find ways to take into account the missing values while filling annualMeanTemp and fiveYearMean.\n", "
      3. Convert the three lists into Numpy arrays and create masks to identify the missing data.\n", "
      4. Use Matplotlib to plot the data.\n", "
      \n", "
    \n", "
  2. Animation to Visualize Dynamic Data \n", "
      \n", "
    • We want to continually plot y = sin(π x) where x is a set of random numbers in [-2,3]. The values of x change with time.\n", "
        \n", "
      1. Write a function that randomly generates N=200 numbers (uniformly distributed) between -2 and 3, pass the numbers to the Numpy array x, and returns x and y = sin(π x).\n", "
      2. Use the Matplotlib animation module to continually use the above function to plot y = sin(π x).\n", "
      \n", "
    \n", " \n", "
" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }