
---
title: "Color Palette Naming Convention"
subtitle: "Official Naming Standards for evanverse Palette System"
author: "evanverse package"
date: "`r Sys.Date()`"
output:
  html_document:
    toc: true
    toc_depth: 3
    toc_float: true
    theme: flatly
    highlight: tango
    code_folding: show
vignette: >
  %\VignetteIndexEntry{Color Palette Naming Convention}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
  echo = TRUE,
  warning = FALSE,
  message = FALSE,
  fig.width = 10,
  fig.height = 6,
  collapse = TRUE,
  comment = "#>"
)

library(evanverse)
```

# Overview

This document defines the **official naming convention** for color palettes in the evanverse package. Following these standards ensures:

- **Self-documenting names** - Instantly understand palette type and purpose
- **Consistency** - Predictable patterns across all palettes
- **Easy discovery** - Find the right palette quickly
- **Scalability** - Clear structure for future additions

**Core Principle**: `type_name_source` structure with lowercase and underscores.

---

# Naming Structure

## Format

All palette names follow this structure:

```
[type]_[name]_[source]
  │      │       │
  │      │       └─ Optional: Source identifier
  │      └───────── Required: Descriptive name
  └──────────────── Required: Type prefix
```

## Components

### 1. Type Prefix (Required)

Use **3-letter abbreviations** to indicate palette type:

| Prefix | Type | Use Case | Example Scenario |
|--------|------|----------|------------------|
| `seq_` | Sequential | Continuous values, one direction | Heatmaps, gene expression levels |
| `div_` | Diverging | Values with meaningful midpoint | Fold change, up/down regulation |
| `qual_` | Qualitative | Categorical data, no inherent order | Cell types, sample groups |

**Examples**:
```r
seq_blues      # Sequential palette
div_redblue    # Diverging palette
qual_vivid     # Qualitative palette
```

**Why required?**

- Enables automatic type inference in `get_palette()`
- Makes filtering with `list_palettes()` intuitive
- Eliminates ambiguity about palette purpose

### 2. Name (Required)

Describes the palette's **visual characteristics** or **intended use**:

**Naming strategies**:

```r
# By color characteristics
qual_vivid        # Bright, saturated colors
seq_muted         # Soft, low-saturation colors
div_warm          # Warm color tones

# By color description
div_redblue       # Red to blue gradient
seq_sunset        # Sunset-inspired colors
qual_earthy       # Earth tone palette

# By application domain
qual_pbmc         # PBMC (peripheral blood) data
seq_heatmap       # Optimized for heatmaps

# By journal/standard
qual_nejm         # New England Journal of Medicine style
qual_lancet       # The Lancet journal style
```

**Guidelines**:

- **Short**: 1-2 words maximum
- **Intuitive**: Reflects actual colors or application
- **Unique**: No duplicates within the same type

### 3. Source Identifier (Optional)

**Only use for adapted palettes** from other packages or standards:

| Suffix | Source | Usage |
|--------|--------|-------|
| `_g` | ggsci | Adapted from ggsci package |
| `_rb` | RColorBrewer | Adapted from RColorBrewer |
| `_v` | viridis | Adapted from viridis package |
| `_sc` | single-cell | Single-cell data specific |
| `_bio` | bioinformatics | Bioinformatics standard |

**Examples**:
```r
qual_nejm_g       # NEJM palette from ggsci
qual_set1_rb      # Set1 from RColorBrewer
seq_viridis_v     # Viridis palette
qual_pbmc_sc      # PBMC-specific palette
```

**Important**: Custom palettes should **NOT** have source suffixes.

---

# The 5 Golden Rules

1. **All lowercase** - No capital letters
2. **Underscore separators** - Use `_`, not camelCase or dots
3. **No number suffixes** - Color count belongs in metadata
4. **Type prefix required** - Must start with `seq_`, `div_`, or `qual_`
5. **Remove redundant words** - Simplify descriptions

---

# Examples

## ✅ Good Names

```r
# Clear and concise
qual_vivid           # Type + descriptive characteristic
div_redblue          # Intuitive color pair
seq_sunset           # Evocative name

