{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Animáció készítése pythonnal\n", "\n", "A következőkben arra láthatunk példákat, hogy hogy hogyan tudunk egyszerű animációkat készíteni a már korábban megismert `python`, `numpy` és `matplotlib` segítségével. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.animation as animation\n", "\n", "fig, ax = plt.subplots()\n", "two_pi = np.pi * 2\n", "x_vals = np.arange(0.0, two_pi, 0.001)\n", "y_vals = np.sin(x_vals)\n", "ax = plt.axis([0, two_pi, -1.1, 1.1])\n", "moving_point, = plt.plot([0], [np.sin(0)], marker = 'o', markerfacecolor=\"#ffc819\", markeredgecolor='w', markersize = 100)\n", "\n", "def animate_point(i):\n", " moving_point.set_data(i, np.sin(i))\n", " return moving_point,\n", "\n", "fr = np.arange(0.0, two_pi, 0.1)\n", "myAnimation = animation.FuncAnimation(fig, animate_point, frames=fr, repeat=True, blit=True, interval=10)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Az animációt `gif`-ként elmenteni a következő kóddal lehet, de ez nem végtelenített lejátszást generál.\n", "\n", "```python\n", "from matplotlib.animation import PillowWriter\n", "myAnimation.save(\"circle.gif\", writer=PillowWriter(fps=24))\n", "```\n", "\n", "### loop - végtelen lejátszású gif:\n", "\n", "A nem végtelen lejátszás ismert Issue a matplotlibben. Ezt később javítani fogják, de jelenleg a legjobb, amit thetünk, hogy a felüldefiniáljuk a `PillowWriter`-t egy `LoopingPillowWriter`-rel, valahogy így:\n", "\n", "Issue: https://github.com/t-makaro/animatplot/issues/24\n", "\n", "\n", "```python\n", "from matplotlib.animation import PillowWriter\n", "\n", "class LoopingPillowWriter(PillowWriter):\n", " def finish(self):\n", " self._frames[0].save(\n", " self._outfile, save_all=True, append_images=self._frames[1:],\n", " duration=int(1000 / self.fps), loop=0)\n", "\n", "\n", "myAnimation.save(\"line.gif\", writer=LoopingPillowWriter(fps=24))\n", "```\n", "\n", "\n", "### Nézzünk egy másik példát:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAA3FJREFUeJzt2aFRg0EURtEXBodAoFIMmiZQNIHEU0c6iaYOmmBm00HUzv0F5xTwzaor3p7WWgNA4+HoBwD8J6ILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIPe4cu57fv2fmY+cmwMF+Xn8vb7vGtkZ3Zp5m5mXzJsCRnneOOS8AhEQXICS6ACHRBQjt/kj7nJmvzZsAR/rbOXZaa+3cA+AO5wWAkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCN1taDuxN2OLyAAAAAElFTkSuQmCC\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.animation as animation\n", "\n", "fig, ax = plt.subplots()\n", "ten_pi = np.pi * 10\n", "x_vals = np.arange(0.0, ten_pi, 0.001)\n", "y_vals = np.sin(x_vals)\n", "plt.ylim([-5, 5])\n", "plt.xticks([])\n", "plt.yticks([])\n", "ax.axis('off')\n", "\n", "line, = plt.plot(x_vals, color=\"#c2185b\", linewidth = 6)\n", "\n", "def animate_line(i):\n", " if i > 10:\n", " i = 20 - i\n", " new_val = i / 5 * np.sin(x_vals)\n", " line.set_ydata(new_val)\n", " return [line]\n", "\n", "myAnimation = animation.FuncAnimation(fig, animate_line, 20, blit=True)\n", "# from matplotlib.animation import PillowWriter\n", "# myAnimation.save(\"line.gif\", writer=PillowWriter(fps=24))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### _Used sources_ / Felhasznált források\n", "- [Shannon Turner: Python lessons repository](https://github.com/shannonturner/python-lessons) MIT license (c) Shannon Turner 2013-2014\n", "- [Siki Zoltán: Python mogyoróhéjban](http://www.agt.bme.hu/gis/python/python_oktato.pdf) GNU FDL license (c) Siki Zoltán\n", "- [BME AUT](https://github.com/bmeaut) MIT License Copyright (c) BME AUT 2016-2018\n", "- [Matplotlib animation API](https://matplotlib.org/3.1.1/api/animation_api.html)" ] } ], "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.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }