{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "3xXsB4MZ2BIh" }, "source": [ "# matplotlib 入門 (14) nitta@tsuda.ac.jp\n", "# Chapter 14: Animation (compatible with Google Colab) (2) \n" ] }, { "cell_type": "markdown", "metadata": { "id": "IM8zN6ZNyR_m" }, "source": [ "# OpenAI Gym Envs on Google Colab\n", "\n", "In order to animate OpenAI Gym Envs on Google Colab, you need to use the virtual display Xvfb via PyVirtualDisplay." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "VBS5ycq2ROk4" }, "outputs": [], "source": [ "is_colab = 'google.colab' in str(get_ipython()) # for Google Colab" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 7436, "status": "ok", "timestamp": 1657448345270, "user": { "displayName": "Yoshihisa Nitta", "userId": "15888006800030996813" }, "user_tz": -540 }, "id": "SyBCS4PjMn3G", "outputId": "6119930e-70cc-43e0-e80c-e6cb315a40e5" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "63 packages can be upgraded. Run 'apt list --upgradable' to see them.\n", "xvfb is already the newest version (2:1.19.6-1ubuntu4.10).\n", "The following package was automatically installed and is no longer required:\n", " libnvidia-common-460\n", "Use 'apt autoremove' to remove it.\n", "0 upgraded, 0 newly installed, 0 to remove and 63 not upgraded.\n" ] } ], "source": [ "if is_colab:\n", " !apt update -qq\n", " !apt install -qq xvfb\n", " !pip -q install pyvirtualdisplay" ] }, { "cell_type": "markdown", "metadata": { "id": "pVimOj0LCJYJ" }, "source": [ "## Animation by displaying images frame by fame" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 328 }, "executionInfo": { "elapsed": 10747, "status": "ok", "timestamp": 1657448355999, "user": { "displayName": "Yoshihisa Nitta", "userId": "15888006800030996813" }, "user_tz": -540 }, "id": "9nYUGkX-QogR", "outputId": "84c0e516-f4a1-4f7d-ad93-6c9bebca6ae2" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import gym\n", "from IPython import display\n", "import matplotlib.pyplot as plt\n", "\n", "if is_colab:\n", " from pyvirtualdisplay import Display\n", " vdisplay = Display()\n", " vdisplay.start()\n", "\n", "env = gym.make('CartPole-v1')\n", "\n", "env.reset()\n", "\n", "fig = plt.figure(figsize=(8,6))\n", "plt.axis('off')\n", "img = plt.imshow(env.render(mode='rgb_array'))\n", "for _ in range(100):\n", " observation, reward, done, info = env.step(env.action_space.sample()) # needs action from DNN\n", "\n", " display.clear_output(wait=True)\n", " img.set_data(env.render(mode='rgb_array'))\n", "\n", " display.display(plt.gcf())\n", "\n", " if done:\n", " env.reset()\n", " \n", "plt.close()" ] }, { "cell_type": "markdown", "metadata": { "id": "Djzp7SIBr6by" }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "id": "dLJokgzeCEUQ" }, "source": [ "## FuncAnimation" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 530 }, "executionInfo": { "elapsed": 13123, "status": "ok", "timestamp": 1657448369086, "user": { "displayName": "Yoshihisa Nitta", "userId": "15888006800030996813" }, "user_tz": -540 }, "id": "ZBXK4yZf3Na7", "outputId": "0764d7ec-734b-4cb6-f005-8439aa55deef" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import gym\n", "from IPython import display\n", "import matplotlib.pyplot as plt\n", "from matplotlib import animation\n", "\n", "if is_colab:\n", " from pyvirtualdisplay import Display\n", " vdisplay = Display()\n", " vdisplay.start()\n", "\n", "env = gym.make('CartPole-v1')\n", "env.reset()\n", "\n", "plt.figure(figsize=(8,6))\n", "patch = plt.imshow(env.render(mode='rgb_array'))\n", "plt.axis('off')\n", "\n", "def animate(i):\n", " observation, reward, done, info = env.step(env.action_space.sample()) # needs action from DNN\n", " display.clear_output(wait=True)\n", " patch.set_data(env.render(mode='rgb_array'))\n", " if done:\n", " env.reset()\n", " return patch\n", "\n", "\n", "anim = animation.FuncAnimation(plt.gcf(), animate, frames=100, interval=50, repeat=False)\n", "display.display(display.HTML(anim.to_jshtml()))\n", "\n", "plt.close()" ] }, { "cell_type": "markdown", "metadata": { "id": "qhHRApdmsBrx" }, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tdiHSA4FROk9" }, "outputs": [], "source": [] } ], "metadata": { "accelerator": "GPU", "colab": { "provenance": [ { "file_id": "1IGP9QhzdTUNDkxyQQSqFhxeHi5UzpOcQ", "timestamp": 1649641303060 } ] }, "gpuClass": "standard", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.13" } }, "nbformat": 4, "nbformat_minor": 1 }