hgg-core-0.1.0.0: src/Graphics/Hgg/Palette.hs
-- |
-- Module : Graphics.Hgg.Palette
-- Description : Categorical / Sequential / Diverging palette カタログ
-- Copyright : (c) 2026 Aelysce Project (Toshiaki Honda)
-- License : BSD-3-Clause
--
-- P17 (2026-05-26 改訂):
-- * default `hggMain` = F-3 Balanced Mix (= 中程度彩度で重み均等)
-- * sub `hggPastel` = F-2 Pastel Mix (= 淡色 secondary)
-- * 全色は 7 キャラ設定画 Color Palette セクションの公式 hex
{-# LANGUAGE OverloadedStrings #-}
module Graphics.Hgg.Palette
( CategoricalPalette
, SequentialPalette
, DivergingPalette
, okabeIto
, viridis5
, spotfire -- 標準 UI default palette
, hggMain -- F-3 (default)
, hggMainVivid -- F-1
, hggPastel -- F-2
, ggplotHue -- ggplot2 hue_pal (= n 依存 HCL 等間隔)
, hggExtended
, whiteRabbit
, cheshireCat
, dormouse
, marchHare
, queenOfHearts
, whiteQueen
, redQueen
, whiteRabbitSeq
, cheshireCatSeq
, dormouseSeq
, marchHareSeq
, queenOfHeartsSeq
, whiteQueenSeq
, redQueenSeq
, hggBlueSeq
, hggRedSeq
, hggGoldSeq
, hggSageSeq
, hggSiennaSeq
, hggPurpleSeq
, hggRoseSeq
, hggDivQueens
, hggDivYellowPurple
, hggDivPinkGreen
, hggCyclical5
, hggWarn
, hggHighlight
, hggSuccess
, hggInfo
-- * ColorBrewer 2.0 palette (Phase 6 A9、 P17)
-- $colorbrewer
-- ** Categorical (qualitative)
, brewerSet1
, brewerSet2
, brewerSet3
, brewerPaired
, brewerDark2
-- ** Diverging
, brewerRdYlBu
, brewerRdBu
, brewerSpectral
, brewerPuOr
, brewerBrBG
, brewerRdGy
, brewerPiYG
) where
import Data.Text (Text)
type CategoricalPalette = [Text]
type SequentialPalette = [Text]
type DivergingPalette = [Text]
okabeIto :: CategoricalPalette
okabeIto =
[ "#E69F00", "#56B4E9", "#009E73", "#F0E442"
, "#0072B2", "#D55E00", "#CC79A7", "#000000" ]
viridis5 :: SequentialPalette
viridis5 = ["#440154", "#3B528B", "#21918C", "#5EC962", "#FDE725"]
-- | Spotfire 風 (= 標準 UI default colorPalette と一致)。
spotfire :: CategoricalPalette
spotfire =
[ "#93c5fd", "#fca5a5", "#fde047", "#86efac", "#f9a8d4"
, "#67e8f9", "#fdba74", "#e5e5e5"
, "#2563eb", "#dc2626", "#ca8a04", "#16a34a"
, "#db2777", "#0891b2", "#ea580c"
]
-- ★ F-3 Balanced (default)
hggMain :: CategoricalPalette
hggMain =
[ "#C9A968", "#7A5C92", "#B79DB8", "#3E6A6F"
, "#C7445D", "#B8C7D9", "#7E1F23" ]
-- F-1 Vivid Main
hggMainVivid :: CategoricalPalette
hggMainVivid =
[ "#C9A968", "#5B2E7C", "#8A6B4F", "#2A4E54"
, "#A61E2A", "#C7D7E6", "#5D0F12" ]
-- ★ F-2 Pastel Mix
hggPastel :: CategoricalPalette
hggPastel =
[ "#F0A5A0", "#C0B8E6", "#B79DB8", "#A7D7DE"
, "#D7A1A6", "#C7D7E6", "#A45353" ]
-- | ggplot2 既定 discrete パレット (= @scales::hue_pal()@)。
-- HCL 色空間で等間隔 hue (L=65, C=100, hue = seq(15,375,length=n+1)[1:n])。
-- 色数 n に依存して hue が再配分されるため、 R @hue_pal()(n)@ の出力を n=1..8 で
-- テーブル化 (= 実行時 HCL→sRGB 変換を避ける)。 n>8 は 8 色版を循環、 n<1 は 8 色版。
ggplotHue :: Int -> CategoricalPalette
ggplotHue n
| n <= 0 = ggplotHue8
| n == 1 = ["#F8766D"]
| n == 2 = ["#F8766D", "#00BFC4"]
| n == 3 = ["#F8766D", "#00BA38", "#619CFF"]
| n == 4 = ["#F8766D", "#7CAE00", "#00BFC4", "#C77CFF"]
| n == 5 = ["#F8766D", "#A3A500", "#00BF7D", "#00B0F6", "#E76BF3"]
| n == 6 = ["#F8766D", "#B79F00", "#00BA38", "#00BFC4", "#619CFF", "#F564E3"]
| n == 7 = ["#F8766D", "#C49A00", "#53B400", "#00C094", "#00B6EB", "#A58AFF", "#FB61D7"]
| n == 8 = ggplotHue8
| otherwise = take n (cycle ggplotHue8)
where
ggplotHue8 =
[ "#F8766D", "#CD9600", "#7CAE00", "#00BE67"
, "#00BFC4", "#00A9FF", "#C77CFF", "#FF61CC" ]
hggExtended :: CategoricalPalette
hggExtended =
[ "#C9A968", "#2A3050", "#D63A4A" -- WR
, "#5B2E7C", "#C7A666", "#7A5C92" -- CC
, "#8A6B4F", "#B79DB8", "#F2E8C9" -- DM
, "#2A4E54", "#B08B4A", "#7A4A2E" -- MH
, "#A61E2A", "#C7A46A", "#3B263B" -- QH
, "#C7D7E6", "#B8C7D9", "#C9CDD3" -- WQ
, "#5D0F12", "#C3A46E", "#4A3322" -- RQ
]
-- 各キャラ 4 色 (= 公式 hex のみ)
whiteRabbit = [ "#C9A968", "#2A3050", "#D63A4A", "#F0A5A0" ] :: CategoricalPalette
cheshireCat = [ "#5B2E7C", "#C7A666", "#C0B8E6", "#7A5C92" ] :: CategoricalPalette
dormouse = [ "#8A6B4F", "#B79DB8", "#F2E8C9", "#C9A968" ] :: CategoricalPalette
marchHare = [ "#2A4E54", "#B08B4A", "#7A4A2E", "#A7D7DE" ] :: CategoricalPalette
queenOfHearts = [ "#A61E2A", "#C7A46A", "#3B263B", "#C7445D" ] :: CategoricalPalette
whiteQueen = [ "#C7D7E6", "#B8C7D9", "#C9CDD3", "#DDE8F2" ] :: CategoricalPalette
redQueen = [ "#5D0F12", "#C3A46E", "#4A3322", "#7E1F23" ] :: CategoricalPalette
-- 各キャラ sequential (= 公式 hex 由来)
whiteRabbitSeq, cheshireCatSeq, dormouseSeq, marchHareSeq
, queenOfHeartsSeq, whiteQueenSeq, redQueenSeq :: SequentialPalette
whiteRabbitSeq = ["#F2E8D0", "#E8E5DD", "#C9A968", "#8B6F3A", "#2A3050"]
whiteQueenSeq = ["#FBFCFD", "#E6EEF6", "#DDE8F2", "#C9CDD3", "#B8C7D9"]
cheshireCatSeq = ["#E6E3EA", "#C0B8E6", "#C0C0F0", "#7A5C92", "#5B2E7C"]
dormouseSeq = ["#FBF6EE", "#F3E6C6", "#F2E8C9", "#C9A968", "#8A6B4F"]
marchHareSeq = ["#F8F6F1", "#F3E7D6", "#A7D7DE", "#3E6A6F", "#2A4E54"]
queenOfHeartsSeq = ["#F7F4F1", "#D7A1A6", "#C7445D", "#A61E2A", "#6E0F23"]
redQueenSeq = ["#F5EFE6", "#C3A46E", "#A45353", "#7E1F23", "#5D0F12"]
-- 汎用 sequential (= ColorBrewer 風)
hggBlueSeq, hggRedSeq, hggGoldSeq, hggSageSeq
, hggSiennaSeq, hggPurpleSeq, hggRoseSeq :: SequentialPalette
hggBlueSeq = ["#C0C8D5", "#7A839A", "#2A3050", "#1A1F38", "#0F1424"]
hggRedSeq = ["#F4C7CD", "#E68390", "#D63A4A", "#A02838", "#6E1A28"]
hggGoldSeq = ["#F0E3BD", "#DDC68C", "#C9A968", "#8B6F3A", "#5A4520"]
hggSageSeq = ["#C8D3C0", "#92A689", "#5A7958", "#3D573D", "#253726"]
hggSiennaSeq = ["#F0C9AC", "#DD9B6F", "#C76A3A", "#8B4523", "#5A2A13"]
hggPurpleSeq = ["#C4B3CE", "#8E68A8", "#5B2E7C", "#3F1F58", "#25113A"]
hggRoseSeq = ["#F2C9D1", "#DD8A9B", "#C7445D", "#8E2D44", "#561A2A"]
-- Diverging (= 公式 hex)
hggDivQueens :: DivergingPalette
hggDivQueens =
[ "#5D0F12", "#7E1F23", "#A45353"
, "#F5EFE6"
, "#DDE8F2", "#B8C7D9", "#C7D7E6"
]
hggDivYellowPurple :: DivergingPalette
hggDivYellowPurple =
[ "#C9A968", "#DDC68C", "#F0E3BD"
, "#F2E8D0"
, "#C4B3CE", "#8E68A8", "#5B2E7C" ]
hggDivPinkGreen :: DivergingPalette
hggDivPinkGreen =
[ "#C7445D", "#DD8A9B", "#F2C9D1"
, "#F2E8D0"
, "#C8D3C0", "#92A689", "#5A7958" ]
hggCyclical5 :: CategoricalPalette
hggCyclical5 =
[ "#C9A968", "#2A4E54", "#3A4A66", "#5B2E7C", "#5D0F12" ]
hggWarn, hggHighlight, hggSuccess, hggInfo :: Text
hggWarn = "#D63A4A"
hggHighlight = "#F0A5A0"
hggSuccess = "#6BB07A"
hggInfo = "#8AA0BA"
-- ===========================================================================
-- ColorBrewer 2.0 (= Cynthia Brewer、 Penn State、 Apache 2.0 license)
-- ===========================================================================
-- $colorbrewer
-- ColorBrewer は地図・科学可視化向け 35 palette のセット。
-- ここでは categorical 5 種 + diverging 7 種を import (= 9-class が中心)。
-- 公式: <https://colorbrewer2.org/>
-- License: Apache 2.0 (= attribution required)
-- | Categorical Set1 (9-class)。 強い primary 色、 区別性高い。
brewerSet1 :: CategoricalPalette
brewerSet1 =
[ "#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00"
, "#FFFF33", "#A65628", "#F781BF", "#999999" ]
-- | Categorical Set2 (8-class)。 やや pastel、 印刷に向く。
brewerSet2 :: CategoricalPalette
brewerSet2 =
[ "#66C2A5", "#FC8D62", "#8DA0CB", "#E78AC3", "#A6D854"
, "#FFD92F", "#E5C494", "#B3B3B3" ]
-- | Categorical Set3 (12-class)。 多 categorical に向く、 薄め。
brewerSet3 :: CategoricalPalette
brewerSet3 =
[ "#8DD3C7", "#FFFFB3", "#BEBADA", "#FB8072", "#80B1D3"
, "#FDB462", "#B3DE69", "#FCCDE5", "#D9D9D9", "#BC80BD"
, "#CCEBC5", "#FFED6F" ]
-- | Paired (12-class)。 light/dark のペア (= 2 グループ × 6 色)。
brewerPaired :: CategoricalPalette
brewerPaired =
[ "#A6CEE3", "#1F78B4", "#B2DF8A", "#33A02C", "#FB9A99"
, "#E31A1C", "#FDBF6F", "#FF7F00", "#CAB2D6", "#6A3D9A"
, "#FFFF99", "#B15928" ]
-- | Dark2 (8-class)。 dark 系、 強い contrast。
brewerDark2 :: CategoricalPalette
brewerDark2 =
[ "#1B9E77", "#D95F02", "#7570B3", "#E7298A", "#66A61E"
, "#E6AB02", "#A6761D", "#666666" ]
-- | Diverging RdYlBu (9-class、 中心 #FFFFBF)。 赤 ↔ 黄 ↔ 青。
brewerRdYlBu :: DivergingPalette
brewerRdYlBu =
[ "#D73027", "#F46D43", "#FDAE61", "#FEE090"
, "#FFFFBF"
, "#E0F3F8", "#ABD9E9", "#74ADD1", "#4575B4" ]
-- | Diverging RdBu (9-class)。 赤 ↔ 青、 中央 #F7F7F7。
brewerRdBu :: DivergingPalette
brewerRdBu =
[ "#B2182B", "#D6604D", "#F4A582", "#FDDBC7"
, "#F7F7F7"
, "#D1E5F0", "#92C5DE", "#4393C3", "#2166AC" ]
-- | Diverging Spectral (11-class)。 虹 (= 赤→橙→黄→緑→青→紫)、 中心 #FFFFBF。
brewerSpectral :: DivergingPalette
brewerSpectral =
[ "#9E0142", "#D53E4F", "#F46D43", "#FDAE61", "#FEE08B"
, "#FFFFBF"
, "#E6F598", "#ABDDA4", "#66C2A5", "#3288BD", "#5E4FA2" ]
-- | Diverging PuOr (9-class)。 紫 ↔ 橙、 中央 #F7F7F7。
brewerPuOr :: DivergingPalette
brewerPuOr =
[ "#B35806", "#E08214", "#FDB863", "#FEE0B6"
, "#F7F7F7"
, "#D8DAEB", "#B2ABD2", "#8073AC", "#542788" ]
-- | Diverging BrBG (9-class)。 茶 ↔ 緑、 中央 #F5F5F5。
brewerBrBG :: DivergingPalette
brewerBrBG =
[ "#8C510A", "#BF812D", "#DFC27D", "#F6E8C3"
, "#F5F5F5"
, "#C7EAE5", "#80CDC1", "#35978F", "#01665E" ]
-- | Diverging RdGy (9-class)。 赤 ↔ 灰、 中央 #FFFFFF。
brewerRdGy :: DivergingPalette
brewerRdGy =
[ "#B2182B", "#D6604D", "#F4A582", "#FDDBC7"
, "#FFFFFF"
, "#E0E0E0", "#BABABA", "#878787", "#4D4D4D" ]
-- | Diverging PiYG (9-class)。 ピンク ↔ 黄緑、 中央 #F7F7F7。
brewerPiYG :: DivergingPalette
brewerPiYG =
[ "#C51B7D", "#DE77AE", "#F1B6DA", "#FDE0EF"
, "#F7F7F7"
, "#E6F5D0", "#B8E186", "#7FBC41", "#4D9221" ]