Created
August 15, 2023 13:49
-
-
Save calebrob6/273b9138dbd3a5a87ca4b60d5775c2cb to your computer and use it in GitHub Desktop.
Another notebook for generating a legend figure from labels and colors
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline\n", | |
"\n", | |
"import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def plot_colortable(name_to_color: dict, title: str, sort_colors: bool = False, emptycols: int = 0) -> plt.Figure:\n", | |
" \"\"\"\n", | |
" function taken from https://matplotlib.org/3.1.0/gallery/color/named_colors.html\n", | |
" \"\"\"\n", | |
"\n", | |
" cell_width = 212\n", | |
" cell_height = 22\n", | |
" swatch_width = 70\n", | |
" margin = 12\n", | |
" topmargin = 40\n", | |
"\n", | |
" # Sort name_to_color by hue, saturation, value and name.\n", | |
" if sort_colors is True:\n", | |
" by_hsv = sorted((tuple(mcolors.rgb_to_hsv(mcolors.to_rgb(color))),\n", | |
" name)\n", | |
" for name, color in name_to_color.items())\n", | |
" names = [name for hsv, name in by_hsv]\n", | |
" else:\n", | |
" names = list(name_to_color)\n", | |
"\n", | |
" n = len(names)\n", | |
" ncols = 4 - emptycols\n", | |
" nrows = n // ncols + int(n % ncols > 0)\n", | |
"\n", | |
" width = cell_width * 4 + 2 * margin\n", | |
" height = cell_height * nrows + margin + topmargin\n", | |
" dpi = 80 # other numbers don't seem to work well\n", | |
"\n", | |
" fig, ax = plt.subplots(figsize=(width / dpi, height / dpi), dpi=dpi, facecolor=\"white\")\n", | |
" fig.subplots_adjust(margin / width, margin / height,\n", | |
" (width - margin) / width, (height - topmargin) / height)\n", | |
" ax.set_xlim(0, cell_width * 4)\n", | |
" ax.set_ylim(cell_height * (nrows - 0.5), -cell_height / 2.)\n", | |
" ax.yaxis.set_visible(False)\n", | |
" ax.xaxis.set_visible(False)\n", | |
" ax.set_axis_off()\n", | |
" ax.set_title(title, fontsize=24, loc='left', pad=10)\n", | |
"\n", | |
" for i, name in enumerate(names):\n", | |
" row = i % nrows\n", | |
" col = i // nrows\n", | |
" y = row * cell_height\n", | |
"\n", | |
" swatch_start_x = cell_width * col\n", | |
" swatch_end_x = cell_width * col + swatch_width\n", | |
" text_pos_x = cell_width * col + swatch_width + 7\n", | |
"\n", | |
" ax.text(text_pos_x, y, name, fontsize=14,\n", | |
" horizontalalignment='left',\n", | |
" verticalalignment='center')\n", | |
"\n", | |
" ax.hlines(y, swatch_start_x, swatch_end_x,\n", | |
" color=name_to_color[name], linewidth=18)\n", | |
"\n", | |
" return fig" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA18AAABFCAYAAAC141wJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAARa0lEQVR4nO3deVDU9R/H8ddy7iASRxxpCZ6pWSZhpZkCReiYJXhWJnSoldFYpqNh6USZZRZgZRYGnSpOmZh3KZN3KjkeNJUZkamIVwmBF9/fHw47rrvLJSzS7/mY2Znl+7nen/3vPe8Pn6/JMAxDAAAAAIAG5dLYAQAAAADA/wOSLwAAAABwApIvAAAAAHACki8AAAAAcAKSLwAAAABwApIvAAAAAHACki8AAAAAcIJaJV9ZWVkymUwymUzKzc1toJBQ+RtnZWU1digAAAAA6gmVLwAAAABwApIvAAAAAHACki8AAAAAcAKSLwAAAABwAqcmXzt37tTo0aPVoUMHeXt7q1mzZurcubOeffZZHThwoNrxy5YtU2xsrAICAuTl5aWOHTvqhRde0MmTJ1VQUFCjy0AOHz6s5ORk3XLLLfLz85Onp6datWqlESNG6IcffnA4LjExUSaTSZGRkZKk3bt3KyEhQdddd508PT0VEhKiYcOGadeuXdXuY+vWrRo0aJCCgoJkNpvVpk0bjR07VoWFhdWOBQAAANBEGbWQmZlpSDIkGevWravxuIqKCmPixImGyWSyjL/04+3tbSxfvtzhHOPHj3c4NiwszMjNza02tuzsbKNZs2YO55FkvPzyy3bHJiQkGJKMPn36GAsXLjTMZrPd8Waz2Vi7dq3DfbzzzjuGi4uL3bH+/v7Gtm3bLH9nZmbW+DcGAAAAcGVzSuVr8uTJeuONN2QYhoYOHarvvvtORUVFKi4u1sqVK9WzZ0+VlJRo0KBB2rt3r834jIwMzZo1S5IUHh6uFStW6MiRIyooKFB6erpOnDihxx57rMoYli9frmHDhqm0tFQRERHKzs5WYWGhjh8/rm3btikhIUGS9NJLLykzM9PhPPv27VNCQoLCw8O1fPlyFRUV6eDBg5o3b558fHxUXl6uRx55ROfPn7cZu3btWiUlJamiokKhoaFasGCBDh06pAMHDigjI0Ourq4aOnRobX5aAAAAAE1FbTK1ulS+8vLyLBWv119/3W6fM2fOGL179zYkGffee69VW1lZmREQEGBIMrp06WKUlJTYjN+wYYNVNenS2MrKyozg4GBDkjFgwADj7NmzduOYPHmyIckIDAw0ysrKrNoqK1+SjJiYGOPMmTM247Ozsy19Vq5cadN+4403WuY/cOCATfuePXusKmpUvgAAAID/jgavfKWlpckwDN1www2aMGGC3T7u7u5KSUmRdKFCdfLkSUvb0qVLdezYMUnS9OnT1axZM5vxd9xxh4YNG+YwhgULFqioqEhubm6aO3eu3Nzc7PZ78cUX1axZMxUXF2v16tUO50tPT5e7u7vN8/j4ePn6+kqSzf+Pbd++Xbt375YkTZo0SS1btrQZf8MNN+ipp55yuC4AAACApqvBk681a9ZIkmJiYlRaWqqSkhK7n06dOkmSKioqtGPHDsv4jRs3SpI8PT3Vt29fh+vcf//91cbQtWtXNW/e3GEM58+fV8eOHSVJ27ZtsztX69atLX0u5erqqvbt20u6cLHHxTZs2GD5Hh8f7zDWQYMGOWwDAAAA0HTZLwHVk5KSEh08eFCSlJqaqtTU1BqNKy4utnwvKCiQJLVp08ZutamSo4RIkn7++WdJ0o4dO9S8efNax3CxFi1aVDnOy8tLkvTvv/9aPa/ch9lsVlhYmMPxnTt3rlF8AAAAAJqWBq18/f3333UaV15ebvleUlIiSXaPG17M29u7XuO4OIaLOTqyeCnDMKz+rtxHVXHWpB0AAABA09Sgla+LE4m3335b48aNq/McpaWlVfarTG6qmuP+++/X119/XesY6kNlDFXFWZN2AAAAAE1Tg1a+rrrqKgUEBEiS8vLy6jRH5RG9/fv36+zZsw77VR4ttKdt27aSpB9//LFOMdSHyn2Ul5dbjiDak5+f75yAAAAAADhVg1+4cc8990iSlixZouPHj9d6/B133CFJOn36tFatWuWw35IlS6qNobCwUN9++22tY6gPvXr1snz/6quvHPb78ssvnREOAAAAACdr8OTrueeekyT9888/SkxM1OnTp6vsf2kFa8CAAfL395ckJScn21xkIUlbtmzRwoULHc45YsQIBQcHS5JGjx5tuQTEkYKCgmrjrK2IiAjdeOONkqQZM2bor7/+sumzd+9ezZkzp17XBQAAAHBlqHPylZ+fry1btlT5yc/PV0REhF544QVJ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\n", | |
"text/plain": [ | |
"<Figure size 872x74 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig = plot_colortable(\n", | |
" {\"Poultry House\": \"red\"},\n", | |
" \"Legend\"\n", | |
")\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "cafo", | |
"language": "python", | |
"name": "conda-env-cafo-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.7" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment