Skip to content

Instantly share code, notes, and snippets.

@yrevar
Created March 4, 2020 06:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yrevar/77062141a8d2dda4b72874147fe8a032 to your computer and use it in GitHub Desktop.
Save yrevar/77062141a8d2dda4b72874147fe8a032 to your computer and use it in GitHub Desktop.
Matplotlib plots to gif maker
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import io, imageio\n",
"from PIL import Image\n",
"from IPython import display\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def read_pil_image_from_plt():\n",
" buf = io.BytesIO()\n",
" plt.savefig(buf, format='png')\n",
" buf.seek(0)\n",
" return Image.open(buf)\n",
"\n",
"class GifMaker:\n",
" def __init__(self, fname=None, fps=10, live_view=False, mode=\"I\"):\n",
" self.live_view = live_view\n",
" if fname is not None:\n",
" self.gif_writer = imageio.get_writer(fname, mode=mode, fps=fps)\n",
" else:\n",
" self.gif_writer = None\n",
" \n",
" def __enter__(self):\n",
" return self\n",
" \n",
" def __exit__(self, type, value, traceback):\n",
" self.done()\n",
" \n",
" def add_plot(self):\n",
" self.add_image(read_pil_image_from_plt())\n",
" \n",
" def add_image(self, img, show=False):\n",
" if self.gif_writer is not None:\n",
" self.gif_writer.append_data(np.array(img))\n",
" if self.live_view:\n",
" if show: plt.imshow(img)\n",
" display.clear_output(wait=True)\n",
" display.display(plt.gcf())\n",
" \n",
" def done(self):\n",
" if self.gif_writer is not None:\n",
" self.gif_writer.close()\n",
" if self.live_view:\n",
" plt.clf()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<Figure size 360x360 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(5,5))\n",
"with GifMaker(\"./test.gif\", live_view=True) as gifmaker:\n",
" for k in range(2):\n",
" for h in np.logspace(0.1,1.8,10)[::-1 if k is 1 else 1]:\n",
" # plt.gca().cla() # clear canvas\n",
" for theta in np.linspace(-np.pi, np.pi, 30):\n",
" r, cx, cy = 0.01, theta, 2/h * np.sin(theta if k is 0 else theta+np.pi)\n",
" plt.plot(cx + r * np.cos(np.linspace(0,2*np.pi,100)), cy + r * np.sin(np.linspace(0,2*np.pi,100)))\n",
" plt.xlim([-np.pi, np.pi])\n",
" plt.ylim([-np.pi, np.pi])\n",
" gifmaker.add_plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"./test.gif\" />"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:gltl] *",
"language": "python",
"name": "conda-env-gltl-py"
},
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@yrevar
Copy link
Author

yrevar commented Mar 4, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment