#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
import enum
from numbers import Real
from typing import List, Tuple
# type aliases
TRGB = Tuple[Real, ...]
[docs]class COLORS(enum.Enum):
STEELBLUE = (128, 177, 211)
CORAL = (251, 128, 114)
TEAL = (141, 211, 199)
PINK = (188, 128, 189)
LIGHT_PURPLE = (190, 186, 218)
ORANGE = (253, 180, 98)
# colors to be used for plotting discrete series
DISCRETE_COLOR_SCALE = [
COLORS.STEELBLUE.value,
COLORS.CORAL.value,
COLORS.PINK.value,
COLORS.LIGHT_PURPLE.value,
COLORS.ORANGE.value,
COLORS.TEAL.value,
]
# 11-class PiYG from ColorBrewer (for contour plots)
GREEN_PINK_SCALE = [
(142, 1, 82),
(197, 27, 125),
(222, 119, 174),
(241, 182, 218),
(253, 224, 239),
(247, 247, 247),
(230, 245, 208),
(184, 225, 134),
(127, 188, 65),
(77, 146, 33),
(39, 100, 25),
]
GREEN_SCALE = [
(247, 252, 253),
(229, 245, 249),
(204, 236, 230),
(153, 216, 201),
(102, 194, 164),
(65, 174, 118),
(35, 139, 69),
(0, 109, 44),
(0, 68, 27),
]
BLUE_SCALE = [
(255, 247, 251),
(236, 231, 242),
(208, 209, 230),
(166, 189, 219),
(116, 169, 207),
(54, 144, 192),
(5, 112, 176),
(3, 78, 123),
]
# 24 Class Mixed Color Palette
# Source: https://graphicdesign.stackexchange.com/a/3815
MIXED_SCALE = [
(2, 63, 165),
(125, 135, 185),
(190, 193, 212),
(214, 188, 192),
(187, 119, 132),
(142, 6, 59),
(74, 111, 227),
(133, 149, 225),
(181, 187, 227),
(230, 175, 185),
(224, 123, 145),
(211, 63, 106),
(17, 198, 56),
(141, 213, 147),
(198, 222, 199),
(234, 211, 198),
(240, 185, 141),
(239, 151, 8),
(15, 207, 192),
(156, 222, 214),
(213, 234, 231),
(243, 225, 235),
(246, 196, 225),
(247, 156, 212),
]
[docs]def rgba(rgb_tuple: TRGB, alpha: float = 1) -> str:
"""Convert RGB tuple to an RGBA string."""
return "rgba({},{},{},{alpha})".format(*rgb_tuple, alpha=alpha)
[docs]def plotly_color_scale(
list_of_rgb_tuples: List[TRGB],
reverse: bool = False,
alpha: float = 1,
) -> List[Tuple[float, str]]:
"""Convert list of RGB tuples to list of tuples, where each tuple is
break in [0, 1] and stringified RGBA color.
"""
if reverse:
list_of_rgb_tuples = list_of_rgb_tuples[::-1]
return [
(round(i / (len(list_of_rgb_tuples) - 1), 3), rgba(rgb))
for i, rgb in enumerate(list_of_rgb_tuples)
]