Skip to content

Instantly share code, notes, and snippets.

@zertrin
Last active December 9, 2023 09:43
Show Gist options
  • Save zertrin/8c4451ca291b2bc549a1add10f7e4350 to your computer and use it in GitHub Desktop.
Save zertrin/8c4451ca291b2bc549a1add10f7e4350 to your computer and use it in GitHub Desktop.
export_fig() helper for notebooks
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "ffda22bf",
"metadata": {},
"source": [
"**`export_fig()`helper**\n",
"\n",
"Additional deps apart from matplotlib: `python-slugify`"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "c00fd936",
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-09T09:40:49.967693Z",
"start_time": "2023-12-09T09:40:49.755136Z"
}
},
"outputs": [],
"source": [
"# stdlib\n",
"import warnings\n",
"\n",
"# matplotlib\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# from `pip install python-slugify` or `conda install python-slugify`\n",
"from slugify import slugify\n",
"\n",
"\n",
"def export_fig(fig_save_dir, fig=None, ax=None, filename=None, figtypes=None,\n",
" hide_title=True, overwrite_existing=True, prefix='', suffix='', dpi=300):\n",
" \"\"\"\n",
" Helper to export figures.\n",
"\n",
" Mandatory arguments:\n",
"\n",
" fig_save_dir: Destination folder (will be created if it doesn't exist)\n",
"\n",
" Optional arguments:\n",
"\n",
" You may provide either fig (figure handle) or ax (ax handle).\n",
" If none is provided, will be auto-determined from the last created figure/ax.\n",
"\n",
" filename: If set, will override automatic filename generation from title\n",
" and use the provided one instead.\n",
" NOTE: don't include extension here!\n",
"\n",
" figtypes: A list of file extensions types to output (default if not provided: ['.pdf'])\n",
" hide_title: Whether to hide the figure title in the outputted file (default: True)\n",
" overwrite_existing: Whether to overwrite existing files (default: True)\n",
" prefix: Optional prefix to prepend the file name with\n",
" suffix: Optional suffix to append the file name with\n",
" dpi: Adjust the output DPI resolution for raster output like PNG\n",
"\n",
" \"\"\"\n",
"\n",
" if figtypes is None:\n",
" figtypes = ['.pdf']\n",
"\n",
" fig_save_dir.mkdir(exist_ok=True)\n",
"\n",
" # store whether we explicitly passed a fig argument to this function for later\n",
" fig_arg_provided = (fig is not None)\n",
"\n",
" if not fig:\n",
" fig = plt.gcf()\n",
" if not ax:\n",
" ax = plt.gca()\n",
"\n",
" ax_title = ax.get_title()\n",
" fig_title = fig._suptitle\n",
"\n",
" title = fig_title.get_text() if fig_title is not None else ax_title\n",
"\n",
" if not filename:\n",
" # cleanup fig title to make it good for use as file name\n",
" slug_title = slugify(title, separator='_', regex_pattern=r'[^-a-z0-9_\\(\\)]+')\n",
"\n",
" if not slug_title:\n",
" warnings.warn(\"Title is empty!\")\n",
"\n",
" slug_title = prefix + slug_title + suffix\n",
" fig_fname = fig_save_dir / slug_title\n",
" else:\n",
" fig_fname = fig_save_dir / filename\n",
"\n",
" # hide title before exporting\n",
" if hide_title:\n",
" if fig_title is not None:\n",
" fig.suptitle('')\n",
" elif not fig_arg_provided: # avoid special case where we passed a fig handle but there is no suptitle\n",
" ax.set_title('')\n",
"\n",
" for figtype in figtypes:\n",
" fig_path = fig_fname.with_suffix(figtype)\n",
"\n",
" if fig_path.exists():\n",
" warnings.warn(f\"Figure '{fig_path}' already exists!\")\n",
" if overwrite_existing:\n",
" warnings.warn(\"Overwriting existing figure!\")\n",
" else:\n",
" warnings.warn(\"Skipping export!\")\n",
" continue\n",
"\n",
" fig_metadata = {}\n",
" fig_metadata['Title'] = title.replace('\\n', ' ')\n",
"\n",
" fig.savefig(str(fig_path), bbox_inches='tight', dpi=dpi, metadata=fig_metadata)\n",
"\n",
" # restore title after exporting\n",
" if hide_title:\n",
" if fig_title is not None:\n",
" fig.suptitle(title)\n",
" elif not fig_arg_provided: # avoid special case where we passed a fig handle but there is no suptitle\n",
" ax.set_title(title)\n",
"\n",
" print(fig_fname)\n",
" return fig_fname\n"
]
},
{
"cell_type": "markdown",
"id": "f1ad5980",
"metadata": {},
"source": [
"---\n",
"\n",
"**Example usage:**"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "acbd8dcf",
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-09T09:40:50.179273Z",
"start_time": "2023-12-09T09:40:49.968433Z"
},
"run_control": {
"marked": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"results_export/penguin_attributes_by_species\n"
]
},
{
"data": {
"image/png": "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Qp90YW9vj8jISKSlpSElJQUWFhbo27dvoctYWFjAxsam0KdjEBUH/9MkondRIa6GJqoIsrKykJWVVeTTJvIYGxujatWqOHLkCJKSktCjR48i16GjowMLCws8ffoUhw4dQs+ePWXbPn78GHfv3i306RhERERljSOL9FFJTU3FjRs3pPd5T7EwNDREjRo10K5dO0ybNg1aWlqwsbFBZGQkNm3ahICAAGmZoKAg1K1bFyYmJjh16hQmTJiASZMmoU6dOlKbDh06oFevXvDx8QEAHDp0CEII1KlTBzdu3MC0adNQp04dDB06VKrLz88PvXv3hoWFBeLj4zFr1iwYGxtLT7ogIiIqDwyL9FEp6ikWoaGh8PX1xcCBA/HkyRPY2NjA398fX331lbTMtWvX4OvriydPnsDW1hazZ8/GpEmTlNbz5lMskpOT4evri3v37sHQ0BC9e/eGv78/1NTUALwavbx48SI2bdqEZ8+ewcLCAu3bt8eOHTuULuYiIiJ633iBC3iBCxFVbjxnkT5G3O+LVtz8w3MWiYiIiEgWwyIRERERyWJYJCIiIiJZDItEREREJIthkYiIiIhk8dY59NH4kK+MA3hVKBERlQ+OLBIRERGRLIZFIiIiIpLFsEhEREREshgWiYiIiEgWwyIRERERyWJYJCIiIiJZDItEREREJIthkYiIiIhkMSwSERERkSyGRSIiIiKSxbBIRERERLIYFomIiIhIFsMiEREREcliWCQiIiIiWQyLRERERCSLYZGIiIiIZDEsEhEREZEshkUiIiIiksWwSERERESyGBaJiIiISBbDIhERERHJYlgkIiIiIlkMi0REREQki2GRiIiIiGQxLBIRERGRLIZFIiIiIpLFsEhEREREshgWiYiIiEgWwyIRERERyWJYJCIiIiJZDItEREREJIthkYiIiIhkMSwSERERkSyGRSIiIiKSxbBIRERERLIYFomIiIhIFsMiEREREcliWCQiIiIiWQyLRERERCSLYZGIiIiIZDEsEhEREZEshkUiIiIiksWwSERERESyGBaJiIiISBbDIhERERHJYlgkIiIiIlkMi0REREQki2GRiIiIiGQxLBIRERGRLIZFIiIiIpLFsEhEREREshgWiYiIiEgWwyIRERERyWJYJCIiIiJZDItEREREJIthkYiIiIhkMSwSERERkSyGRSIiIiKS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3bp1Q/369aFQKMqiLiIiIiKqAEocFkNDQ/Gf//wHXbt2LYt6iIiIiKgCKfE5i+rq6nBwcCiLWoiIiIiogilxWJwyZQpWrVoFIURZ1ENEREREFUixDkN/9tlnSu+PHDmCAwcOoF69elBTU1Oat2vXrtKrjoiIiIjKVbHCooGBgdL7Xr16lUkxRERERFSxFCssBgUFlXUdRERERFQBlficxU8//RTPnj3LNz0lJQWffvppadRERERERBVEicNiREQEMjMz801/+fIl/vzzz1IpioiIiIgqhmLfZ/HChQvSv69cuYLExETpfU5ODg4ePIjq1auXbnVEREREVK6KHRYbNWoEhUIBhUJR4OFmLS0trFmzplSLIyIiIqLyVeywGBcXByEEatasiTNnzsDExESap66uDlNTU6ioqJRJkURERERUPoodFm1sbAAAubm5ZVYMEREREVUsJX429N69ewucrlAooKmpCQcHB9jZ2b1zYURERERU/kocFr28vKBQKPI97i9vmkKhgKurK3bv3o1q1aqVWqFERERE9P6V+NY54eHhaN68OcLDw5GcnIzk5GSEh4ejRYsW2LdvH44dO4bHjx9j6tSpZVEvEREREb1HJR5ZnDBhAn7++We4uLhI0zp06ABNTU2MGjUKly9fxsqVKzFs2LBSLZSIiIiI3r8SjyzevHkT+vr6+abr6+vj1q1bAIBatWrh0aNH714dEREREZWrEofFpk2bYtq0aXj48KE07eHDh5g+fTqaN28OALh+/TqsrKxKr0oiIiIiKhclPgy9YcMG9OzZE1ZWVrC2toZCocCdO3dQs2ZN7NmzBwCQmpqKuXPnlnqxRERERPR+lTgs1qlTB1evXsWhQ4cQGxsLIQQcHR3RqVMnVKnyaqDSy8urtOskIiIionJQ4rAIvLpNTpcuXdClS5fSroeIiIiIKpC3CouHDx/G4cOHkZSUlO+JLhs3biyVwoiIiIio/JU4LM6fPx8LFixAs2bNYGFhAYVCURZ1EREREVEFUOKwuG7dOgQHB2PQoEFlUQ8RERERVSAlvnVOZmam0g25iYiIiKjyKnFYHDFiBLZt21YWtRARERFRBVPiw9AvX77Ezz//jD/++AMNGjSAmpqa0vyAgIBSK46IiIiIyleJw+KFCxfQqFEjAMClS5eU5vFiFyIiIqLKpcRh8ejRo2VRBxERERFVQCU+ZzHPjRs3cOjQIaSnpwMAhBClVhQRERERVQwlDouPHz9Ghw4dULt2bXTt2hUJCQkAXl34MmXKlFIvkIiIiIjKT4nD4qRJk6CmpoY7d+5AW1tbmt63b18cPHiwVIsjIiIiovJV4nMWf//9dxw6dAhWVlZK02vVqoXbt2+XWmFEREREVP5KPLKYlpamNKKY59GjR9DQ0CiVooiIiIioYihxWGzbti02bdokvVcoFMjNzcWyZcvQvn37Ui2OiIiIiMpXiQ9DL1u2DG5uboiKikJmZiamT5+Oy5cv48mTJzhx4kRZ1EhERERE5aTEI4uffPIJLly4gBYtWqBTp05IS0vDZ599hnPnzsHe3r4saiQiIiKicvJW91k0NzfH/PnzsW/fPuzfvx8LFy5EdnY2hg0bVqJ+jh07Bk9PT1haWkKhUGD37t1K84UQ8PPzg6WlJbS0tODm5obLly8rtcnIyMC4ceNgbGwMHR0d9OjRA/fu3XubzSIiIiKiN7z1Tbnf9OTJE4SEhJRombS0NDRs2BBr164tcP7SpUsREBCAtWvX4uzZszA3N0enTp3w/Plzqc3EiRMRFhaG0NBQHD9+HKmpqejevTtycnLeaXuIiIiI6C3OWSxNHh4e8PDwKHCeEAIrV67E7Nmz8dlnnwEAQkJCYGZmhm3btmH06NFITk7Ghg0bsHnzZnTs2BEAsGXLFlhbW+OPP/6Au7v7e9sWIiIiosqo1EYWS1tcXBwSExPRuXNnaZqGhgbatWuHkydPAgCio6ORlZWl1MbS0hL169eX2hQkIyMDKSkpSi8iIiIiyq/ChsXExEQAgJmZmdJ0MzMzaV5iYiLU1dVRrVo12TYFWbx4MQwMDKSXtbV1KVdPREREVDkU+zB03qFgOc+ePXvXWgqkUCiU3gsh8k17U1FtfH19MXnyZOl9SkoKAyMRERFRAYodFg0MDIqcP3jw4HcuKI+5uTmAV6OHFhYW0vSkpCRptNHc3ByZmZl4+vSp0uhiUlISXFxcZPvW0NDg02aIiIiIiqHYYTEoKKgs68jHzs4O5ubmCA8PR+PGjQEAmZmZiIyMxJIlSwAATZs2hZqaGsLDw9GnTx8AQEJCAi5duoSlS5e+13qJiIiIKqNyvRo6NTUVN27ckN7HxcUhJiYGhoaGqFGjBiZOnIhFixahVq1aqFWrFhYtWgRtbW0MGDAAwKvRzOHDh2PKlCkwMjKCoaEhpk6dCicnJ+nqaCIiIiJ6e+UaFqOiopSeJ513HqG3tzeCg4Mxffp0pKenY8yYMXj69ClatmyJ33//HXp6etIyK1asgKqqKvr06YP09HR06NABwcHBUFFRee/bQ0RERFTZKIQQoryLKG8pKSkwMDBAcnIy9PX1y7scKiNOIU7lXcI7ueh9sbxLoA/Uh7zvc7+nt8X9vmjFzT8V9tY5RERERFT+GBaJiIiISBbDIhERERHJYlgkIiIiIlkMi0REREQki2GRiIiIiGQxLBIRERGRLIZFIiIiIpLFsEhEREREshgWiYiIiEgWwyIRERERyWJYJCIiIiJZDItEREREJIthkYiIiIhkMSwSERERkSyGRSIiIiKSxbBIRERERLIYFomIiIhIFsMiEREREcliWCQiIiIiWQyLRERERCSLYZGIiIiIZDEsEhEREZEshkUiIiIiksWwSERERESyGBaJiIiISBbDIhERERHJYlgkIiIiIlkMi0REREQki2GRiIiIiGQxLBIRERGRLIZFIiIiIpLFsEhEREREshgWiYiIiEgWwyIRERERyWJYJCIiIiJZDItEREREJIthkYiIiIhkMSwSERERkSyGRSIiIiKSxbBIRERERLIYFomIiIhIFsMiEREREcliWCQiIiIiWQyLRERERCSLYZGIiIiIZDEsEhEREZEshkUiIiIiksWwSERERESyGBaJiIiISBbDIhERERHJYlgkIiIiIlkMi0REREQki2GRiIiIiGQxLBIRERGRLIZFIiIiIpLFsEhEREREshgWiYiIiEgWwyIRERERyWJYJCIiIiJZDItEREREJIthkYiIiIhkMSwSERERkSyGRSIiIiKSxbBIRFQKFi9eDIVCgYkTJ0rTUlNT4ePjAysrK2hpaaFu3boIDAwssq+VK1eiTp060NLSgrW1NSZNmoSXL19K8wMDA9GgQQPo6+tDX18fzs7OOHDgQFlsFhERVMu7ACKiD93Zs2fx888/o0GDBkrTJ02ahKNHj2LLli2wtbXF77//jjFjxsDS0hI9e/YssK+tW7di5syZ2LhxI1xcXBAbG4shQ4YAAFasWAEAsLKywnfffQcHBwcAQEhICHr27Ilz586hXr16ZbehRPRR4sgiEdE7SE1NxcCBA7F+/XpUq1ZNad6pU6fg7e0NNzc32Nra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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from pathlib import Path\n",
"\n",
"# data from https://allisonhorst.github.io/palmerpenguins/\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"species = (\"Adelie\", \"Chinstrap\", \"Gentoo\")\n",
"penguin_means = {\n",
" 'Bill Depth': (18.35, 18.43, 14.98),\n",
" 'Bill Length': (38.79, 48.83, 47.50),\n",
" 'Flipper Length': (189.95, 195.82, 217.19),\n",
"}\n",
"\n",
"x = np.arange(len(species)) # the label locations\n",
"width = 0.25 # the width of the bars\n",
"multiplier = 0\n",
"\n",
"fig, ax = plt.subplots(layout='constrained')\n",
"\n",
"for attribute, measurement in penguin_means.items():\n",
" offset = width * multiplier\n",
" rects = ax.bar(x + offset, measurement, width, label=attribute)\n",
" ax.bar_label(rects, padding=3)\n",
" multiplier += 1\n",
"\n",
"# Add some text for labels, title and custom x-axis tick labels, etc.\n",
"ax.set_ylabel('Length (mm)')\n",
"ax.set_title('Penguin attributes by species')\n",
"ax.set_xticks(x + width, species)\n",
"ax.legend(loc='upper left', ncols=3)\n",
"ax.set_ylim(0, 250)\n",
"\n",
"export_fig(fig_save_dir=Path('./results_export'), hide_title=True, figtypes=['.pdf'])\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5c1a4985",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:test20231209]",
"language": "python",
"name": "conda-env-test20231209-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.12.0"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment