{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib widget" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5f55bdbff37043bb8e9f05835be4c6e3", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig, ax = plt.subplots()\n", "fig.canvas.width = '7in'\n", "fig.canvas.height= '5in'\n", "\n", "# if I hide the header here, I get a libpng error\n", "# fig.canvas.header_visible = False\n", "\n", "ax.plot([1,2,3], [4,5,3])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# hiding after rendering works\n", "fig.canvas.header_visible = False" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e0b21d300cff4df3b616fdae74984486", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# hiding together with calls to toolbar options, work.\n", "fig, ax = plt.subplots()\n", "fig.canvas.width = '7in'\n", "fig.canvas.height= '5in'\n", "\n", "fig.canvas.toolbar_visible = False\n", "fig.canvas.header_visible = False\n", "\n", "ax.plot([1,2,3], [4,5,3])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b8cab1f8c4e544eca23e0b2fb7246dd6", "version_major": 2, "version_minor": 0 }, "text/plain": [ "AppLayout(children=(FloatSlider(value=1.0, description='Factor:', layout=Layout(grid_area='footer', margin='0p…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# When using the `widget` backend from ipympl,\n", "# fig.canvas is a proper Jupyter interactive widget, which can be embedded in\n", "# an ipywidgets layout. See https://ipywidgets.readthedocs.io/en/stable/examples/Layout%20Templates.html\n", "\n", "# One can bound figure attributes to other widget values.\n", "from ipywidgets import AppLayout, FloatSlider\n", "\n", "plt.ioff()\n", "\n", "slider = FloatSlider(\n", " orientation='horizontal',\n", " description='Factor:',\n", " value=1.0,\n", " min=0.02,\n", " max=2.0\n", ")\n", "\n", "slider.layout.margin = '0px 30% 0px 30%'\n", "slider.layout.width = '40%'\n", "\n", "fig = plt.figure()\n", "fig.canvas.header_visible = False\n", "fig.canvas.layout.min_height = '400px'\n", "plt.title('Plotting: y=sin({} * x)'.format(slider.value))\n", "\n", "x = np.linspace(0, 20, 500)\n", "\n", "lines = plt.plot(x, np.sin(slider.value * x))\n", "\n", "def update_lines(change):\n", " plt.title('Plotting: y=sin({} * x)'.format(change.new))\n", " lines[0].set_data(x, np.sin(change.new * x))\n", " fig.canvas.draw()\n", " fig.canvas.flush_events()\n", "\n", "slider.observe(update_lines, names='value')\n", "\n", "AppLayout(\n", " center=fig.canvas,\n", " footer=slider,\n", " pane_heights=[0, 6, 1]\n", ")" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saving 'svg_filter_pie.svg'\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from matplotlib.patches import Shadow\n", "\n", "# make a square figure and axes\n", "fig = plt.figure(figsize=(6, 6))\n", "ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])\n", "\n", "labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'\n", "fracs = [15, 30, 45, 10]\n", "\n", "explode = (0, 0.05, 0, 0)\n", "\n", "# We want to draw the shadow for each pie but we will not use \"shadow\"\n", "# option as it does'n save the references to the shadow patches.\n", "pies = ax.pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%')\n", "\n", "for w in pies[0]:\n", " # set the id with the label.\n", " w.set_gid(w.get_label())\n", "\n", " # we don't want to draw the edge of the pie\n", " w.set_edgecolor(\"none\")\n", "\n", "for w in pies[0]:\n", " # create shadow patch\n", " s = Shadow(w, -0.01, -0.01)\n", " s.set_gid(w.get_gid() + \"_shadow\")\n", " s.set_zorder(w.get_zorder() - 0.1)\n", " ax.add_patch(s)\n", "\n", "\n", "# save\n", "from io import BytesIO\n", "f = BytesIO()\n", "plt.savefig(f, format=\"svg\")\n", "\n", "import xml.etree.cElementTree as ET\n", "\n", "\n", "# filter definition for shadow using a gaussian blur\n", "# and lightening effect.\n", "# The lightening filter is copied from http://www.w3.org/TR/SVG/filters.html\n", "\n", "# I tested it with Inkscape and Firefox3. \"Gaussian blur\" is supported\n", "# in both, but the lightening effect only in the Inkscape. Also note\n", "# that, Inkscape's exporting also may not support it.\n", "\n", "filter_def = \"\"\"\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\"\"\"\n", "\n", "\n", "tree, xmlid = ET.XMLID(f.getvalue())\n", "\n", "# insert the filter definition in the svg dom tree.\n", "tree.insert(0, ET.XML(filter_def))\n", "\n", "for i, pie_name in enumerate(labels):\n", " pie = xmlid[pie_name]\n", " pie.set(\"filter\", 'url(#MyFilter)')\n", "\n", " shadow = xmlid[pie_name + \"_shadow\"]\n", " shadow.set(\"filter\", 'url(#dropshadow)')\n", "\n", "fn = \"svg_filter_pie.svg\"\n", "print(\"Saving '%s'\" % fn)\n", "ET.ElementTree(tree).write(fn)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }