{ "cells": [ { "cell_type": "markdown", "id": "3cfaed97", "metadata": {}, "source": [ "# Creating Block Palettes with Glasbey\n", "\n", "It is often useful to group categories together into groups and create a colour palette such that each group has different shades of a given colour, and distinct groups have shades of distinct colours. This can be done by gluing together discrtizations of continuous linear palettes -- but that still leaves the problem of selecting distinct linear palettes. The ``glasbey`` library provides a an easy way to create such palettes, using techniques from the paper [*Colour Displays for Categorical Images*](http://onlinelibrary.wiley.com/doi/10.1002/col.20327/abstract) by Glasbey, Heijden, Toh and Gray to provide visual distinctiveness between blocks. To demonstrate this in action we'll need to import the ``glasbey`` library, and to visualize the palettes we create we will use seaborn." ] }, { "cell_type": "code", "execution_count": 1, "id": "00304c6e", "metadata": {}, "outputs": [], "source": [ "import glasbey\n", "import seaborn as sns\n", "\n", "sns.set()" ] }, { "cell_type": "markdown", "id": "2a154587", "metadata": {}, "source": [ "To create a palette with blocks such that each block is built around a main colour, and distinct blocks have visually distinct colours we can call the ``create_block_palette`` function. The function has a single mandatory argument: a list of block sizes. For example, to create a block palette of twelve total colours in three blocks where each block has four colours we would call ``create_block_palette`` as follows:`" ] }, { "cell_type": "code", "execution_count": 2, "id": "c4a68b05", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['#5d0004',\n", " '#ae1414',\n", " '#f35931',\n", " '#fba64d',\n", " '#00049a',\n", " '#0c4deb',\n", " '#4d96f7',\n", " '#9ad7fb',\n", " '#1c2808',\n", " '#005900',\n", " '#418e0c',\n", " '#96ce00']" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "glasbey.create_block_palette([4, 4, 4])" ] }, { "cell_type": "markdown", "id": "355540c9", "metadata": {}, "source": [ "To see what this looks like we can visualize the resulting palette using seaborn's ``palplot`` function." ] }, { "cell_type": "code", "execution_count": 3, "id": "d33101b9", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAABhCAYAAADiKT2SAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAABPdJREFUeJzt2r9r3HUcx/H39+57l1wuqaQ9l/wAWxDUodIMBbF0aJd2tOqiIN1EXDoXXDvnn3AqdHaJU+fEFpGCWCu5RNteUsSkJcnlvv4LX5Xy9d0+HvNnePHlA/d5whVVVVUBAAAASbWaHgAAAAD/hbAFAAAgNWELAABAasIWAACA1IQtAAAAqQlbAAAAUhO2AAAApCZsAQAASE3YAgAAkFpZ92BVVbG7OYzj8dHL3PNKme12o7e4GC+2tqIaj5uek0JRltFbXIxq53HExDerq+hPRcwMIp6PIqrjpufkULQjZgaxOdyP8dGk6TVpdOf6sThoxdZoEkeuWi2ddsTioBWjvYjjqmp6ThqzvSL6ZcT+OGLis9XSKiL6ZcT2H8MYe3fUVvTasXxqOTZ3NmPs7VFL2Spj+dRyPN3bivFEG9Q112vHbGc59o42o6rctTpmu8vRKjq1zhZVVf9X9puV8/Hbxsa/Hva6uX7pYlxaW4vvL1+OP+/fb3pOCm+cPRuX1tbi+c3PYvLoQdNz0pj+4mKUV1Zj/N2NiGcPm56Tw/yZKK+sxsr5O7GxsdP0mjQ+/PqTuLs6HxduPIt7D5VtHe+facfd1fm4cfsgHo4UWl3Xr5Rx7XQZd34dx85B02tyODUVce10GVc//iB+/OmHpuek8eZH78b6rfVYubkSG4+8c+s499a5WL+1Hl9+eyF+fnKv6TlpfHX17fj0nfW4/WAlRi/ctTo+f++XODF1ptZZf0UGAAAgNWELAABAasIWAACA1IQtAAAAqQlbAAAAUhO2AAAApCZsAQAASE3YAgAAkJqwBQAAIDVhCwAAQGrCFgAAgNSELQAAAKkJWwAAAFITtgAAAKQmbAEAAEhN2AIAAJCasAUAACA1YQsAAEBqwhYAAIDUhC0AAACpCVsAAABSE7YAAACkJmwBAABITdgCAACQmrAFAAAgNWELAABAasIWAACA1IQtAAAAqQlbAAAAUhO2AAAApCZsAQAASE3YAgAAkJqwBQAAIDVhCwAAQGrCFgAAgNSELQAAAKkJWwAAAFITtgAAAKQmbAEAAEhN2AIAAJCasAUAACA1YQsAAEBqwhYAAIDUhC0AAACpCVsAAABSE7YAAACkJmwBAABITdgCAACQmrAFAAAgNWELAABAasIWAACA1IQtAAAAqQlbAAAAUhO2AAAApCZsAQAASE3YAgAAkJqwBQAAIDVhCwAAQGrCFgAAgNSELQAAAKkJWwAAAFITtgAAAKQmbAEAAEhN2AIAAJCasAUAACA1YQsAAEBqwhYAAIDUhC0AAACpCVsAAABSE7YAAACkJmwBAABITdgCAACQmrAFAAAgNWELAABAakVVVVXdw7vDrRgfHrzMPa+Uuenp6C0sxIvt7ZgcHjY9J4VWtxu9hYWY7D6JGPtmdRWz01HMDKJ6PoqYjJuek0OrjGJmEMOt/Tg8OG56TRrTJ/qxMGjH9ug4Dly1WqbKiIVBO0Z7VYwntX9yX3tzvSL6nSL2j6o49tlqaRcR/U4Rvz/eikPvjtra/U4snVyK4e4wDr09aumW3Vg6uRRP/9qOo4k2qOtErxOz3aXYOxzGpHLX6pjtLker6NQ6+4/CFgAAAP5v/BUZAACA1IQtAAAAqQlbAAAAUhO2AAAApCZsAQAASE3YAgAAkJqwBQAAIDVhCwAAQGrCFgAAgNT+BhQv3rHGMiGJAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.palplot(glasbey.create_block_palette([4, 4, 4], optimize_palette=True))" ] }, { "cell_type": "markdown", "id": "2a8f98e9", "metadata": {}, "source": [ "An example of where such a palette might be useful is the well-known [20-newsgroups dataset](https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html), a classic dataset for NLP problems. The dataset collects messages from twenty different newsgroups, with the usla problem being that of successfully predicting the newsgroup of messages. Visualizing the dataset is quite common (see [here](https://topometry.readthedocs.io/en/latest/20Newsgroups_Tutorial.html) and [here](https://umap-learn.readthedocs.io/en/latest/document_embedding.html) and [here](https://vectorizers.readthedocs.io/en/latest/document_vectorization.html) for some examples). The first problem is that it is rare to find palettes with 20 distinct colours. The second catch is that the newsgroups themselves have somewhat overlapping topics. We can group them as follows:\n", "\n", "\n", "**Computers**:\n", " * comp.graphics\n", " * comp.os.ms-windows.misc\n", " * comp.sys.ibm.pc.hardware\n", " * comp.sys.mac.hardware\n", " * comp.windows.x\n", "\n", "**Science**:\n", " * sci.crypt\n", " * sci.electronics\n", " * sci.med\n", " * sci.space\n", "\n", "**Politics**:\n", " * talk.politics.guns\n", " * talk.politics.mideast\n", " * talk.politics.misc\n", "\n", "**Religion**:\n", " * alt.atheism\n", " * soc.religion.christian\n", " * talk.religion.misc\n", "\n", "**Sports**:\n", " * rec.sports.baseball\n", " * rec.sports.hockey\n", "\n", "**Cars and motorcycles**:\n", " * rec.autos\n", " * rec.motorcycles\n", "\n", "**For Sale**:\n", " * misc.forsale\n", "\n", "Ideally we would have a main colour for each group, and distinguish by variations of that colour within each group. The result would be a palette with blocks of various sizes etc. The ``create_block_palette`` is ideal for this as we simply hand it the various sizes of blocks we will need, and can then map the different newsgroups to colours in the relevant blocks. An example block palette for 20-newsgroups might be as follows:" ] }, { "cell_type": "code", "execution_count": 4, "id": "5f16a188", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.palplot(glasbey.create_block_palette([5, 4, 3, 3, 2, 2, 1]))" ] }, { "cell_type": "markdown", "id": "41bf212b", "metadata": {}, "source": [ "As with the other ``glasbey`` functions there are a number of options to tweak and fine-tune the aesthetic with bounds on lightness, hue and chroma. This makes it easy to tweak the created palette to meet your exact aesthetic needs realtively quickly and easily." ] }, { "cell_type": "code", "execution_count": 5, "id": "fad975bc", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABiIAAABhCAYAAABbPrlDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAB45JREFUeJzt3L+L2+cBx/GPftwPy5K5Syo5CXbIUCehdCktKZ3aDiWmkwm4GVy4xWOGLnGG2EuHjFlKDUdCCThjg6FLTNZQaJekFONipy3Bds72nW2dcz/sO0v6dugf0G8KD0LO6zVr+PAggZ7vG6lRVVUVAAAAAACAAprTHgAAAAAAADy5hAgAAAAAAKAYIQIAAAAAAChGiAAAAAAAAIoRIgAAAAAAgGKECAAAAAAAoBghAgAAAAAAKEaIAAAAAAAAihEiAAAAAACAYtp1X1hVVe6tfZXJaFRyzxNlcbGT3qCfrfWNTMbOrY5mq53eoJ+Hw7upnFlt84uLaXeXMtreTKrxtOfMhkYr7e5Sqv0HSTWZ9pqZcfPBJEcHT+fG+r2MRs6tjna7maODp7N2fyujic9nXfMLrTzT6+X21lZGE++1OtrNZp7p9bK59yiTSTXtOTNj/lGV7nIn28PdTMbOrY5mq5Hucid726NUjqy2xcV2Mpfk8X/vVvxvjUYjmUtur9/IyD20tuaBTp5bPpy14Z2Mxr571NFutfLc8uFsPridse9rtU3259M/3M/GnY2M3N9rabfa6R/uZzgcZuLzWdt8p51eZylbu5uZeOZRS7PRSq+zlP08TOWZR22jneRg92B2tncycW61dLvdNJv1futQO0Q0Go28e/pUvrz89/972LfNq6/+Kivvr+bi2+eyfu2Lac+ZCYMXj2Xl/dX85fxv8+D6v6Y9Z2b86Bc/y9GTZ3L70nvZu3tz2nNmwsJ3juToyTN5+M8PM9ldm/acmXHi98lnH7yTE2+9m8+vfTntOTPhBy++kM8+eCenf/fHXL5+Z9pzZsYrP30uH62s5I2LF3NlfX3ac2bC9waDfLSykj/87bN8tfX1tOfMjB/+tZFTZ4/nT+c/zfr14bTnzITB88s5dfZ4rly6nZ27e9OeMzNe+fnRLLy8kL1/76V6KETU0TjQyMLLC3njrRO5cu3zac+ZGS/88tf5+OyFnD7/Zi5fvzrtOTPh+8+/lI/PXsh7H/4mN9f+Me05M2Pvxk+yemE15948ly+ueuZRx7GXjmX1wmpWz5/PjevXpz1nZvz4te9m5fiZXPz0vawPPfOoY7B8JCvHz+Tq3p+zU21Oe87MuHWplddOvpZPLn2Se3fvTXvOTHj91Os5dOhQrdf6ayYAAAAAAKAYIQIAAAAAAChGiAAAAAAAAIoRIgAAAAAAgGKECAAAAAAAoBghAgAAAAAAKEaIAAAAAAAAihEiAAAAAACAYoQIAAAAAACgGCECAAAAAAAoRogAAAAAAACKESIAAAAAAIBihAgAAAAAAKAYIQIAAAAAAChGiAAAAAAAAIoRIgAAAAAAgGKECAAAAAAAoBghAgAAAAAAKEaIAAAAAAAAihEiAAAAAACAYoQIAAAAAACgGCECAAAAAAAoRogAAAAAAACKESIAAAAAAIBihAgAAAAAAKAYIQIAAAAAAChGiAAAAAAAAIoRIgAAAAAAgGKECAAAAAAAoBghAgAAAAAAKEaIAAAAAAAAihEiAAAAAACAYoQIAAAAAACgGCECAAAAAAAoRogAAAAAAACKESIAAAAAAIBihAgAAAAAAKAYIQIAAAAAAChGiAAAAAAAAIoRIgAAAAAAgGKECAAAAAAAoBghAgAAAAAAKEaIAAAAAAAAihEiAAAAAACAYoQIAAAAAACgGCECAAAAAAAoRogAAAAAAACKESIAAAAAAIBihAgAAAAAAKAYIQIAAAAAAChGiAAAAAAAAIoRIgAAAAAAgGKECAAAAAAAoBghAgAAAAAAKEaIAAAAAAAAihEiAAAAAACAYoQIAAAAAACgGCECAAAAAAAoRogAAAAAAACKESIAAAAAAIBihAgAAAAAAKAYIQIAAAAAAChGiAAAAAAAAIoRIgAAAAAAgGKECAAAAAAAoBghAgAAAAAAKEaIAAAAAAAAihEiAAAAAACAYoQIAAAAAACgGCECAAAAAAAoRogAAAAAAACKESIAAAAAAIBihAgAAAAAAKAYIQIAAAAAACimUVVVVffF92+tZbS/X3LPE+VA52B6/X62NjYyfvx42nNmQmtuLr1+Pw+HdzMZObO6Fg4cSLu7lNH2ZqrJaNpzZkKj2U67u5TJ/oNkMp72nJmx9nVyZPBUbq7fz/5j77U65ufaOTJ4KreGW9kfObO6FhfbOdzr5c7WVvbHPqN1zLdaOdzrZfPRo4wnk2nPmRnze0lvuZOt4W4mI+dWR7PdTG+5k73tUSaT2leJb73FxXYa841U+1W+wRXsW63RaKQx38id9ZvZf+weWle7082zy4PcGq5n352qlvn2XJ5dHmTzwZ2Mxs6srmq0kP6gn431jTz2zKOWubm59Af9DIfDjN0Nals4OJdeZylbu5sZe+ZRS6vZTq+zlL1qN1XlO25d491GDnYPZmd7J2PPimrpdrtpNuv91uEbhQgAAAAAAIBvwl8zAQAAAAAAxQgRAAAAAABAMUIEAAAAAABQjBABAAAAAAAUI0QAAAAAAADFCBEAAAAAAEAxQgQAAAAAAFCMEAEAAAAAABQjRAAAAAAAAMX8B9Aci6Ao3yOFAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.palplot(\n", " glasbey.create_block_palette(\n", " [5, 4, 3, 3, 2, 2, 1], \n", " lightness_bounds=(15, 90),\n", " chroma_bounds=(0, 40)\n", " )\n", ")" ] }, { "cell_type": "markdown", "id": "9d31c9ae", "metadata": {}, "source": [ "It is worth noting that strict bounds, particularly on lightness, can make it hard for the optimizer to successfully choose colours in thematiuc ranges, resulting in bizarre colour choices -- if that happens consider opening up the bounds somewhat to allow more options for the optimizer.\n", "\n", "Another example of a good use case can be seen in the palette \"Paired\" from ColorBrewer. This is a popular palette, not least because it has twelve colours (more than many other pre-defined palettes) -- it also pairs up colours, with one light and one dark version of each colour in the palette... " ] }, { "cell_type": "code", "execution_count": 6, "id": "c613b341", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAABhCAYAAADiKT2SAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAABO1JREFUeJzt2j2LXGUcxuF7XrK4Lmw0IdmdJWkV0cYPIBbWguQjiGJjsLAJ2FuKtWilgogiFhI2oIXarWhhVBRRISFvujGbzexs5u34FY6KHP96XfVT3DycmTM/mF7TNE0AAACgqH7XAwAAAODvELYAAACUJmwBAAAoTdgCAABQmrAFAACgNGELAABAacIWAACA0oQtAAAApQlbAAAAShu2Pdg0TQ5mizTNPznnv+X2ZJbR0Xtyde8w86WLa2PY72V09J4cLvazbJZdzyljfzrJxr2buX5wLfPlous5JQz7g2zcu5mMx8nSs9bWYn8/g62tLK5cSebzrufUMBxmsLWV3L2VND6fbfWmB8n66eT2pWTpWWulP0yzfjrTw3kavztaO7gzzf0n1/L7jXGWC++DNvqDfo5trCUZJ3FnbR38Ns7q8c1Mdq+l8b3WyurxUfqDdsnaOmx7vV4++2k3v09mf3nY/81bn/+cj84+lmff/CLfXLnd9ZwSHt5az0dnH8vOjQ+yN73R9Zwy3vl6J28/+W5e/OSFfH/zu67nlPDgsYfy9pPvZn5hO9nd7XpOGbvvfZCN7fPZffqZzC5e7HpOCUceeSQb2+ezvPhGcudy13PK6H3/afLcl8k7TyVXv+p6Tg2jR9N77sv8uHM5B3uHXa8p4+MPv8u518/ktZcu5NIP3gdtnH7geM69fibJdhJ31tbOK9t5/OX3s/PK89n75duu55TwxKsXsnbydKuz/ooMAABAacIWAACA0oQtAAAApQlbAAAAShO2AAAAlCZsAQAAKE3YAgAAUJqwBQAAoDRhCwAAQGnCFgAAgNKELQAAAKUJWwAAAEoTtgAAAJQmbAEAAChN2AIAAFCasAUAAKA0YQsAAEBpwhYAAIDShC0AAAClCVsAAABKE7YAAACUJmwBAAAoTdgCAABQmrAFAACgNGELAABAacIWAACA0oQtAAAApQlbAAAAShO2AAAAlCZsAQAAKE3YAgAAUJqwBQAAoDRhCwAAQGnCFgAAgNKELQAAAKUJWwAAAEoTtgAAAJQmbAEAAChN2AIAAFCasAUAAKA0YQsAAEBpwhYAAIDShC0AAAClCVsAAABKE7YAAACUJmwBAAAoTdgCAABQmrAFAACgNGELAABAacIWAACA0oQtAAAApQlbAAAAShO2AAAAlCZsAQAAKE3YAgAAUJqwBQAAoDRhCwAAQGnCFgAAgNKELQAAAKUJWwAAAEoTtgAAAJQmbAEAAChN2AIAAFCasAUAAKA0YQsAAEBpwhYAAIDShC0AAAClCVsAAABKE7YAAACUJmwBAAAoTdgCAABQmrAFAACgNGELAABAacIWAACA0npN0zRtDx9M51m2Ps2dw1k2j67m2t4k04WLa2Nl0Mvm0dVM5vtZNouu55Qxnt7NybWN3Bhfz3Q563pOCSv9Izm5tpFmPE4WnrW2FuNxhqNR5levJtNp13NqWFnJcDRKc/dWspx3vaaM3uwwWT+V3L6cLDxrrQxWkvVTmU5mWfrB1trhwSz3nVjLrV/Hmc+8D9oYHhnkvhNrScZJ3Flbk5uTrB7byOTm9SznvtfaWD0+Sn8wbHX2T4UtAAAA/Nv4KzIAAAClCVsAAABKE7YAAACUJmwBAAAoTdgCAABQmrAFAACgNGELAABAacIWAACA0oQtAAAApf0BMdr/nSM04AUAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.palplot(sns.color_palette(\"Paired\", 12))" ] }, { "cell_type": "markdown", "id": "62d999e1", "metadata": {}, "source": [ "But that's only good if you have pairs of categories. Have you ever wanted a \"Tripled\" palette? We can easily generate a twelve colour palette with triples of each hue by simply specifying blocks of three (and we can always tweak aesthetics as above)" ] }, { "cell_type": "code", "execution_count": 7, "id": "d4895fd7", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAABhCAYAAADiKT2SAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAABOdJREFUeJzt2j1vlQUYxvHrHPreEto4SGkxuhqWNoE4EEyYYIHBUUYHnTExJg4MrH4CN78BMpTJwRESGg1hcNAE+oKaUkAotD09jwNf4EFDHm/4/eZnuHKnOef8e06vaZomAAAAUFS/6wEAAADwXwhbAAAAShO2AAAAlCZsAQAAKE3YAgAAUJqwBQAAoDRhCwAAQGnCFgAAgNKELQAAAKWNtH2waZo8vL+e4WD/de55oxyeGMv4/LHsbm6kORh0PaeE3qGRjM8fS/Pkz2R40PWcMtafzmVxcSJray+yvz/sek4Jo6P9LC5OZPNhcuBkrc1MN5md7OXR8ybDpus1NfR7yexkL+sP7mcw8F7QVn96JMfnjuf+9v0MvIe2MnLo5c22dtZy0Pi81tb043czfWwqzzZ20gy8sLXRG+ll+thUsnXgZq+gPzuajCfZTeJs7Yyn9VexvaZpWp/1yvLp3Fv9+V+uevt8ceF0Tl5bya2L5/P07p2u55Qw8+GJnLy2kp3vPsvwwa9dzynj7PWruXnzTE6d+imrq4+7nlPC0tKR3Lx5JhevDHL3Xtdr6vj80l4un53Ktz/uZP2x/wi0sXCkn8tnp/LxJ8v55e5q13PK+ODTpdz+5naWry5n9Z67tbH03subfXXjVH7fdrO2Ln1/PRdWzuWH8zeydWe76zklvHNiLhdWzmX3y400v+11PaeMia/fT04muZXkacdjqvgoyWS7R/0UGQAAgNKELQAAAKUJWwAAAEoTtgAAAJQmbAEAAChN2AIAAFCasAUAAKA0YQsAAEBpwhYAAIDShC0AAAClCVsAAABKE7YAAACUJmwBAAAoTdgCAABQmrAFAACgNGELAABAacIWAACA0oQtAAAApQlbAAAAShO2AAAAlCZsAQAAKE3YAgAAUJqwBQAAoDRhCwAAQGnCFgAAgNKELQAAAKUJWwAAAEoTtgAAAJQmbAEAAChN2AIAAFCasAUAAKA0YQsAAEBpwhYAAIDShC0AAAClCVsAAABKE7YAAACUJmwBAAAoTdgCAABQmrAFAACgNGELAABAacIWAACA0oQtAAAApQlbAAAAShO2AAAAlCZsAQAAKE3YAgAAUJqwBQAAoDRhCwAAQGnCFgAAgNKELQAAAKUJWwAAAEoTtgAAAJQmbAEAAChN2AIAAFCasAUAAKA0YQsAAEBpwhYAAIDShC0AAAClCVsAAABKE7YAAACUJmwBAAAoTdgCAABQmrAFAACgNGELAABAacIWAACA0oQtAAAApQlbAAAAShO2AAAAlCZsAQAAKE3YAgAAUJqwBQAAoDRhCwAAQGnCFgAAgNKELQAAAKX1mqZp2j68vbaRwd7u69zzRjk8NZGJo/N58WAzzf5e13NK6I2OZeLofIZP/koO9rueU8bmzlwWFiazvv48u7vDrueUMD7ez8LCZB5sN9kfdL2mjsMzTWYn+3n0fJgDf2qtHOons5P9bPyxlr097wVtjcyMZXFuMWvba9kbuFsbYyMvb7a1s57B0Oe1tmb+Pprp+ak829zJcM8LWxv9sX6m56fSbA3S7LdOibdef3Y0mUjyIomztTOe1l/FvlLYAgAAwP+NnyIDAABQmrAFAACgNGELAABAacIWAACA0oQtAAAApQlbAAAAShO2AAAAlCZsAQAAKE3YAgAAUNo/vw7isR6Z31cAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.palplot(glasbey.create_block_palette([3, 3, 3, 3]))" ] }, { "cell_type": "markdown", "id": "7e3be304", "metadata": {}, "source": [ "But why stop at twelve? We can just as easily generate a nice looking twenty-one colour palette based around triples..." ] }, { "cell_type": "code", "execution_count": 8, "id": "21cee479", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.palplot(glasbey.create_block_palette([3, 3, 3, 3, 3, 3, 3]))" ] }, { "cell_type": "markdown", "id": "f1005c70-e2ac-4d50-a5ea-701cb6c659eb", "metadata": {}, "source": [ "## Extending block palettes\n", "\n", "Maybe you have a block palette you like (perhaps one created previously with glasbey) but now you need some extra colour blocks added to it. For example the \"tab20b\" is a nice muted colour palette available in matplotlib, with 20 colours in blocks of length 4, but perhaps you now need 28 colours. We can use the ``extend_block_palette`` function, which works similarly to ``extend_palette`` but allows you to extend by blocks instead. So, for example, to add two more blocks of 4 to \"tab20b\" we could do the following: " ] }, { "cell_type": "code", "execution_count": 9, "id": "e7c10180-e239-46dd-8c71-43af647b891d", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.palplot(glasbey.extend_block_palette(\"tab20b\", [4,4]))" ] }, { "cell_type": "markdown", "id": "d8c87ea3-0618-4c50-8954-0e8c5ccf93f4", "metadata": {}, "source": [ "Similarly, you might be looking for some complementary semi-continuous palettes. The standard \"viridis\" palette is very nice, and you can generate, say, a nice gradient of 8 colours with it, but then you need to hunt for other continuous palettes that will be sufficiently distinct. You can, in fact, just extend an 8-colour viridis with some extra blocks, and get some new complementary gradient palettes. " ] }, { "cell_type": "code", "execution_count": 10, "id": "e2aa79d5-ea3d-41e0-969b-20a1e367ac29", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.palplot(glasbey.extend_block_palette(sns.color_palette(\"viridis\", 8), [8,8]))" ] }, { "cell_type": "markdown", "id": "fc38b0de", "metadata": {}, "source": [ "Hopefully you can already think of some potential use-cases for block palettes in your own work -- and now you have the tools to easily build and tweak them yourself... or even create them on the fly as needed." ] } ], "metadata": { "kernelspec": { "display_name": "glasbey", "language": "python", "name": "glasbey" }, "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.9" } }, "nbformat": 4, "nbformat_minor": 5 }