# Proper source attribution
qual_nejm_g          # Journal style from ggsci
qual_set1_rb         # RColorBrewer Set1
qual_pbmc_sc         # Single-cell specific

# Domain-specific
seq_heatmap          # Application-focused
qual_cosmic_g        # Theme-based (Cosmic)
```

## ❌ Bad Names

```r
vividset             # Missing type prefix
harmonySix           # Mixed case + number suffix
NEJM_Colors          # Capital letters
my.palette           # Dot separator
beautiful-colors     # Dash separator
palette_12_colors    # Number in name
nice_colors          # Too vague
gradient_rd_bu       # Unclear abbreviations
```

---

# Usage

## Getting Palettes

```{r eval=FALSE}
library(evanverse)

# Type is inferred from prefix
get_palette("seq_sunset")    # Automatically knows type = "sequential"
get_palette("div_redblue")   # Automatically knows type = "diverging"
get_palette("qual_vivid")    # Automatically knows type = "qualitative"

# Can still specify type explicitly
get_palette("seq_sunset", type = "sequential")

# Wrong type will error with helpful message
get_palette("seq_sunset", type = "diverging")
#> Error: Palette 'seq_sunset' is sequential, not diverging
```

## Listing Palettes

```{r eval=FALSE}
# List all palettes
list_palettes()

# Filter by type
list_palettes(type = "sequential")
list_palettes(type = c("diverging", "qualitative"))
```

## In ggplot2

```{r eval=FALSE}
library(ggplot2)

# Sequential - continuous values
ggplot(data, aes(x, y, fill = expression)) +
  geom_tile() +
  scale_fill_gradientn(colors = get_palette("seq_sunset"))

# Diverging - fold change
ggplot(data, aes(x, y, color = log2FC)) +
  geom_point() +
  scale_color_gradientn(colors = get_palette("div_redblue"))

# Qualitative - categories
ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
  geom_point() +
  scale_color_manual(values = get_palette("qual_vivid"))
```

---

# Adding New Palettes

## Workflow

### Step 1: Determine Type

```r
# What does your data represent?

# Continuous values (magnitude)?
type <- "sequential"     # Use seq_ prefix

# Values with midpoint (diverging)?
type <- "diverging"      # Use div_ prefix

# Unordered categories?
type <- "qualitative"    # Use qual_ prefix
```

### Step 2: Choose Name

```r
# For custom palette
name <- "qual_ocean"              # type + descriptive name

# For adapted palette
name <- "qual_nature_g"           # type + name + source
name <- "seq_thermal_v"           # viridis-based
```

### Step 3: Create

```{r eval=FALSE}
create_palette(
  name = "qual_ocean",
  type = "qualitative",
  colors = c("#006BA4", "#FF7F0E", "#2CA02C", "#D62728", "#9467BD"),
  color_dir = system.file("extdata", "palettes", package = "evanverse")
)
```

### Step 4: Validate

**Checklist**:

```r
# ✓ Has type prefix? (seq_/div_/qual_)
# ✓ All lowercase?
# ✓ Uses underscores?
# ✓ No number suffixes?
# ✓ Source suffix only if adapted?
# ✓ Unique within its type?
```

### Step 5: Compile

```{r eval=FALSE}
# Recompile palettes.rds
compile_palettes(
  palettes_dir = system.file("extdata", "palettes", package = "evanverse"),
  output_rds = system.file("extdata", "palettes.rds", package = "evanverse")
)

# Test
get_palette("qual_ocean")
preview_palette("qual_ocean", type = "qualitative")
```

---

# Best Practices

## Naming Strategies

### By Visual Characteristics

```r
# Color intensity
qual_vivid          # High saturation
seq_muted           # Low saturation
qual_pastel         # Pastel colors

# Color temperature
div_warm            # Warm tones
seq_cool            # Cool tones

# Color composition
qual_earthy         # Earth tones
seq_blues           # Blue gradient
div_redblue         # Red-blue diverging
```

### By Application

```r
# Data type
qual_pbmc           # PBMC cell types
seq_heatmap         # Heat map optimized
div_volcano         # Volcano plot

