{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "from IPython.display import Image" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Review of lecture 11\n", "\n", "In Lecture 11 we:\n", "\n", "- learned about **lambda** functions\n", "\n", "- learned how to use **map( )**, **filter( )**, and **reduce( )** \n", "\n", "- explored the joys of \"List comprehensions\" (and Dictionary and Set Comprehensions too!)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### In this lecture, we will learn:\n", "\n", "- About _recursive functions_ using the Fibonacci sequence and factorials as examples\n", "\n", "- New plotting tricks with **matplotlib**\n", "\n", "- How to handle errors without crashing: **exceptions**\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Recursive functions\n", "\n", "A _recursive function_ is a function that calls itself. Every recursive function must include a terminating condition, otherwise you will end up with a never ending loop- an _infinite loop_. Every recursive call of the function must move toward the terminating condition: the _base case_. The _base case_ satisfies the terminating condition, so the recursive function is no longer called. \n", "\n", "Here's an example to calculate $n!$, the factorial of $n$" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def factorial(n):\n", " if n == 1: \n", " return 1\n", " else:\n", " return n * factorial(n-1) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can call it:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1405006117752879898543142606244511569936384000000000" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factorial(42)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Whoa! That's a big number!" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### The Fibonacci sequence and recursive functions\n", "\n", "Have you ever heard of the 'golden rectangle'? It is a rectangle with a length to width ratio that is especially pleasing to the eye. It is no accident that index cards are 3x5 because this is an example of a golden rectangle. \n", "\n", "The golden rectangle is based on the golden ratio, which stems from the work Leonardo Pisano, a.k.a. Fibonacci. Fibonacci, among other things, thought deeply about rabbits and their breeding habits. He devised a sequence of numbers that represented the month-to-month growth of the population of rabbits. You begin with a pair of rabbits, one of each sex. These rabbits start mating when they are one month old and produce another pair of rabbit babies after a month. The new pair starts breeding when they are one month old. Assuming the rabbits never die, Fibonacci asked: How does the population of rabbits grow? \n", "\n", "At the end of the first month, they mate, but there is still only 1 pair.\n", "\n", "At the end of the second month the female produces a new pair, so now there are 2 pairs of rabbits.\n", "\n", "At the end of the third month, the original female produces a second pair, making 3 pairs in all.\n", "\n", "At the end of the fourth month, the original female has produced yet another new pair, the female born two months ago produced her first pair as well, making 5 pairs.\n", "\n", "Now imagine that there are $x_ n$ pairs of rabbits after $n$ months. The number of pairs in month $n+1$ will be $x_ n$ plus the number of new pairs born. But new pairs are only born to pairs at least 1 month old, so there will be $x_{n-1}$ new pairs. \n", "\n", "We can write this down mathematically as this:\n", "\n", "$x_{n+1} = x_ n + x_{n-1}$. \n", " \n", "This is the general rule for generating Fibonacci numbers: add the last two to get the next. \n", "\n", "Here's a visual representation- a Fibonacci spiral where the arm of the spiral grows according to the Fibonacci sequence. Another cool thing is that the rectangles all form golden rectangles with the last two numbers as the sides." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYF\nBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoK\nCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAEgAbADASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKK\nKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo\nAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA\nooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi\niigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK\nKACiivnD9v34ZfDb4yfEb9m74afF74faH4q8Oap8crsan4f8SaTDfWN2I/BHiqaPzYJ1aOTbLHHI\n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\nn/BMD/pHB8Bf/DP6L/8AItH/AA6s/wCCYH/SOD4C/wDhn9F/+Ra96ooA8F/4dWf8EwP+kcHwF/8A\nDP6L/wDItH/Dqz/gmB/0jg+Av/hn9F/+Ra96ooA8F/4dWf8ABMD/AKRwfAX/AMM/ov8A8i0f8OrP\n+CYH/SOD4C/+Gf0X/wCRa96ooA8F/wCHVn/BMD/pHB8Bf/DP6L/8i0f8OrP+CYH/AEjg+Av/AIZ/\nRf8A5Fr3qigDwX/h1Z/wTA/6RwfAX/wz+i//ACLR/wAOrP8AgmB/0jg+Av8A4Z/Rf/kWveqKAPBf\n+HVn/BMD/pHB8Bf/AAz+i/8AyLR/w6s/4Jgf9I4PgL/4Z/Rf/kWveqKAPBl/4JXf8EwkYOv/AATh\n+AwIIII+EGi8EdD/AMetTf8ADsD/AIJpf9I8PgZ/4aXRv/kavc6KAPDP+HYH/BNL/pHh8DP/AA0u\njf8AyNR/w7A/4Jpf9I8PgZ/4aXRv/kavc6KAPDP+HYH/AATS/wCkeHwM/wDDS6N/8jUyX/glv/wT\nKn/13/BOn4Ev/vfCLRT/AO21e7UUAeDR/wDBK/8A4JhQ/wCq/wCCcXwGXn+H4QaKP/bWph/wS/8A\n+CaQGB/wTw+Bn/hpNG/+Rq9zooA8M/4dgf8ABNL/AKR4fAz/AMNLo3/yNR/w7A/4Jpf9I8PgZ/4a\nXRv/AJGr3OigDwz/AIdgf8E0v+keHwM/8NLo3/yNR/w7A/4Jpf8ASPD4Gf8AhpdG/wDkavc6KAPD\nP+HYH/BNL/pHh8DP/DS6N/8AI1H/AA7A/wCCaX/SPD4Gf+Gl0b/5Gr3OigDw1P8AgmH/AME1Y3Dp\n/wAE8/garKcgj4S6MCD/AOA1e5UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU\nUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ\nAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB\nRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF\nFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU\nUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ\nAUUUUAFFFFABRRRQAUUUUAf/2Q==\n", "text/plain": [ "" ] }, "execution_count": 10, "metadata": { "image/jpeg": { "width": 500 } }, "output_type": "execute_result" } ], "source": [ "Image(filename='Figures/fib_spiral.jpg',width=500)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You see these Fibonacci spirals everywhere in nature (flowers, shells, your ear, and even hurricanes!). " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdC\nIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA\nAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFj\ncHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA\nABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAAD\nTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJD\nAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5\nOCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEA\nAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA\nAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAA\nAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo\ndHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt\nIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt\nIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg\nQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENv\nbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA\nABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA\nAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAK\nAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA\nmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy\nATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMC\nDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMh\nAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4E\njASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3\nBkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII\nRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqY\nCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN\nWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBh\nEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT\n5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReu\nF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9oc\nAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCY\nIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZcl\nxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2\nK2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIx\nSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec\nN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+\noD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXe\nRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN\n3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYP\nVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1f\nD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/\naJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfBy\nS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB\nfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH\nn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLj\nk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6f\nHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1\nq+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm4\n0blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZG\nxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU\ny9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj\n4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz\nGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAYEBQYF\nBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUo\nKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo\nKCgoKCgoKCgoKCgoKCj/wgARCAJjAyADAREAAhEBAxEB/8QAGwAAAgMBAQEAAAAAAAAAAAAAAgMB\nBAUABgf/xAAZAQEBAQEBAQAAAAAAAAAAAAAAAQIDBAX/2gAMAwEAAhADEAAAAcv286HjTySodzu5\nvVPJU8R3Ovul4o10Vd1sitJolmxslmGgiajZI+JGBSiXFqXLKEVk8sjKZVgugVWFCorQAFcSKLJd\nGnCCpVk1IWCCEViqGAKDFCQsRiBS9EdDtuK8lu1+zIHkq4V4ZAVBK8okiZnh00ctTar2g3N/zCyr\nUYyh07SciWLcOW1zaErdBQaHTosU6ReUwgZS9hhYZI6L6UlKmVwuKRnFGrJpF2rogYUIVF0Gq5JV\nFFQrChxq1rmpFsrFUgUcCSMjgxJKKsr6Ho3Sdi0RI6Ujsp5tHA4WTTBimtUQg3K666KrNdueU82t\n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\n8ofwQoX+GFq/GH9l/iOp+srk9lUhUxLkP//Z\n", "text/plain": [ "" ] }, "execution_count": 11, "metadata": { "image/jpeg": { "width": 500 } }, "output_type": "execute_result" } ], "source": [ "Image(filename='Figures/fibonacci_hurricane.jpg',width=500)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Figure from https://i.kinja-img.com/gawker-media/image/upload/s--HIRrLp3r--/c_scale,f_auto,fl_progressive,q_80,w_800/18f8hbfn5ag1yjpg.jpg]. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this lesson, we'll learn how to create the Fibonacci spiral.\n", "\n", "First, we need to generate the Fibonacci sequence. \n", "\n", "Here is an example of a _recursive function_: " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "month: 0 pairs: 1\n", "month: 1 pairs: 1\n", "month: 2 pairs: 2\n", "month: 3 pairs: 3\n", "month: 4 pairs: 5\n", "month: 5 pairs: 8\n", "month: 6 pairs: 13\n", "month: 7 pairs: 21\n", "month: 8 pairs: 34\n", "month: 9 pairs: 55\n", "month: 10 pairs: 89\n", "month: 11 pairs: 144\n", "month: 12 pairs: 233\n" ] } ], "source": [ "def fib(n):\n", " \"\"\"\n", " returns the fibonacci number for each n\n", " \"\"\"\n", " #the base case occurs when the number of months is less than 1\n", " if n < 1:\n", " return n+1\n", " else:\n", " return fib(n-1) + fib(n-2) # the function calls itself!\n", " \n", " \n", " \n", "# n is the month and fib(n) is the number of pairs at the beginning of each month\n", "for n in range(13): # figure out how many rabbit pairs at the end of a year\n", " print (\"month: \",n, \"pairs: \",fib(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, now you know - 233 pairs of rabbits. yum. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This recursive method works and it looks like a mathematical definition, but it's slow. If you want a faster method, that doesn't involve recursion, you can use _iteration_." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "month: 0 a,b: 1 1 pairs: 1\n", "month: 1 a,b: 1 2 pairs: 1\n", "month: 2 a,b: 2 3 pairs: 2\n", "month: 3 a,b: 3 5 pairs: 3\n", "month: 4 a,b: 5 8 pairs: 5\n", "month: 5 a,b: 8 13 pairs: 8\n", "month: 6 a,b: 13 21 pairs: 13\n", "month: 7 a,b: 21 34 pairs: 21\n", "month: 8 a,b: 34 55 pairs: 34\n", "month: 9 a,b: 55 89 pairs: 55\n", "month: 10 a,b: 89 144 pairs: 89\n", "month: 11 a,b: 144 233 pairs: 144\n", "month: 12 a,b: 233 377 pairs: 233\n" ] }, { "data": { "text/plain": [ "233" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def fibi(n):\n", " a, b = 0,1 \n", " for month in range(n): # step through n iterations\n", " a, b = b, a + b \n", " print ('month: ',month, 'a,b: ',a,b, 'pairs: ', a)\n", " # a is assigned to b while b is assigned to the sum of the last two numbers a+b\n", " return a\n", "fibi(13)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's use the Fibonnaci sequence to make the Fibonnaci spiral. We'll need a series of arcs with increasing radii along with some rectangles and text that grows along with the radii. To help us, we can use a useful module in **matplotlib**: the **patches** module. Of particular use is the **patches.Wedge** class. Here we'll use **help( )** to get us started. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on class Wedge in module matplotlib.patches:\n", "\n", "class Wedge(Patch)\n", " | Wedge shaped patch.\n", " | \n", " | Method resolution order:\n", " | Wedge\n", " | Patch\n", " | matplotlib.artist.Artist\n", " | builtins.object\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, center, r, theta1, theta2, width=None, **kwargs)\n", " | Draw a wedge centered at *x*, *y* center with radius *r* that\n", " | sweeps *theta1* to *theta2* (in degrees). If *width* is given,\n", " | then a partial wedge is drawn from inner radius *r* - *width*\n", " | to outer radius *r*.\n", " | \n", " | Valid kwargs are:\n", " | \n", " | agg_filter: unknown\n", " | alpha: float or None \n", " | animated: [True | False] \n", " | antialiased or aa: [True | False] or None for default \n", " | capstyle: ['butt' | 'round' | 'projecting'] \n", " | clip_box: a :class:`matplotlib.transforms.Bbox` instance \n", " | clip_on: [True | False] \n", " | clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] \n", " | color: matplotlib color spec\n", " | contains: a callable function \n", " | edgecolor or ec: mpl color spec, None, 'none', or 'auto' \n", " | facecolor or fc: mpl color spec, or None for default, or 'none' for no color \n", " | figure: a :class:`matplotlib.figure.Figure` instance \n", " | fill: [True | False] \n", " | gid: an id string \n", " | hatch: ['/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*'] \n", " | joinstyle: ['miter' | 'round' | 'bevel'] \n", " | label: string or anything printable with '%s' conversion. \n", " | linestyle or ls: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) | ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` | ``' '`` | ``''``]\n", " | linewidth or lw: float or None for default \n", " | path_effects: unknown\n", " | picker: [None|float|boolean|callable] \n", " | rasterized: [True | False | None] \n", " | sketch_params: unknown\n", " | snap: unknown\n", " | transform: :class:`~matplotlib.transforms.Transform` instance \n", " | url: a url string \n", " | visible: [True | False] \n", " | zorder: any number\n", " | \n", " | __str__(self)\n", " | Return str(self).\n", " | \n", " | get_path(self)\n", " | Return the path of this patch\n", " | \n", " | set_center(self, center)\n", " | \n", " | set_radius(self, radius)\n", " | \n", " | set_theta1(self, theta1)\n", " | \n", " | set_theta2(self, theta2)\n", " | \n", " | set_width(self, width)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from Patch:\n", " | \n", " | contains(self, mouseevent, radius=None)\n", " | Test whether the mouse event occurred in the patch.\n", " | \n", " | Returns T/F, {}\n", " | \n", " | contains_point(self, point, radius=None)\n", " | Returns *True* if the given point is inside the path\n", " | (transformed with its transform attribute).\n", " | \n", " | draw(self, renderer)\n", " | Draw the :class:`Patch` to the given *renderer*.\n", " | \n", " | get_aa = get_antialiased(self)\n", " | Returns True if the :class:`Patch` is to be drawn with antialiasing.\n", " | \n", " | get_antialiased(self)\n", " | Returns True if the :class:`Patch` is to be drawn with antialiasing.\n", " | \n", " | get_capstyle(self)\n", " | Return the current capstyle\n", " | \n", " | get_data_transform(self)\n", " | Return the :class:`~matplotlib.transforms.Transform` instance which\n", " | maps data coordinates to physical coordinates.\n", " | \n", " | get_ec = get_edgecolor(self)\n", " | Return the edge color of the :class:`Patch`.\n", " | \n", " | get_edgecolor(self)\n", " | Return the edge color of the :class:`Patch`.\n", " | \n", " | get_extents(self)\n", " | Return a :class:`~matplotlib.transforms.Bbox` object defining\n", " | the axis-aligned extents of the :class:`Patch`.\n", " | \n", " | get_facecolor(self)\n", " | Return the face color of the :class:`Patch`.\n", " | \n", " | get_fc = get_facecolor(self)\n", " | Return the face color of the :class:`Patch`.\n", " | \n", " | get_fill(self)\n", " | return whether fill is set\n", " | \n", " | get_hatch(self)\n", " | Return the current hatching pattern\n", " | \n", " | get_joinstyle(self)\n", " | Return the current joinstyle\n", " | \n", " | get_linestyle(self)\n", " | Return the linestyle. Will be one of ['solid' | 'dashed' |\n", " | 'dashdot' | 'dotted']\n", " | \n", " | get_linewidth(self)\n", " | Return the line width in points.\n", " | \n", " | get_ls = get_linestyle(self)\n", " | Return the linestyle. Will be one of ['solid' | 'dashed' |\n", " | 'dashdot' | 'dotted']\n", " | \n", " | get_lw = get_linewidth(self)\n", " | Return the line width in points.\n", " | \n", " | get_patch_transform(self)\n", " | Return the :class:`~matplotlib.transforms.Transform` instance which\n", " | takes patch coordinates to data coordinates.\n", " | \n", " | For example, one may define a patch of a circle which represents a\n", " | radius of 5 by providing coordinates for a unit circle, and a\n", " | transform which scales the coordinates (the patch coordinate) by 5.\n", " | \n", " | get_transform(self)\n", " | Return the :class:`~matplotlib.transforms.Transform` applied\n", " | to the :class:`Patch`.\n", " | \n", " | get_verts(self)\n", " | Return a copy of the vertices used in this patch\n", " | \n", " | If the patch contains Bezier curves, the curves will be\n", " | interpolated by line segments. To access the curves as\n", " | curves, use :meth:`get_path`.\n", " | \n", " | get_window_extent(self, renderer=None)\n", " | Get the axes bounding box in display space.\n", " | Subclasses should override for inclusion in the bounding box\n", " | \"tight\" calculation. Default is to return an empty bounding\n", " | box at 0, 0.\n", " | \n", " | Be careful when using this function, the results will not update\n", " | if the artist window extent of the artist changes. The extent\n", " | can change due to any changes in the transform stack, such as\n", " | changing the axes limits, the figure size, or the canvas used\n", " | (as is done when saving a figure). This can lead to unexpected\n", " | behavior where interactive figures will look fine on the screen,\n", " | but will save incorrectly.\n", " | \n", " | set_aa(self, aa)\n", " | alias for set_antialiased\n", " | \n", " | set_alpha(self, alpha)\n", " | Set the alpha tranparency of the patch.\n", " | \n", " | ACCEPTS: float or None\n", " | \n", " | set_antialiased(self, aa)\n", " | Set whether to use antialiased rendering\n", " | \n", " | ACCEPTS: [True | False] or None for default\n", " | \n", " | set_capstyle(self, s)\n", " | Set the patch capstyle\n", " | \n", " | ACCEPTS: ['butt' | 'round' | 'projecting']\n", " | \n", " | set_color(self, c)\n", " | Set both the edgecolor and the facecolor.\n", " | \n", " | ACCEPTS: matplotlib color spec\n", " | \n", " | .. seealso::\n", " | \n", " | :meth:`set_facecolor`, :meth:`set_edgecolor`\n", " | For setting the edge or face color individually.\n", " | \n", " | set_ec(self, color)\n", " | alias for set_edgecolor\n", " | \n", " | set_edgecolor(self, color)\n", " | Set the patch edge color\n", " | \n", " | ACCEPTS: mpl color spec, None, 'none', or 'auto'\n", " | \n", " | set_facecolor(self, color)\n", " | Set the patch face color\n", " | \n", " | ACCEPTS: mpl color spec, or None for default, or 'none' for no color\n", " | \n", " | set_fc(self, color)\n", " | alias for set_facecolor\n", " | \n", " | set_fill(self, b)\n", " | Set whether to fill the patch\n", " | \n", " | ACCEPTS: [True | False]\n", " | \n", " | set_hatch(self, hatch)\n", " | Set the hatching pattern\n", " | \n", " | *hatch* can be one of::\n", " | \n", " | / - diagonal hatching\n", " | \\ - back diagonal\n", " | | - vertical\n", " | - - horizontal\n", " | + - crossed\n", " | x - crossed diagonal\n", " | o - small circle\n", " | O - large circle\n", " | . - dots\n", " | * - stars\n", " | \n", " | Letters can be combined, in which case all the specified\n", " | hatchings are done. If same letter repeats, it increases the\n", " | density of hatching of that pattern.\n", " | \n", " | Hatching is supported in the PostScript, PDF, SVG and Agg\n", " | backends only.\n", " | \n", " | ACCEPTS: ['/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*']\n", " | \n", " | set_joinstyle(self, s)\n", " | Set the patch joinstyle\n", " | \n", " | ACCEPTS: ['miter' | 'round' | 'bevel']\n", " | \n", " | set_linestyle(self, ls)\n", " | Set the patch linestyle\n", " | \n", " | =========================== =================\n", " | linestyle description\n", " | =========================== =================\n", " | ``'-'`` or ``'solid'`` solid line\n", " | ``'--'`` or ``'dashed'`` dashed line\n", " | ``'-.'`` or ``'dashdot'`` dash-dotted line\n", " | ``':'`` or ``'dotted'`` dotted line\n", " | =========================== =================\n", " | \n", " | Alternatively a dash tuple of the following form can be provided::\n", " | \n", " | (offset, onoffseq),\n", " | \n", " | where ``onoffseq`` is an even length tuple of on and off ink\n", " | in points.\n", " | \n", " | ACCEPTS: ['solid' | 'dashed', 'dashdot', 'dotted' |\n", " | (offset, on-off-dash-seq) |\n", " | ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` |\n", " | ``' '`` | ``''``]\n", " | \n", " | Parameters\n", " | ----------\n", " | ls : { '-', '--', '-.', ':'} and more see description\n", " | The line style.\n", " | \n", " | set_linewidth(self, w)\n", " | Set the patch linewidth in points\n", " | \n", " | ACCEPTS: float or None for default\n", " | \n", " | set_ls(self, ls)\n", " | alias for set_linestyle\n", " | \n", " | set_lw(self, lw)\n", " | alias for set_linewidth\n", " | \n", " | update_from(self, other)\n", " | Updates this :class:`Patch` from the properties of *other*.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from Patch:\n", " | \n", " | fill\n", " | return whether fill is set\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from Patch:\n", " | \n", " | validCap = ('butt', 'round', 'projecting')\n", " | \n", " | validJoin = ('miter', 'round', 'bevel')\n", " | \n", " | zorder = 1\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from matplotlib.artist.Artist:\n", " | \n", " | __getstate__(self)\n", " | \n", " | add_callback(self, func)\n", " | Adds a callback function that will be called whenever one of\n", " | the :class:`Artist`'s properties changes.\n", " | \n", " | Returns an *id* that is useful for removing the callback with\n", " | :meth:`remove_callback` later.\n", " | \n", " | convert_xunits(self, x)\n", " | For artists in an axes, if the xaxis has units support,\n", " | convert *x* using xaxis unit type\n", " | \n", " | convert_yunits(self, y)\n", " | For artists in an axes, if the yaxis has units support,\n", " | convert *y* using yaxis unit type\n", " | \n", " | findobj(self, match=None, include_self=True)\n", " | Find artist objects.\n", " | \n", " | Recursively find all :class:`~matplotlib.artist.Artist` instances\n", " | contained in self.\n", " | \n", " | *match* can be\n", " | \n", " | - None: return all objects contained in artist.\n", " | \n", " | - function with signature ``boolean = match(artist)``\n", " | used to filter matches\n", " | \n", " | - class instance: e.g., Line2D. Only return artists of class type.\n", " | \n", " | If *include_self* is True (default), include self in the list to be\n", " | checked for a match.\n", " | \n", " | format_cursor_data(self, data)\n", " | Return *cursor data* string formatted.\n", " | \n", " | get_agg_filter(self)\n", " | return filter function to be used for agg filter\n", " | \n", " | get_alpha(self)\n", " | Return the alpha value used for blending - not supported on all\n", " | backends\n", " | \n", " | get_animated(self)\n", " | Return the artist's animated state\n", " | \n", " | get_children(self)\n", " | Return a list of the child :class:`Artist`s this\n", " | :class:`Artist` contains.\n", " | \n", " | get_clip_box(self)\n", " | Return artist clipbox\n", " | \n", " | get_clip_on(self)\n", " | Return whether artist uses clipping\n", " | \n", " | get_clip_path(self)\n", " | Return artist clip path\n", " | \n", " | get_contains(self)\n", " | Return the _contains test used by the artist, or *None* for default.\n", " | \n", " | get_cursor_data(self, event)\n", " | Get the cursor data for a given event.\n", " | \n", " | get_figure(self)\n", " | Return the :class:`~matplotlib.figure.Figure` instance the\n", " | artist belongs to.\n", " | \n", " | get_gid(self)\n", " | Returns the group id\n", " | \n", " | get_label(self)\n", " | Get the label used for this artist in the legend.\n", " | \n", " | get_path_effects(self)\n", " | \n", " | get_picker(self)\n", " | Return the picker object used by this artist\n", " | \n", " | get_rasterized(self)\n", " | return True if the artist is to be rasterized\n", " | \n", " | get_sketch_params(self)\n", " | Returns the sketch parameters for the artist.\n", " | \n", " | Returns\n", " | -------\n", " | sketch_params : tuple or `None`\n", " | \n", " | A 3-tuple with the following elements:\n", " | \n", " | * `scale`: The amplitude of the wiggle perpendicular to the\n", " | source line.\n", " | \n", " | * `length`: The length of the wiggle along the line.\n", " | \n", " | * `randomness`: The scale factor by which the length is\n", " | shrunken or expanded.\n", " | \n", " | May return `None` if no sketch parameters were set.\n", " | \n", " | get_snap(self)\n", " | Returns the snap setting which may be:\n", " | \n", " | * True: snap vertices to the nearest pixel center\n", " | \n", " | * False: leave vertices as-is\n", " | \n", " | * None: (auto) If the path contains only rectilinear line\n", " | segments, round to the nearest pixel center\n", " | \n", " | Only supported by the Agg and MacOSX backends.\n", " | \n", " | get_transformed_clip_path_and_affine(self)\n", " | Return the clip path with the non-affine part of its\n", " | transformation applied, and the remaining affine part of its\n", " | transformation.\n", " | \n", " | get_url(self)\n", " | Returns the url\n", " | \n", " | get_visible(self)\n", " | Return the artist's visiblity\n", " | \n", " | get_zorder(self)\n", " | Return the :class:`Artist`'s zorder.\n", " | \n", " | have_units(self)\n", " | Return *True* if units are set on the *x* or *y* axes\n", " | \n", " | hitlist(self, event)\n", " | List the children of the artist which contain the mouse event *event*.\n", " | \n", " | is_figure_set(self)\n", " | Returns True if the artist is assigned to a\n", " | :class:`~matplotlib.figure.Figure`.\n", " | \n", " | is_transform_set(self)\n", " | Returns *True* if :class:`Artist` has a transform explicitly\n", " | set.\n", " | \n", " | pchanged(self)\n", " | Fire an event when property changed, calling all of the\n", " | registered callbacks.\n", " | \n", " | pick(self, mouseevent)\n", " | Process pick event\n", " | \n", " | each child artist will fire a pick event if *mouseevent* is over\n", " | the artist and the artist has picker set\n", " | \n", " | pickable(self)\n", " | Return *True* if :class:`Artist` is pickable.\n", " | \n", " | properties(self)\n", " | return a dictionary mapping property name -> value for all Artist props\n", " | \n", " | remove(self)\n", " | Remove the artist from the figure if possible. The effect\n", " | will not be visible until the figure is redrawn, e.g., with\n", " | :meth:`matplotlib.axes.Axes.draw_idle`. Call\n", " | :meth:`matplotlib.axes.Axes.relim` to update the axes limits\n", " | if desired.\n", " | \n", " | Note: :meth:`~matplotlib.axes.Axes.relim` will not see\n", " | collections even if the collection was added to axes with\n", " | *autolim* = True.\n", " | \n", " | Note: there is no support for removing the artist's legend entry.\n", " | \n", " | remove_callback(self, oid)\n", " | Remove a callback based on its *id*.\n", " | \n", " | .. seealso::\n", " | \n", " | :meth:`add_callback`\n", " | For adding callbacks\n", " | \n", " | set(self, **kwargs)\n", " | A property batch setter. Pass *kwargs* to set properties.\n", " | \n", " | set_agg_filter(self, filter_func)\n", " | set agg_filter function.\n", " | \n", " | set_animated(self, b)\n", " | Set the artist's animation state.\n", " | \n", " | ACCEPTS: [True | False]\n", " | \n", " | set_clip_box(self, clipbox)\n", " | Set the artist's clip :class:`~matplotlib.transforms.Bbox`.\n", " | \n", " | ACCEPTS: a :class:`matplotlib.transforms.Bbox` instance\n", " | \n", " | set_clip_on(self, b)\n", " | Set whether artist uses clipping.\n", " | \n", " | When False artists will be visible out side of the axes which\n", " | can lead to unexpected results.\n", " | \n", " | ACCEPTS: [True | False]\n", " | \n", " | set_clip_path(self, path, transform=None)\n", " | Set the artist's clip path, which may be:\n", " | \n", " | - a :class:`~matplotlib.patches.Patch` (or subclass) instance; or\n", " | - a :class:`~matplotlib.path.Path` instance, in which case a\n", " | :class:`~matplotlib.transforms.Transform` instance, which will be\n", " | applied to the path before using it for clipping, must be provided;\n", " | or\n", " | - ``None``, to remove a previously set clipping path.\n", " | \n", " | For efficiency, if the path happens to be an axis-aligned rectangle,\n", " | this method will set the clipping box to the corresponding rectangle\n", " | and set the clipping path to ``None``.\n", " | \n", " | ACCEPTS: [ (:class:`~matplotlib.path.Path`,\n", " | :class:`~matplotlib.transforms.Transform`) |\n", " | :class:`~matplotlib.patches.Patch` | None ]\n", " | \n", " | set_contains(self, picker)\n", " | Replace the contains test used by this artist. The new picker\n", " | should be a callable function which determines whether the\n", " | artist is hit by the mouse event::\n", " | \n", " | hit, props = picker(artist, mouseevent)\n", " | \n", " | If the mouse event is over the artist, return *hit* = *True*\n", " | and *props* is a dictionary of properties you want returned\n", " | with the contains test.\n", " | \n", " | ACCEPTS: a callable function\n", " | \n", " | set_figure(self, fig)\n", " | Set the :class:`~matplotlib.figure.Figure` instance the artist\n", " | belongs to.\n", " | \n", " | ACCEPTS: a :class:`matplotlib.figure.Figure` instance\n", " | \n", " | set_gid(self, gid)\n", " | Sets the (group) id for the artist\n", " | \n", " | ACCEPTS: an id string\n", " | \n", " | set_label(self, s)\n", " | Set the label to *s* for auto legend.\n", " | \n", " | ACCEPTS: string or anything printable with '%s' conversion.\n", " | \n", " | set_path_effects(self, path_effects)\n", " | set path_effects, which should be a list of instances of\n", " | matplotlib.patheffect._Base class or its derivatives.\n", " | \n", " | set_picker(self, picker)\n", " | Set the epsilon for picking used by this artist\n", " | \n", " | *picker* can be one of the following:\n", " | \n", " | * *None*: picking is disabled for this artist (default)\n", " | \n", " | * A boolean: if *True* then picking will be enabled and the\n", " | artist will fire a pick event if the mouse event is over\n", " | the artist\n", " | \n", " | * A float: if picker is a number it is interpreted as an\n", " | epsilon tolerance in points and the artist will fire\n", " | off an event if it's data is within epsilon of the mouse\n", " | event. For some artists like lines and patch collections,\n", " | the artist may provide additional data to the pick event\n", " | that is generated, e.g., the indices of the data within\n", " | epsilon of the pick event\n", " | \n", " | * A function: if picker is callable, it is a user supplied\n", " | function which determines whether the artist is hit by the\n", " | mouse event::\n", " | \n", " | hit, props = picker(artist, mouseevent)\n", " | \n", " | to determine the hit test. if the mouse event is over the\n", " | artist, return *hit=True* and props is a dictionary of\n", " | properties you want added to the PickEvent attributes.\n", " | \n", " | ACCEPTS: [None|float|boolean|callable]\n", " | \n", " | set_rasterized(self, rasterized)\n", " | Force rasterized (bitmap) drawing in vector backend output.\n", " | \n", " | Defaults to None, which implies the backend's default behavior\n", " | \n", " | ACCEPTS: [True | False | None]\n", " | \n", " | set_sketch_params(self, scale=None, length=None, randomness=None)\n", " | Sets the sketch parameters.\n", " | \n", " | Parameters\n", " | ----------\n", " | \n", " | scale : float, optional\n", " | The amplitude of the wiggle perpendicular to the source\n", " | line, in pixels. If scale is `None`, or not provided, no\n", " | sketch filter will be provided.\n", " | \n", " | length : float, optional\n", " | The length of the wiggle along the line, in pixels\n", " | (default 128.0)\n", " | \n", " | randomness : float, optional\n", " | The scale factor by which the length is shrunken or\n", " | expanded (default 16.0)\n", " | \n", " | set_snap(self, snap)\n", " | Sets the snap setting which may be:\n", " | \n", " | * True: snap vertices to the nearest pixel center\n", " | \n", " | * False: leave vertices as-is\n", " | \n", " | * None: (auto) If the path contains only rectilinear line\n", " | segments, round to the nearest pixel center\n", " | \n", " | Only supported by the Agg and MacOSX backends.\n", " | \n", " | set_transform(self, t)\n", " | Set the :class:`~matplotlib.transforms.Transform` instance\n", " | used by this artist.\n", " | \n", " | ACCEPTS: :class:`~matplotlib.transforms.Transform` instance\n", " | \n", " | set_url(self, url)\n", " | Sets the url for the artist\n", " | \n", " | ACCEPTS: a url string\n", " | \n", " | set_visible(self, b)\n", " | Set the artist's visiblity.\n", " | \n", " | ACCEPTS: [True | False]\n", " | \n", " | set_zorder(self, level)\n", " | Set the zorder for the artist. Artists with lower zorder\n", " | values are drawn first.\n", " | \n", " | ACCEPTS: any number\n", " | \n", " | update(self, props)\n", " | Update the properties of this :class:`Artist` from the\n", " | dictionary *prop*.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from matplotlib.artist.Artist:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | axes\n", " | The :class:`~matplotlib.axes.Axes` instance the artist\n", " | resides in, or *None*.\n", " | \n", " | mouseover\n", " | \n", " | stale\n", " | If the artist is 'stale' and needs to be re-drawn for the output to\n", " | match the internal state of the artist.\n", " | \n", " | sticky_edges\n", " | `x` and `y` sticky edge lists.\n", " | \n", " | When performing autoscaling, if a data limit coincides with a value in\n", " | the corresponding sticky_edges list, then no margin will be added--the\n", " | view limit \"sticks\" to the edge. A typical usecase is histograms,\n", " | where one usually expects no margin on the bottom edge (0) of the\n", " | histogram.\n", " | \n", " | This attribute cannot be assigned to; however, the `x` and `y` lists\n", " | can be modified in place as needed.\n", " | \n", " | Examples\n", " | --------\n", " | \n", " | >>> artist.sticky_edges.x[:] = (xmin, xmax)\n", " | >>> artist.sticky_edges.y[:] = (ymin, ymax)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from matplotlib.artist.Artist:\n", " | \n", " | aname = 'Artist'\n", "\n" ] } ], "source": [ "import matplotlib.patches as mpatches # import patches as mpatches\n", "help(mpatches.Wedge)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " So to draw a \"wedge\", we make an _instance_ of the **Wedge** class (e.g., **wedgie**) with the required parameters: **center**, which is a tuple with the coordinates of the origin of the wedge **(x,y)**, a radius, **r** and two angles that specify the sweep of the wedge from one angle (**theta1**) to a second angle (**theta2**). The value for **r** in our case is given by the Fibonacci sequence. **theta1** and **theta2** always sweep out 90 degrees in our case, starting at 0 and progressing around the clock by 90 degree intervals. \n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matplotlib.patches.Wedge" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "center,r,theta1,theta2=(0,0),1,0,90\n", "wedgie = mpatches.Wedge(center,r, theta1,theta2)\n", "type(wedgie)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**wedgie** is an _instance_ of the **Wedge** class. To display **wedgie**, we need to create an _instance_ of a plot object and add the **patch** to the plot. This sounds complicated and it is, but we can take it step by step. \n", "\n", "But first, a new **matplotlib** trick: **plt.subplots( )**. \n", "\n", "\n", "We'll employ **plt.subplots( )** to create our Fibonacci diagram. The class definition **plt.subplots( )** returns two closely related objects usually called **fig** and **ax**. **fig** is the instance of a **Figure** object and **ax** is an **AxesSubplot** object that has many useful methods, one of which (**ax.add_patch( )**) allows us to add the **Wedge** object **wedgie**.\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nCtDvQRmzAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots() # make fig and ax objects\n", "ax.add_patch(wedgie); # add the wedgie patch to the ax object" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matplotlib.figure.Figure" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(fig)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nice, but, the axes are not equal by default and we really don't want the tickmarks. No problem! We can use **plt.axis( )** method which takes **'equal'** and **'off'** as arguments and makes the plot have equal axes that are invisible. \n", "\n", "Also, I really want white wedges, so I can use the keyword argument **facecolor='white'**. " ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matplotlib.axes._subplots.AxesSubplot" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(ax)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\ntvZKAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#remake wedgie that is white with black edges\n", "wedgie=mpatches.Wedge(center,r, theta1,theta2, facecolor=\"white\", edgecolor=\"black\")\n", "fig,ax = plt.subplots() # make fig and ax objects\n", "ax.add_patch(wedgie)\n", "plt.axis('equal')\n", "plt.axis('off');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cool. That worked! \n", "\n", "Now we need a second type of patch that makes rectangles. For this, we will use the **Rectangle** class from **mpatches**.\n", "\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on class Rectangle in module matplotlib.patches:\n", "\n", "class Rectangle(Patch)\n", " | Draw a rectangle with lower left at *xy* = (*x*, *y*) with\n", " | specified *width*, *height* and rotation *angle*.\n", " | \n", " | Method resolution order:\n", " | Rectangle\n", " | Patch\n", " | matplotlib.artist.Artist\n", " | builtins.object\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, xy, width, height, angle=0.0, **kwargs)\n", " | *angle*\n", " | rotation in degrees (anti-clockwise)\n", " | \n", " | *fill* is a boolean indicating whether to fill the rectangle\n", " | \n", " | Valid kwargs are:\n", " | agg_filter: unknown\n", " | alpha: float or None \n", " | animated: [True | False] \n", " | antialiased or aa: [True | False] or None for default \n", " | capstyle: ['butt' | 'round' | 'projecting'] \n", " | clip_box: a :class:`matplotlib.transforms.Bbox` instance \n", " | clip_on: [True | False] \n", " | clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] \n", " | color: matplotlib color spec\n", " | contains: a callable function \n", " | edgecolor or ec: mpl color spec, None, 'none', or 'auto' \n", " | facecolor or fc: mpl color spec, or None for default, or 'none' for no color \n", " | figure: a :class:`matplotlib.figure.Figure` instance \n", " | fill: [True | False] \n", " | gid: an id string \n", " | hatch: ['/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*'] \n", " | joinstyle: ['miter' | 'round' | 'bevel'] \n", " | label: string or anything printable with '%s' conversion. \n", " | linestyle or ls: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) | ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` | ``' '`` | ``''``]\n", " | linewidth or lw: float or None for default \n", " | path_effects: unknown\n", " | picker: [None|float|boolean|callable] \n", " | rasterized: [True | False | None] \n", " | sketch_params: unknown\n", " | snap: unknown\n", " | transform: :class:`~matplotlib.transforms.Transform` instance \n", " | url: a url string \n", " | visible: [True | False] \n", " | zorder: any number\n", " | \n", " | __str__(self)\n", " | Return str(self).\n", " | \n", " | get_bbox(self)\n", " | \n", " | get_height(self)\n", " | Return the height of the rectangle\n", " | \n", " | get_patch_transform(self)\n", " | Return the :class:`~matplotlib.transforms.Transform` instance which\n", " | takes patch coordinates to data coordinates.\n", " | \n", " | For example, one may define a patch of a circle which represents a\n", " | radius of 5 by providing coordinates for a unit circle, and a\n", " | transform which scales the coordinates (the patch coordinate) by 5.\n", " | \n", " | get_path(self)\n", " | Return the vertices of the rectangle\n", " | \n", " | get_width(self)\n", " | Return the width of the rectangle\n", " | \n", " | get_x(self)\n", " | Return the left coord of the rectangle\n", " | \n", " | get_xy(self)\n", " | Return the left and bottom coords of the rectangle\n", " | \n", " | get_y(self)\n", " | Return the bottom coord of the rectangle\n", " | \n", " | set_bounds(self, *args)\n", " | Set the bounds of the rectangle: l,b,w,h\n", " | \n", " | ACCEPTS: (left, bottom, width, height)\n", " | \n", " | set_height(self, h)\n", " | Set the width rectangle\n", " | \n", " | ACCEPTS: float\n", " | \n", " | set_width(self, w)\n", " | Set the width rectangle\n", " | \n", " | ACCEPTS: float\n", " | \n", " | set_x(self, x)\n", " | Set the left coord of the rectangle\n", " | \n", " | ACCEPTS: float\n", " | \n", " | set_xy(self, xy)\n", " | Set the left and bottom coords of the rectangle\n", " | \n", " | ACCEPTS: 2-item sequence\n", " | \n", " | set_y(self, y)\n", " | Set the bottom coord of the rectangle\n", " | \n", " | ACCEPTS: float\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors defined here:\n", " | \n", " | xy\n", " | Return the left and bottom coords of the rectangle\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from Patch:\n", " | \n", " | contains(self, mouseevent, radius=None)\n", " | Test whether the mouse event occurred in the patch.\n", " | \n", " | Returns T/F, {}\n", " | \n", " | contains_point(self, point, radius=None)\n", " | Returns *True* if the given point is inside the path\n", " | (transformed with its transform attribute).\n", " | \n", " | draw(self, renderer)\n", " | Draw the :class:`Patch` to the given *renderer*.\n", " | \n", " | get_aa = get_antialiased(self)\n", " | Returns True if the :class:`Patch` is to be drawn with antialiasing.\n", " | \n", " | get_antialiased(self)\n", " | Returns True if the :class:`Patch` is to be drawn with antialiasing.\n", " | \n", " | get_capstyle(self)\n", " | Return the current capstyle\n", " | \n", " | get_data_transform(self)\n", " | Return the :class:`~matplotlib.transforms.Transform` instance which\n", " | maps data coordinates to physical coordinates.\n", " | \n", " | get_ec = get_edgecolor(self)\n", " | Return the edge color of the :class:`Patch`.\n", " | \n", " | get_edgecolor(self)\n", " | Return the edge color of the :class:`Patch`.\n", " | \n", " | get_extents(self)\n", " | Return a :class:`~matplotlib.transforms.Bbox` object defining\n", " | the axis-aligned extents of the :class:`Patch`.\n", " | \n", " | get_facecolor(self)\n", " | Return the face color of the :class:`Patch`.\n", " | \n", " | get_fc = get_facecolor(self)\n", " | Return the face color of the :class:`Patch`.\n", " | \n", " | get_fill(self)\n", " | return whether fill is set\n", " | \n", " | get_hatch(self)\n", " | Return the current hatching pattern\n", " | \n", " | get_joinstyle(self)\n", " | Return the current joinstyle\n", " | \n", " | get_linestyle(self)\n", " | Return the linestyle. Will be one of ['solid' | 'dashed' |\n", " | 'dashdot' | 'dotted']\n", " | \n", " | get_linewidth(self)\n", " | Return the line width in points.\n", " | \n", " | get_ls = get_linestyle(self)\n", " | Return the linestyle. Will be one of ['solid' | 'dashed' |\n", " | 'dashdot' | 'dotted']\n", " | \n", " | get_lw = get_linewidth(self)\n", " | Return the line width in points.\n", " | \n", " | get_transform(self)\n", " | Return the :class:`~matplotlib.transforms.Transform` applied\n", " | to the :class:`Patch`.\n", " | \n", " | get_verts(self)\n", " | Return a copy of the vertices used in this patch\n", " | \n", " | If the patch contains Bezier curves, the curves will be\n", " | interpolated by line segments. To access the curves as\n", " | curves, use :meth:`get_path`.\n", " | \n", " | get_window_extent(self, renderer=None)\n", " | Get the axes bounding box in display space.\n", " | Subclasses should override for inclusion in the bounding box\n", " | \"tight\" calculation. Default is to return an empty bounding\n", " | box at 0, 0.\n", " | \n", " | Be careful when using this function, the results will not update\n", " | if the artist window extent of the artist changes. The extent\n", " | can change due to any changes in the transform stack, such as\n", " | changing the axes limits, the figure size, or the canvas used\n", " | (as is done when saving a figure). This can lead to unexpected\n", " | behavior where interactive figures will look fine on the screen,\n", " | but will save incorrectly.\n", " | \n", " | set_aa(self, aa)\n", " | alias for set_antialiased\n", " | \n", " | set_alpha(self, alpha)\n", " | Set the alpha tranparency of the patch.\n", " | \n", " | ACCEPTS: float or None\n", " | \n", " | set_antialiased(self, aa)\n", " | Set whether to use antialiased rendering\n", " | \n", " | ACCEPTS: [True | False] or None for default\n", " | \n", " | set_capstyle(self, s)\n", " | Set the patch capstyle\n", " | \n", " | ACCEPTS: ['butt' | 'round' | 'projecting']\n", " | \n", " | set_color(self, c)\n", " | Set both the edgecolor and the facecolor.\n", " | \n", " | ACCEPTS: matplotlib color spec\n", " | \n", " | .. seealso::\n", " | \n", " | :meth:`set_facecolor`, :meth:`set_edgecolor`\n", " | For setting the edge or face color individually.\n", " | \n", " | set_ec(self, color)\n", " | alias for set_edgecolor\n", " | \n", " | set_edgecolor(self, color)\n", " | Set the patch edge color\n", " | \n", " | ACCEPTS: mpl color spec, None, 'none', or 'auto'\n", " | \n", " | set_facecolor(self, color)\n", " | Set the patch face color\n", " | \n", " | ACCEPTS: mpl color spec, or None for default, or 'none' for no color\n", " | \n", " | set_fc(self, color)\n", " | alias for set_facecolor\n", " | \n", " | set_fill(self, b)\n", " | Set whether to fill the patch\n", " | \n", " | ACCEPTS: [True | False]\n", " | \n", " | set_hatch(self, hatch)\n", " | Set the hatching pattern\n", " | \n", " | *hatch* can be one of::\n", " | \n", " | / - diagonal hatching\n", " | \\ - back diagonal\n", " | | - vertical\n", " | - - horizontal\n", " | + - crossed\n", " | x - crossed diagonal\n", " | o - small circle\n", " | O - large circle\n", " | . - dots\n", " | * - stars\n", " | \n", " | Letters can be combined, in which case all the specified\n", " | hatchings are done. If same letter repeats, it increases the\n", " | density of hatching of that pattern.\n", " | \n", " | Hatching is supported in the PostScript, PDF, SVG and Agg\n", " | backends only.\n", " | \n", " | ACCEPTS: ['/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*']\n", " | \n", " | set_joinstyle(self, s)\n", " | Set the patch joinstyle\n", " | \n", " | ACCEPTS: ['miter' | 'round' | 'bevel']\n", " | \n", " | set_linestyle(self, ls)\n", " | Set the patch linestyle\n", " | \n", " | =========================== =================\n", " | linestyle description\n", " | =========================== =================\n", " | ``'-'`` or ``'solid'`` solid line\n", " | ``'--'`` or ``'dashed'`` dashed line\n", " | ``'-.'`` or ``'dashdot'`` dash-dotted line\n", " | ``':'`` or ``'dotted'`` dotted line\n", " | =========================== =================\n", " | \n", " | Alternatively a dash tuple of the following form can be provided::\n", " | \n", " | (offset, onoffseq),\n", " | \n", " | where ``onoffseq`` is an even length tuple of on and off ink\n", " | in points.\n", " | \n", " | ACCEPTS: ['solid' | 'dashed', 'dashdot', 'dotted' |\n", " | (offset, on-off-dash-seq) |\n", " | ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` |\n", " | ``' '`` | ``''``]\n", " | \n", " | Parameters\n", " | ----------\n", " | ls : { '-', '--', '-.', ':'} and more see description\n", " | The line style.\n", " | \n", " | set_linewidth(self, w)\n", " | Set the patch linewidth in points\n", " | \n", " | ACCEPTS: float or None for default\n", " | \n", " | set_ls(self, ls)\n", " | alias for set_linestyle\n", " | \n", " | set_lw(self, lw)\n", " | alias for set_linewidth\n", " | \n", " | update_from(self, other)\n", " | Updates this :class:`Patch` from the properties of *other*.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from Patch:\n", " | \n", " | fill\n", " | return whether fill is set\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from Patch:\n", " | \n", " | validCap = ('butt', 'round', 'projecting')\n", " | \n", " | validJoin = ('miter', 'round', 'bevel')\n", " | \n", " | zorder = 1\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from matplotlib.artist.Artist:\n", " | \n", " | __getstate__(self)\n", " | \n", " | add_callback(self, func)\n", " | Adds a callback function that will be called whenever one of\n", " | the :class:`Artist`'s properties changes.\n", " | \n", " | Returns an *id* that is useful for removing the callback with\n", " | :meth:`remove_callback` later.\n", " | \n", " | convert_xunits(self, x)\n", " | For artists in an axes, if the xaxis has units support,\n", " | convert *x* using xaxis unit type\n", " | \n", " | convert_yunits(self, y)\n", " | For artists in an axes, if the yaxis has units support,\n", " | convert *y* using yaxis unit type\n", " | \n", " | findobj(self, match=None, include_self=True)\n", " | Find artist objects.\n", " | \n", " | Recursively find all :class:`~matplotlib.artist.Artist` instances\n", " | contained in self.\n", " | \n", " | *match* can be\n", " | \n", " | - None: return all objects contained in artist.\n", " | \n", " | - function with signature ``boolean = match(artist)``\n", " | used to filter matches\n", " | \n", " | - class instance: e.g., Line2D. Only return artists of class type.\n", " | \n", " | If *include_self* is True (default), include self in the list to be\n", " | checked for a match.\n", " | \n", " | format_cursor_data(self, data)\n", " | Return *cursor data* string formatted.\n", " | \n", " | get_agg_filter(self)\n", " | return filter function to be used for agg filter\n", " | \n", " | get_alpha(self)\n", " | Return the alpha value used for blending - not supported on all\n", " | backends\n", " | \n", " | get_animated(self)\n", " | Return the artist's animated state\n", " | \n", " | get_children(self)\n", " | Return a list of the child :class:`Artist`s this\n", " | :class:`Artist` contains.\n", " | \n", " | get_clip_box(self)\n", " | Return artist clipbox\n", " | \n", " | get_clip_on(self)\n", " | Return whether artist uses clipping\n", " | \n", " | get_clip_path(self)\n", " | Return artist clip path\n", " | \n", " | get_contains(self)\n", " | Return the _contains test used by the artist, or *None* for default.\n", " | \n", " | get_cursor_data(self, event)\n", " | Get the cursor data for a given event.\n", " | \n", " | get_figure(self)\n", " | Return the :class:`~matplotlib.figure.Figure` instance the\n", " | artist belongs to.\n", " | \n", " | get_gid(self)\n", " | Returns the group id\n", " | \n", " | get_label(self)\n", " | Get the label used for this artist in the legend.\n", " | \n", " | get_path_effects(self)\n", " | \n", " | get_picker(self)\n", " | Return the picker object used by this artist\n", " | \n", " | get_rasterized(self)\n", " | return True if the artist is to be rasterized\n", " | \n", " | get_sketch_params(self)\n", " | Returns the sketch parameters for the artist.\n", " | \n", " | Returns\n", " | -------\n", " | sketch_params : tuple or `None`\n", " | \n", " | A 3-tuple with the following elements:\n", " | \n", " | * `scale`: The amplitude of the wiggle perpendicular to the\n", " | source line.\n", " | \n", " | * `length`: The length of the wiggle along the line.\n", " | \n", " | * `randomness`: The scale factor by which the length is\n", " | shrunken or expanded.\n", " | \n", " | May return `None` if no sketch parameters were set.\n", " | \n", " | get_snap(self)\n", " | Returns the snap setting which may be:\n", " | \n", " | * True: snap vertices to the nearest pixel center\n", " | \n", " | * False: leave vertices as-is\n", " | \n", " | * None: (auto) If the path contains only rectilinear line\n", " | segments, round to the nearest pixel center\n", " | \n", " | Only supported by the Agg and MacOSX backends.\n", " | \n", " | get_transformed_clip_path_and_affine(self)\n", " | Return the clip path with the non-affine part of its\n", " | transformation applied, and the remaining affine part of its\n", " | transformation.\n", " | \n", " | get_url(self)\n", " | Returns the url\n", " | \n", " | get_visible(self)\n", " | Return the artist's visiblity\n", " | \n", " | get_zorder(self)\n", " | Return the :class:`Artist`'s zorder.\n", " | \n", " | have_units(self)\n", " | Return *True* if units are set on the *x* or *y* axes\n", " | \n", " | hitlist(self, event)\n", " | List the children of the artist which contain the mouse event *event*.\n", " | \n", " | is_figure_set(self)\n", " | Returns True if the artist is assigned to a\n", " | :class:`~matplotlib.figure.Figure`.\n", " | \n", " | is_transform_set(self)\n", " | Returns *True* if :class:`Artist` has a transform explicitly\n", " | set.\n", " | \n", " | pchanged(self)\n", " | Fire an event when property changed, calling all of the\n", " | registered callbacks.\n", " | \n", " | pick(self, mouseevent)\n", " | Process pick event\n", " | \n", " | each child artist will fire a pick event if *mouseevent* is over\n", " | the artist and the artist has picker set\n", " | \n", " | pickable(self)\n", " | Return *True* if :class:`Artist` is pickable.\n", " | \n", " | properties(self)\n", " | return a dictionary mapping property name -> value for all Artist props\n", " | \n", " | remove(self)\n", " | Remove the artist from the figure if possible. The effect\n", " | will not be visible until the figure is redrawn, e.g., with\n", " | :meth:`matplotlib.axes.Axes.draw_idle`. Call\n", " | :meth:`matplotlib.axes.Axes.relim` to update the axes limits\n", " | if desired.\n", " | \n", " | Note: :meth:`~matplotlib.axes.Axes.relim` will not see\n", " | collections even if the collection was added to axes with\n", " | *autolim* = True.\n", " | \n", " | Note: there is no support for removing the artist's legend entry.\n", " | \n", " | remove_callback(self, oid)\n", " | Remove a callback based on its *id*.\n", " | \n", " | .. seealso::\n", " | \n", " | :meth:`add_callback`\n", " | For adding callbacks\n", " | \n", " | set(self, **kwargs)\n", " | A property batch setter. Pass *kwargs* to set properties.\n", " | \n", " | set_agg_filter(self, filter_func)\n", " | set agg_filter function.\n", " | \n", " | set_animated(self, b)\n", " | Set the artist's animation state.\n", " | \n", " | ACCEPTS: [True | False]\n", " | \n", " | set_clip_box(self, clipbox)\n", " | Set the artist's clip :class:`~matplotlib.transforms.Bbox`.\n", " | \n", " | ACCEPTS: a :class:`matplotlib.transforms.Bbox` instance\n", " | \n", " | set_clip_on(self, b)\n", " | Set whether artist uses clipping.\n", " | \n", " | When False artists will be visible out side of the axes which\n", " | can lead to unexpected results.\n", " | \n", " | ACCEPTS: [True | False]\n", " | \n", " | set_clip_path(self, path, transform=None)\n", " | Set the artist's clip path, which may be:\n", " | \n", " | - a :class:`~matplotlib.patches.Patch` (or subclass) instance; or\n", " | - a :class:`~matplotlib.path.Path` instance, in which case a\n", " | :class:`~matplotlib.transforms.Transform` instance, which will be\n", " | applied to the path before using it for clipping, must be provided;\n", " | or\n", " | - ``None``, to remove a previously set clipping path.\n", " | \n", " | For efficiency, if the path happens to be an axis-aligned rectangle,\n", " | this method will set the clipping box to the corresponding rectangle\n", " | and set the clipping path to ``None``.\n", " | \n", " | ACCEPTS: [ (:class:`~matplotlib.path.Path`,\n", " | :class:`~matplotlib.transforms.Transform`) |\n", " | :class:`~matplotlib.patches.Patch` | None ]\n", " | \n", " | set_contains(self, picker)\n", " | Replace the contains test used by this artist. The new picker\n", " | should be a callable function which determines whether the\n", " | artist is hit by the mouse event::\n", " | \n", " | hit, props = picker(artist, mouseevent)\n", " | \n", " | If the mouse event is over the artist, return *hit* = *True*\n", " | and *props* is a dictionary of properties you want returned\n", " | with the contains test.\n", " | \n", " | ACCEPTS: a callable function\n", " | \n", " | set_figure(self, fig)\n", " | Set the :class:`~matplotlib.figure.Figure` instance the artist\n", " | belongs to.\n", " | \n", " | ACCEPTS: a :class:`matplotlib.figure.Figure` instance\n", " | \n", " | set_gid(self, gid)\n", " | Sets the (group) id for the artist\n", " | \n", " | ACCEPTS: an id string\n", " | \n", " | set_label(self, s)\n", " | Set the label to *s* for auto legend.\n", " | \n", " | ACCEPTS: string or anything printable with '%s' conversion.\n", " | \n", " | set_path_effects(self, path_effects)\n", " | set path_effects, which should be a list of instances of\n", " | matplotlib.patheffect._Base class or its derivatives.\n", " | \n", " | set_picker(self, picker)\n", " | Set the epsilon for picking used by this artist\n", " | \n", " | *picker* can be one of the following:\n", " | \n", " | * *None*: picking is disabled for this artist (default)\n", " | \n", " | * A boolean: if *True* then picking will be enabled and the\n", " | artist will fire a pick event if the mouse event is over\n", " | the artist\n", " | \n", " | * A float: if picker is a number it is interpreted as an\n", " | epsilon tolerance in points and the artist will fire\n", " | off an event if it's data is within epsilon of the mouse\n", " | event. For some artists like lines and patch collections,\n", " | the artist may provide additional data to the pick event\n", " | that is generated, e.g., the indices of the data within\n", " | epsilon of the pick event\n", " | \n", " | * A function: if picker is callable, it is a user supplied\n", " | function which determines whether the artist is hit by the\n", " | mouse event::\n", " | \n", " | hit, props = picker(artist, mouseevent)\n", " | \n", " | to determine the hit test. if the mouse event is over the\n", " | artist, return *hit=True* and props is a dictionary of\n", " | properties you want added to the PickEvent attributes.\n", " | \n", " | ACCEPTS: [None|float|boolean|callable]\n", " | \n", " | set_rasterized(self, rasterized)\n", " | Force rasterized (bitmap) drawing in vector backend output.\n", " | \n", " | Defaults to None, which implies the backend's default behavior\n", " | \n", " | ACCEPTS: [True | False | None]\n", " | \n", " | set_sketch_params(self, scale=None, length=None, randomness=None)\n", " | Sets the sketch parameters.\n", " | \n", " | Parameters\n", " | ----------\n", " | \n", " | scale : float, optional\n", " | The amplitude of the wiggle perpendicular to the source\n", " | line, in pixels. If scale is `None`, or not provided, no\n", " | sketch filter will be provided.\n", " | \n", " | length : float, optional\n", " | The length of the wiggle along the line, in pixels\n", " | (default 128.0)\n", " | \n", " | randomness : float, optional\n", " | The scale factor by which the length is shrunken or\n", " | expanded (default 16.0)\n", " | \n", " | set_snap(self, snap)\n", " | Sets the snap setting which may be:\n", " | \n", " | * True: snap vertices to the nearest pixel center\n", " | \n", " | * False: leave vertices as-is\n", " | \n", " | * None: (auto) If the path contains only rectilinear line\n", " | segments, round to the nearest pixel center\n", " | \n", " | Only supported by the Agg and MacOSX backends.\n", " | \n", " | set_transform(self, t)\n", " | Set the :class:`~matplotlib.transforms.Transform` instance\n", " | used by this artist.\n", " | \n", " | ACCEPTS: :class:`~matplotlib.transforms.Transform` instance\n", " | \n", " | set_url(self, url)\n", " | Sets the url for the artist\n", " | \n", " | ACCEPTS: a url string\n", " | \n", " | set_visible(self, b)\n", " | Set the artist's visiblity.\n", " | \n", " | ACCEPTS: [True | False]\n", " | \n", " | set_zorder(self, level)\n", " | Set the zorder for the artist. Artists with lower zorder\n", " | values are drawn first.\n", " | \n", " | ACCEPTS: any number\n", " | \n", " | update(self, props)\n", " | Update the properties of this :class:`Artist` from the\n", " | dictionary *prop*.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from matplotlib.artist.Artist:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | axes\n", " | The :class:`~matplotlib.axes.Axes` instance the artist\n", " | resides in, or *None*.\n", " | \n", " | mouseover\n", " | \n", " | stale\n", " | If the artist is 'stale' and needs to be re-drawn for the output to\n", " | match the internal state of the artist.\n", " | \n", " | sticky_edges\n", " | `x` and `y` sticky edge lists.\n", " | \n", " | When performing autoscaling, if a data limit coincides with a value in\n", " | the corresponding sticky_edges list, then no margin will be added--the\n", " | view limit \"sticks\" to the edge. A typical usecase is histograms,\n", " | where one usually expects no margin on the bottom edge (0) of the\n", " | histogram.\n", " | \n", " | This attribute cannot be assigned to; however, the `x` and `y` lists\n", " | can be modified in place as needed.\n", " | \n", " | Examples\n", " | --------\n", " | \n", " | >>> artist.sticky_edges.x[:] = (xmin, xmax)\n", " | >>> artist.sticky_edges.y[:] = (ymin, ymax)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from matplotlib.artist.Artist:\n", " | \n", " | aname = 'Artist'\n", "\n" ] } ], "source": [ "help(mpatches.Rectangle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the **Rectangle** makes a rectangle with the lower left corner set at **(x,y)** and with a specified width and height (here the fibonacci numbers).\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here we put it all together....." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots() # make fig and ax objects\n", "# initilize the xy array used for setting the origins of subsequent wedges.\n", "xy = np.array([0, 0]) # our initial lower left corner of the rectangles. \n", "c = xy # our first origin (or center) for the wedges\n", "i=1 # a counter to keep track of which wedge we are on. \n", "thetas = np.array([270, 0]) # initialize our thetas. \n", "for j in range(10): # walk through the fibonacci sequence starting with 1.\n", " thetas += 90 # increment thetas by 90\n", " thetas %= 360 # make sure it stays between 0 and 360 using modulo\n", " if i == 5: i=1 # start over with 1\n", " if i==1: # first in the sequence around the clock-face\n", " xy = xy + [ -fib(j-2) , fib(j-1) ] # increment xy by two fib numbers\n", " c = c + [ -fib(j-2), 0 ] # increment wedge center\n", " elif i==2: # second part\n", " xy = xy + [ -fib(j) , -fib(j-2)]\n", " c = c + [0 , -fib(j-2) ] \n", " elif i==3: # third part\n", " xy = xy + [ 0 , -fib(j) ]\n", " c = c + [ fib(j-2) , 0 ]\n", " elif i==4: # last part\n", " xy = xy + [ fib(j-1) , 0 ]\n", " c = c + [ 0 , fib(j-2) ]\n", " \n", "\n", " # Add a rectangle\n", " rect = mpatches.Rectangle((xy[0],xy[1]), fib(j), fib(j),\\\n", " facecolor='white', edgecolor=\"black\") # make a square\n", "\n", " ax.add_patch(rect)\n", "\n", " # Add a wedge\n", " wedge = mpatches.Wedge((c[0],c[1]), fib(j), thetas[0] , thetas[1],\\\n", " facecolor='white', edgecolor=\"black\") # make a wedge\n", " ax.add_patch(wedge)\n", "\n", " # put on some text with the fib number getting progressively larger\n", " plt.text(xy[0]+0.5*fib(j), xy[1]+0.5*fib(j), str(fib(j)), ha=\"center\", size=j*2)\n", " i+=1 # increment the counter\n", "plt.axis('equal') # make the axes equal - otherwise the default will distort them\n", "plt.axis('off'); # take the annoying axes off altogether. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exceptions\n", "\n", "We still haven't mentioned how to handle errors; how should your code handle problems? Should it notify the user? Stop working entirely? Ignore the error and continue? You can control how your functions and any program responds to errors, by catching _exceptions_ (errors) and handling them however you choose. \n", "\n", "Have you noticed that whenever you write improper code, the error type is defined? For example, the cell below throws a **NameError** because we haven't defined the variable **abcdef**" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "scrolled": true }, "outputs": [ { "ename": "NameError", "evalue": "name 'abcdef' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mabcdef\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\"complete\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'abcdef' is not defined" ] } ], "source": [ "print (abcdef)\n", "print (\"complete\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The error crashes the code and prevents any of the following commands from executing. We could catch this _exception_ and allow the program to continue. The syntax for exceptions is as follows:\n", "\n", "**try:** \n", " \n", " statement \n", " \n", "**except (** ExceptionType**):** \n", "\n", " statement. \n", "\n", "The first statement is attempted. If that statement throws an _exception_ and the _exception_ is included in **ExceptionType**, then the second statement is executed and the program continues. \n", "\n", "Here's our original example, except this time, we'll catch any **NameError** exceptions:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This variable does not exist\n", "See I didn't crash! I just told you what went wrong!\n" ] } ], "source": [ "try:\n", " print (abcdef)\n", "except(NameError):\n", " print ('This variable does not exist')\n", "\n", "print (\"See I didn't crash! I just told you what went wrong!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can handle the error however you'd like and you may catch any number of errors. The most common errors are: \n", "\n", "**KeyError**:\tRaised when the specified key is not found in the dictionary.\n", "\n", "**NameError**:\tRaised when an identifier is not found in the local or global namespace \n", "\n", "**TypeError**:\tRaised when an operation or function is attempted that is invalid for the specified data type.\n", "\n", "**ZeroDivisonError**: Raised when division or modulo by zero takes place for \n", "all numeric types.\n", "\n", "**ValueError**:\tRaised when the built-in function for a data type has the valid type of arguments, but the arguments have invalid values specified.\n", "\n", "To learn what type of error occured, the error object is called **Exception** and you can print that and/or Exception.\\_\\_class\\_\\_.\\_\\_name\\_\\_ " ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "(\"name 'abcdef' is not defined\",)\n", "name 'abcdef' is not defined\n" ] } ], "source": [ "try:\n", " print (abcdef)\n", "except Exception as inst: # call the Exception instance inst\n", " #print (Exception.__class__.__name__)\n", " print (type(inst)) # print the type of Exception\n", " print (inst.args) # print any arguments of the instance\n", " print (inst) # print out the error message\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These messages give you a clue how to fix the problem (in this case, by defining **abcdef**). These clues can be used for various debugging tricks like what to do for different types of errors. " ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I could do something else here\n" ] } ], "source": [ "try:\n", " print (abcdef)\n", "except KeyError:\n", " print ('I could do one thing here')\n", "except NameError: \n", " print ('I could do something else here')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For more information about Exceptions:\n", "\n", "https://docs.python.org/3/tutorial/errors.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Assignment #4\n", "Create a new notebook with the name format: Lastname_HomeworkNumber. For example, **Asefaw_4**\n", "\n", "Create a markdown block in which you will describe what the notebook does. \n", "\n", "1. The equations for an ellipse are: \n", "> x =a cos( $\\theta$ ) , y=b sin( $\\theta$ ) \n", "
$a$ is the major radius \n", "
$b$ is the minor radius \n", "
$\\theta$ is the angle \n", " \n", " a. Write a **lambda function** that returns $x$ and $y$ given $a$, $b$, and $\\theta$. Assume that theta goes from 0 to 360. Remember that trig functions assume the arguments are in radians\n", "
b. Plot your ellipse using **matplotlib.pyplot** (imported as **plt**). Use the **%matplotlib inline** magic command\n", "

\n", "2. Write a **lambda function** that returns the square of an input parameter $x$\n", "
a. Use **map( )** to generate a list of squares for a sequence with 10 values\n", "
b. Use **filter( )** and the lambda function to generate a list of squares that are between 5 and 50.\n", "
c. Use a **list comprehension** to generate the same list with only one line of code.\n", "

\n", "3. Create a **Class**, it should include at least 3 **attributes** and 3 **methods**. Be creative! Here are a few possibilities- Card, Deck, Planet, Phone Contact, Ocean, Student, Cellphone, Dog, Car\n", "
a. Save your class in a **module**, import the module into your notebook\n", "
b. Create 3 **instances** of your class, change the value of at least one attribute for one instance of your class \n", "
c. Call all three of your methods- you can use any of the instances of your class\n", "\n", "\n", "\n", "Your code must be fully commented. \n", "\n", "Turn in your notebook on the tritoned.ucsd.edu website BEFORE the start of class next Friday. \n", "\n", "You will recieve a \"zero\" if the assignment is late, copied, or missing comments. If the degree of copying is serious enough, you WILL be reported, so just don't do it. \n", "\n", "If you have trouble - contact the TA or the instructor - we are here to help! As usual, come to the Discussion session for sage advice. " ] } ], "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" } }, "nbformat": 4, "nbformat_minor": 1 }