{ "cells": [ { "cell_type": "markdown", "id": "55920ac6", "metadata": {}, "source": [ "# Colors & Palettes\n", "\n", "This tutorial covers:\n", "\n", "- `RGB` class and color constants (`wolfhece.color_constants`)\n", "- `wolfpaletteModel` — headless color palette based on matplotlib's `LinearSegmentedColormap`\n", "- `wolfpalette` — GUI variant (requires wxPython)\n", "\n", "> **Note** — `wolfpaletteModel` works without wxPython.\n", "> When wx is unavailable, `wolfpalette` is automatically aliased to `wolfpaletteModel`." ] }, { "cell_type": "code", "execution_count": 2, "id": "9271fdcd", "metadata": {}, "outputs": [], "source": [ "from wolfhece.color_constants import RGB, Colors\n", "from wolfhece.PyPalette import wolfpaletteModel\n", "import numpy as np" ] }, { "cell_type": "markdown", "id": "7aab3ef5", "metadata": {}, "source": [ "## RGB class — color manipulation\n", "\n", "`RGB` is a named tuple (`red`, `green`, `blue`) with conversion helpers." ] }, { "cell_type": "code", "execution_count": 3, "id": "7c9d2662", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Red : RGB(red=255, green=0, blue=0) -> hex=#FF0000, int=16711680\n", "Blue : RGB(red=0, green=0, blue=255) -> 0-1 tuple=(0.0, 0.0, 1.0)\n", "Green : RGB(red=0, green=255, blue=0) -> list=[0, 255, 0]\n" ] } ], "source": [ "# Create colors\n", "red = RGB(255, 0, 0)\n", "blue = RGB.from_hexa('#0000FF')\n", "green = RGB.from_int(0x00FF00)\n", "\n", "print(f\"Red : {red} -> hex={red.hexa_format()}, int={red.int_format}\")\n", "print(f\"Blue : {blue} -> 0-1 tuple={blue.to_tuple_0_to_1()}\")\n", "print(f\"Green : {green} -> list={green.to_list()}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "74094afb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available colors: 552\n", "First 10: ['aliceblue', 'antiquewhite', 'antiquewhite1', 'antiquewhite2', 'antiquewhite3', 'antiquewhite4', 'aqua', 'aquamarine1', 'aquamarine2', 'aquamarine3']\n", "CORAL = RGB(red=255, green=127, blue=80)\n" ] } ], "source": [ "# Browse named constants\n", "# 'Colors.named_colors' is an OrderedDict: name -> RGB instance\n", "print(f\"Available colors: {len(Colors.named_colors)}\")\n", "print(f\"First 10: {list(Colors.named_colors.keys())[:10]}\")\n", "\n", "# Access a named color\n", "coral = Colors.named_colors['coral']\n", "print(f\"CORAL = {coral}\")" ] }, { "cell_type": "markdown", "id": "4e88cfc4", "metadata": {}, "source": [ "## wolfpaletteModel — creating a palette\n", "\n", "A palette maps floating-point values to RGBA colors.\n", "It extends `LinearSegmentedColormap` from matplotlib." ] }, { "cell_type": "code", "execution_count": 7, "id": "cb7a7c9e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Palette entries : 5\n", "Value range : [0.0, 5.0]\n" ] } ], "source": [ "pal = wolfpaletteModel()\n", "\n", "# Define values and associated colors\n", "values = [0.0, 0.5, 1.0, 2.0, 5.0]\n", "pal_colors = [\n", " (0, 0, 255, 255), # blue\n", " (0, 255, 255, 255), # cyan\n", " (0, 255, 0, 255), # green\n", " (255, 255, 0, 255), # yellow\n", " (255, 0, 0, 255), # red\n", "]\n", "\n", "pal.set_values_colors(values, pal_colors)\n", "print(f\"Palette entries : {pal.nb}\")\n", "print(f\"Value range : [{pal.values[0]}, {pal.values[-1]}]\")" ] }, { "cell_type": "code", "execution_count": 8, "id": "e436cb8e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Color at 1.5 : (np.uint8(127), np.uint8(255), np.uint8(0), np.uint8(255))\n", "Output shape : (4, 5, 4) (rows x cols x RGBA)\n" ] } ], "source": [ "# Lookup a single color\n", "rgba = pal.get_rgba_oneval(1.5)\n", "print(f\"Color at 1.5 : {rgba}\")\n", "\n", "# Lookup colors for a 2D array\n", "data = np.linspace(0, 5, 20).reshape(4, 5)\n", "rgba_array = pal.get_rgba(data)\n", "print(f\"Output shape : {rgba_array.shape} (rows x cols x RGBA)\")" ] }, { "cell_type": "markdown", "id": "0bcf81f1", "metadata": {}, "source": [ "## Visualizing a palette with matplotlib" ] }, { "cell_type": "code", "execution_count": 9, "id": "a47ad7ab", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(figsize=(6, 1))\n", "gradient = np.linspace(0, 5, 256).reshape(1, -1)\n", "ax.imshow(gradient, aspect='auto', cmap=pal, vmin=0, vmax=5)\n", "ax.set_yticks([])\n", "ax.set_xlabel('Value')\n", "ax.set_title('Custom wolfpaletteModel')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "897ec9e7", "metadata": {}, "source": [ "## Reading / saving `.pal` files" ] }, { "cell_type": "code", "execution_count": 10, "id": "1a504d11", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saved to C:\\Users\\pierre\\AppData\\Local\\Temp\\tmpfhwbsd2m\\demo.pal\n", "Reloaded: 5 entries, range [0.0, 5.0]\n" ] } ], "source": [ "import tempfile\n", "from pathlib import Path\n", "\n", "tmpdir = Path(tempfile.mkdtemp())\n", "pal_file = tmpdir / 'demo.pal'\n", "\n", "# Save\n", "pal.savefile(str(pal_file))\n", "print(f\"Saved to {pal_file}\")\n", "\n", "# Reload\n", "pal2 = wolfpaletteModel()\n", "pal2.readfile(str(pal_file))\n", "print(f\"Reloaded: {pal2.nb} entries, range [{pal2.values[0]}, {pal2.values[-1]}]\")" ] }, { "cell_type": "markdown", "id": "15473f22", "metadata": {}, "source": [ "## Built-in default palettes" ] }, { "cell_type": "code", "execution_count": 11, "id": "5d553ba7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Gray palette: 3 entries\n", "Default16 palette: 16 entries\n" ] } ], "source": [ "pal_gray = wolfpaletteModel()\n", "pal_gray.defaultgray()\n", "print(f\"Gray palette: {pal_gray.nb} entries\")\n", "\n", "pal16 = wolfpaletteModel()\n", "pal16.default16()\n", "print(f\"Default16 palette: {pal16.nb} entries\")" ] }, { "cell_type": "code", "execution_count": null, "id": "1529e0e8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "default16\n", "default_difference3\n", "defaultblue\n", "defaultblue3\n", "defaultblue_minmax\n", "defaultgray\n", "defaultgray_minmax\n", "defaultred_minmax\n" ] } ], "source": [ "# list all default palettes\n", "# enumerate all routines begin with 'default'\n", "for attr in dir(wolfpaletteModel):\n", " if attr.startswith('default'):\n", " print(attr)" ] }, { "cell_type": "markdown", "id": "42f5bbab", "metadata": {}, "source": [ "## Summary\n", "\n", "| Class | Purpose | wx required? |\n", "|-------|---------|------|\n", "| `RGB` | Named tuple with format converters (hex, int, 0-1) | No |\n", "| `colors` | Dictionary of ~1300 named RGB constants | No |\n", "| `wolfpaletteModel` | Color palette (value → RGBA), matplotlib-compatible | No |\n", "| `wolfpalette` | Adds wx dialogs for interactive editing | Yes |" ] } ], "metadata": { "kernelspec": { "display_name": "python311", "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.11.9" } }, "nbformat": 4, "nbformat_minor": 5 }