{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "2D random walk animation", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "d4DBJdAWNs1i", "colab_type": "text" }, "source": [ "# Two-Dimensional Random Walk Animation\n", "\n", "Here is an animation of a 2D random walk, created with Python `matplotlib.animation`." ] }, { "cell_type": "code", "metadata": { "id": "ufQ1D_xewxFm", "colab_type": "code", "colab": {} }, "source": [ "# import the necessary modules\n", "import numpy\n", "import random\n", "import matplotlib.pyplot as plt\n", "from matplotlib import animation\n", "from IPython.display import HTML" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "w2BR3JwuOIHI", "colab_type": "text" }, "source": [ "The following code draws the frames of the animation." ] }, { "cell_type": "code", "metadata": { "id": "uqQcRQ94w2io", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 269 }, "outputId": "baa516cf-f573-4315-99e1-81785e8ee511" }, "source": [ "# define some plot variables\n", "fig, ax = plt.subplots()\n", "ax.set_xlim(-10,10)\n", "ax.set_ylim(-10,10)\n", "\n", "# define the possible moves at each step of the random walk\n", "dirs = numpy.array([[0,1],[0,-1],[1,0],[-1,0]])\n", "\n", "# define a numpy array to hold the locations visited on the random walk\n", "locations = numpy.zeros((1,2)) # 1 row, 2 columns\n", "\n", "# define a function to make animation frames\n", "def run(i):\n", " global locations\n", " \n", " # first frame is handled separately\n", " if i == 0:\n", " line, = ax.plot([], [], lw=2)\n", " ax.plot(0,0,'ro')\n", " return line\n", " \n", " # generate a step of the random walk\n", " r = random.randrange(4)\n", " move = dirs[r]\n", " nextloc = [locations[-1] + move]\n", " locations = numpy.append(locations, nextloc, axis=0)\n", " \n", " # set the plot data\n", " xdata = locations[:,0]\n", " ydata = locations[:,1]\n", " \n", " ax.cla() # clear the previous plot (necessary for removing old dots)\n", " \n", " # update the plot limits\n", " ax.set_xlim(min(-10,min(xdata)-1), max(10,max(xdata)+1))\n", " ax.set_ylim(min(-10,min(ydata)-1), max(10,max(ydata)+1))\n", " \n", " # redraw the plot\n", " line, = ax.plot([], [], lw=2)\n", " line.set_data(xdata, ydata)\n", " ax.plot(locations[-1,0], locations[-1,1], 'ro')\n", " \n", " return line" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "gDnAvViqOtOT", "colab_type": "text" }, "source": [ "The next line of code produces the animation object." ] }, { "cell_type": "code", "metadata": { "id": "9gAFS_lQ2YX2", "colab_type": "code", "colab": {} }, "source": [ "anim = animation.FuncAnimation(fig, run, frames=400, interval=100)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "bTZbv6_6O4F1", "colab_type": "text" }, "source": [ "One way to view the animation is by converting it to an HTML5 video:" ] }, { "cell_type": "code", "metadata": { "id": "U8axK5262Z5-", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 309 }, "outputId": "38e67a97-f0b5-4b9d-ea70-ba32a6ac8e96" }, "source": [ "HTML(anim.to_html5_video())" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 7 } ] }, { "cell_type": "markdown", "metadata": { "id": "32s4wn8_O9WO", "colab_type": "text" }, "source": [ "Another way to view the animation is to create an interactive JavaScript object, which provides more controls than the HTML5 video." ] }, { "cell_type": "code", "metadata": { "id": "Mw8rZsSI2b9H", "colab_type": "code", "colab": {} }, "source": [ "HTML(anim.to_jshtml())" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "eA_zGbc0O1bk", "colab_type": "code", "colab": {} }, "source": [ "" ], "execution_count": null, "outputs": [] } ] }