# Domain
qual_clinical       # Clinical data
seq_genomic         # Genomic data
```

### By Source

```r
# Journals
qual_nejm_g         # NEJM from ggsci
qual_lancet_g       # Lancet from ggsci
qual_jama_g         # JAMA from ggsci

# Standard palettes
qual_set1_rb        # RColorBrewer Set1
seq_viridis_v       # Viridis
```

## Do's

```r
# ✅ Use clear, descriptive names
seq_sunset          # Immediately understandable
qual_vivid          # Describes the style
div_fireice         # Evocative metaphor

# ✅ Keep it short
qual_ocean          # Concise
seq_warm            # Direct

# ✅ Credit sources
qual_nejm_g         # Acknowledges ggsci
qual_set1_rb        # Acknowledges RColorBrewer

# ✅ Be consistent in series
qual_earth_light    # Clear series
qual_earth_medium   # pattern
qual_earth_dark     #
```

## Don'ts

```r
# ❌ Don't use mixed case
MyPalette           # Use: qual_mypalette
qualVivid           # Use: qual_vivid

# ❌ Don't use other separators
my.palette          # Use: qual_mypalette
custom-colors       # Use: qual_custom

# ❌ Don't include numbers
palette_12          # Use metadata instead
colors_v2           # Use: qual_colors (version in docs)

# ❌ Don't omit type
beautiful           # Use: qual_beautiful
sunset              # Use: seq_sunset

# ❌ Don't be vague
nice_colors         # Too generic
palette1            # Not descriptive
good_palette        # Meaningless
```

## Series Naming

For related palettes:

```r
# ✅ GOOD - Consistent pattern
seq_warm_light
seq_warm_medium
seq_warm_dark

# Or with explicit color counts
qual_earth_3        # 3-color version
qual_earth_6        # 6-color version
qual_earth_12       # 12-color version

# ❌ BAD - Inconsistent
seq_warm_light
seq_warm            # Missing variant identifier
warm_dark           # Missing type prefix
seq_warm2           # Number without underscore
```

---

# Quick Reference

## Type Prefixes

```
seq_   →  Sequential    (one-direction gradients)
div_   →  Diverging     (two-direction from center)
qual_  →  Qualitative   (discrete categories)
```

## Source Suffixes

```
_g     →  ggsci package
_rb    →  RColorBrewer package
_v     →  viridis package
_sc    →  single-cell specific
_bio   →  bioinformatics standard
```

## Templates

```r
# Custom palettes
[type]_[descriptive_name]
seq_sunset           # Example
qual_vivid           # Example
div_warm             # Example

# Adapted palettes
[type]_[original_name]_[source]
qual_nejm_g          # Example
seq_viridis_v        # Example
qual_set1_rb         # Example
```

## Validation Checklist

```
□ Starts with seq_, div_, or qual_
□ All lowercase letters
□ Uses underscores for separation
□ No numbers in the name
□ Descriptive and intuitive
□ Source suffix only if adapted
□ Unique within its type
```

---

# Summary

## Core Principles

1. **Type identification** - Prefix clearly indicates palette purpose
2. **Descriptive naming** - Names reflect colors or application
3. **Source attribution** - Credit adapted palettes appropriately
4. **Consistency** - Follow uniform standards
5. **Simplicity** - Keep names concise and clear

## The Golden Rule

> **`type_name_source`** structure
> All lowercase + underscores only

## Benefits

- ✅ **Instant recognition** - Know palette type at a glance
- ✅ **Automatic inference** - Functions detect type from name
- ✅ **Easy filtering** - Find palettes by type quickly
- ✅ **Clear attribution** - Proper credit to sources
- ✅ **Scalable system** - Easy to add new palettes

---

## Resources

- Main documentation: `?evanverse`
- Color system guide: `vignette("get-started", package = "evanverse")`
- Package website: [evanverse documentation](https://github.com/evanbio/evanverse)

---

**Document Version**: 1.0
**Last Updated**: `r Sys.Date()`
**Status**: Official Standard
