---
title: "Advanced Color Palette Management"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Advanced Color Palette Management}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 10,
  fig.height = 6,
  dpi = 300,
  out.width = "100%"
)
```

```{r setup, message = FALSE}
library(evanverse)
library(ggplot2)
library(dplyr)
```

# 🎨 Mastering Color Palettes in evanverse

The `evanverse` package provides a sophisticated color palette system designed specifically for data visualization and bioinformatics applications. This guide explores the complete palette ecosystem, from basic usage to advanced customization.

## 🎯 Overview of the Palette System

The evanverse palette system includes:

- **Sequential palettes**: Perfect for continuous data (heatmaps, gradients)
- **Qualitative palettes**: Ideal for categorical data (groups, factors)
- **Diverging palettes**: Best for data with meaningful midpoints
- **Bio-focused palettes**: Specially designed for biological data visualization

## 📋 Discovering Available Palettes

### List All Palettes by Type

```{r palette-discovery}
# Get all available palettes by type
seq_palettes <- list_palettes(type = "sequential")
qual_palettes <- list_palettes(type = "qualitative")
div_palettes <- list_palettes(type = "diverging")

cat("📈 Sequential Palettes (", length(seq_palettes), "):\n")
cat(paste(seq_palettes, collapse = ", "), "\n\n")

cat("🏷️ Qualitative Palettes (", length(qual_palettes), "):\n")
cat(paste(qual_palettes, collapse = ", "), "\n\n")

cat("↔️ Diverging Palettes (", length(div_palettes), "):\n")
cat(paste(div_palettes, collapse = ", "), "\n")
```

### Interactive Palette Gallery

```{r palette-gallery, fig.cap="Complete gallery of all available palettes organized by type"}
# Display the complete palette gallery
bio_palette_gallery()
```

## 🔍 Working with Individual Palettes

### Getting Specific Palettes

```{r individual-palettes}
# Get qualitative palette with default number of colors
vivid_default <- get_palette("vividset", type = "qualitative")
cat("Vivid palette (default):\n")
print(vivid_default)

# Get specific number of colors from sequential palette
blues_3 <- get_palette("blues", type = "sequential", n = 3)
cat("\nBlues palette (3 colors):\n")
print(blues_3)

# Get all available colors from a palette (just omit n parameter)
blues_all <- get_palette("blues", type = "sequential")
cat("\nBlues palette (all", length(blues_all), "colors):\n")
print(blues_all)
```

### Preview Individual Palettes

```{r palette-preview, fig.cap="Preview of different palette types with color swatches"}
# Save current par settings
oldpar <- par(no.readonly = TRUE)

# Preview different palette types
par(mfrow = c(2, 2), mar = c(3, 1, 2, 1))

# Qualitative palette preview
preview_palette("vividset", type = "qualitative")
title("Qualitative: VividSet", cex.main = 1.2, col.main = "#0D47A1")

# Sequential palette preview
preview_palette("blues", type = "sequential")
title("Sequential: Blues", cex.main = 1.2, col.main = "#0D47A1")

# Another sequential palette
preview_palette("warm_blush", type = "sequential")
title("Sequential: Warm Blush", cex.main = 1.2, col.main = "#0D47A1")

# Diverging palette preview
preview_palette("gradient_rd_bu", type = "diverging")
title("Diverging: Red-Blue Gradient", cex.main = 1.2, col.main = "#0D47A1")

# Restore previous par settings
par(oldpar)
```

## 🛠️ Creating Custom Palettes

### Basic Custom Palette Creation

```{r custom-palettes}
# Define custom color schemes
modern_colors <- c("#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FFEAA7")
nature_colors <- c("#2E7D32", "#66BB6A", "#A5D6A7", "#E8F5E8")
corporate_colors <- c("#0D47A1", "#1976D2", "#42A5F5", "#90CAF9", "#E3F2FD")

# Create custom palettes (Note: this would save to package directory)
# create_palette("modern_vivid", type = "qualitative", colors = modern_colors)
# create_palette("nature_gradient", type = "sequential", colors = nature_colors)
# create_palette("corporate_blue", type = "sequential", colors = corporate_colors)

cat("Custom palette examples:\n")
cat("Modern vivid:", paste(modern_colors, collapse = ", "), "\n")
cat("Nature gradient:", paste(nature_colors, collapse = ", "), "\n")
cat("Corporate blue:", paste(corporate_colors, collapse = ", "), "\n")
```

### Color Space Utilities

```{r color-utilities}
# Convert between HEX and RGB formats
hex_colors <- c("#FF6B6B", "#4ECDC4", "#45B7D1")

# HEX to RGB conversion
rgb_matrix <- hex2rgb(hex_colors)
cat("HEX to RGB conversion:\n")
print(rgb_matrix)

# RGB back to HEX conversion
hex_back <- rgb2hex(rgb_matrix)
cat("\nRGB back to HEX:\n")
print(hex_back)

# Verify round-trip conversion
cat("\nRound-trip verification:\n")
print(data.frame(
  Original = hex_colors,
  Converted = hex_back,
  Match = hex_colors == hex_back
))
```

## 📊 Practical Applications in Visualization

### Qualitative Palettes for Categorical Data

```{r qual-demo, fig.cap="Demonstration of qualitative palettes for categorical data visualization"}
# Sample categorical data
set.seed(123)
category_data <- data.frame(
  Group = rep(LETTERS[1:5], each = 20),
  Value = c(rnorm(20, 10, 2), rnorm(20, 15, 3), rnorm(20, 12, 2.5),
            rnorm(20, 18, 4), rnorm(20, 8, 1.5)),
  Type = sample(c("Control", "Treatment"), 100, replace = TRUE)
)

# Use qualitative palette for groups
qual_colors <- get_palette("vividset", type = "qualitative", n = 5)

p1 <- ggplot(category_data, aes(x = Group, y = Value, fill = Group)) +
  geom_boxplot(alpha = 0.8, outlier.alpha = 0.6) +
  scale_fill_manual(values = qual_colors) +
  labs(
    title = "Qualitative Palette: Group Comparison",
    subtitle = "Using vividset palette for categorical data",
    x = "Experimental Group",
    y = "Measured Value"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666")
  )

print(p1)
```

### Sequential Palettes for Continuous Data

```{r seq-demo, fig.cap="Sequential palette demonstration with heatmap-style visualization"}
# Generate correlation matrix data
set.seed(456)
vars <- paste0("Var", 1:8)
cor_matrix <- cor(matrix(rnorm(8 * 50), ncol = 8))
colnames(cor_matrix) <- rownames(cor_matrix) <- vars

# Convert to long format for ggplot
cor_long <- expand.grid(X = vars, Y = vars)
cor_long$Correlation <- as.vector(cor_matrix)

# Use sequential palette
seq_colors <- get_palette("ggsci_locuszoom", type = "sequential", n = 7)

p2 <- ggplot(cor_long, aes(x = X, y = Y, fill = Correlation)) +
  geom_tile(color = "white", size = 0.5) +
  scale_fill_gradientn(
    colors = seq_colors,
    name = "Correlation",
    limits = c(-1, 1),
    breaks = seq(-1, 1, 0.5),
    labels = c("-1.0", "-0.5", "0.0", "0.5", "1.0")
  ) +
  labs(
    title = "Sequential Palette: Correlation Heatmap",
    subtitle = "Using ggsci_locuszoom palette for continuous correlation data",
    x = "Variables",
    y = "Variables"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666"),
    panel.grid = element_blank()
  ) +
  coord_fixed()

print(p2)
```

### Diverging Palettes for Centered Data

```{r div-demo, fig.cap="Diverging palette showing data with meaningful center point"}
# Generate data with meaningful center (e.g., fold changes)
set.seed(789)
gene_data <- data.frame(
  Gene = paste0("Gene_", 1:25),
  LogFoldChange = rnorm(25, 0, 1.5),
  Sample = rep(paste0("Sample_", 1:5), each = 5)
)

# Use diverging palette
div_colors <- get_palette("gradient_rd_bu", type = "diverging", n = 11)

p3 <- ggplot(gene_data, aes(x = Sample, y = Gene, fill = LogFoldChange)) +
  geom_tile(color = "white", size = 0.3) +
  scale_fill_gradientn(
    colors = div_colors,
    name = "Log2 FC",
    limits = c(-3, 3),
    breaks = seq(-3, 3, 1.5),
    labels = c("-3", "-1.5", "0", "+1.5", "+3")
  ) +
  labs(
    title = "Diverging Palette: Gene Expression Changes",
    subtitle = "Using red-blue palette for fold change data (centered at 0)",
    x = "Sample",
    y = "Gene"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666"),
    panel.grid = element_blank(),
    axis.text.y = element_text(size = 8)
  )

print(p3)
```

## 🔬 Bioinformatics-Specific Applications

### Palette Selection Guidelines

```{r bio-guidelines}
cat("🧬 BIOINFORMATICS PALETTE GUIDELINES\n")
cat("=====================================\n\n")

cat("📊 For Gene Expression Data:\n")
cat("  • Sequential: Use 'blues', 'greens', or 'oranges'\n")
cat("  • Diverging: Use 'gradient_rd_bu' or 'earthy_diverge' for fold changes\n\n")

cat("🔬 For Pathway Analysis:\n")
cat("  • Qualitative: Use 'vividset' or 'softpastel' for pathways\n")
cat("  • Sequential: Use 'purples' for p-value gradients\n\n")

cat("🎯 For Multi-omics Data:\n")
cat("  • Qualitative: Use 'brightcontrast' for distinct data types\n")
cat("  • Avoid red/green combinations for colorblind accessibility\n\n")

cat("📈 For Time Course Data:\n")
cat("  • Sequential: Use 'blues' or 'teals' for temporal progression\n")
cat("  • Qualitative: Use 'vividset' for treatment groups\n")
```

### Example: Multi-omics Visualization

```{r multiomics-demo, fig.cap="Multi-omics data visualization using appropriate color palettes"}
# Simulate multi-omics data
set.seed(321)
multiomics_data <- data.frame(
  Sample = rep(paste0("Patient_", 1:12), each = 4),
  DataType = rep(c("RNA-seq", "Proteomics", "Metabolomics", "Methylation"), 12),
  Intensity = c(
    rnorm(12, 100, 20),  # RNA-seq
    rnorm(12, 50, 15),   # Proteomics
    rnorm(12, 25, 8),    # Metabolomics
    rnorm(12, 75, 12)    # Methylation
  ),
  Condition = rep(rep(c("Control", "Disease"), each = 6), 4)
)

# Use distinct qualitative palette for data types
omics_colors <- get_palette("vividset", type = "qualitative", n = 4)
names(omics_colors) <- c("RNA-seq", "Proteomics", "Metabolomics", "Methylation")

p4 <- ggplot(multiomics_data, aes(x = Sample, y = Intensity, fill = DataType)) +
  geom_bar(stat = "identity", position = "dodge", alpha = 0.8) +
  scale_fill_manual(values = omics_colors, name = "Data Type") +
  facet_wrap(~Condition, scales = "free_x") +
  labs(
    title = "Multi-omics Data Integration",
    subtitle = "Using qualitative palette to distinguish data types",
    x = "Patient Samples",
    y = "Normalized Intensity"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 8),
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666"),
    legend.position = "bottom",
    strip.background = element_rect(fill = "#E3F2FD", color = NA)
  )

print(p4)
```

## 🎨 Advanced Palette Techniques

### Palette Interpolation and Blending

```{r advanced-techniques, fig.cap="Advanced color techniques: interpolation and custom gradients"}
# Create custom gradient using palette interpolation
base_colors <- get_palette("vividset", type = "qualitative", n = 3)

# Manual interpolation demonstration
custom_gradient <- colorRampPalette(base_colors[1:2])(10)

# Create visualization showing interpolation
gradient_demo <- data.frame(
  x = 1:10,
  y = rep(1, 10),
  color = custom_gradient
)

p5 <- ggplot(gradient_demo, aes(x = x, y = y, fill = color)) +
  geom_tile(height = 0.5, width = 0.9) +
  scale_fill_identity() +
  labs(
    title = "Custom Color Interpolation",
    subtitle = "Creating gradients from qualitative palette colors",
    x = "Gradient Position",
    y = ""
  ) +
  theme_minimal() +
  theme(
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    panel.grid = element_blank(),
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666")
  )

print(p5)

# Display the gradient colors
cat("Custom gradient colors:\n")
print(custom_gradient)
```

## 📋 Best Practices and Recommendations

### Accessibility Considerations

```{r accessibility}
cat("♿ ACCESSIBILITY & BEST PRACTICES\n")
cat("================================\n\n")

cat("🌈 Color Vision Considerations:\n")
cat("  • Test palettes with colorblind simulators\n")
cat("  • Avoid relying solely on red/green distinctions\n")
cat("  • Use high contrast ratios (minimum 3:1)\n")
cat("  • Consider texture/pattern alternatives\n\n")

cat("📱 Multi-Platform Compatibility:\n")
cat("  • Test on different displays (mobile, print, projector)\n")
cat("  • Use sufficient color separation for small elements\n")
cat("  • Consider grayscale conversion compatibility\n\n")

cat("📊 Data Visualization Guidelines:\n")
cat("  • Match palette type to data type (sequential/categorical)\n")
cat("  • Limit qualitative palettes to 8-10 distinct categories\n")
cat("  • Use consistent color meaning across related plots\n")
cat("  • Reserve bright colors for important data points\n")
```

### Performance Optimization

```{r performance}
cat("⚡ PERFORMANCE OPTIMIZATION TIPS\n")
cat("===============================\n\n")

cat("🚀 Efficient Palette Usage:\n")
cat("  • Cache frequently used palettes in variables\n")
cat("  • Use specific n= parameter to avoid unused colors\n")
cat("  • Pre-compile custom palettes for repeated use\n\n")

# Demonstrate efficient palette caching
cat("Example of efficient palette caching:\n")
cat("# Good: Cache palette once\n")
cat("my_colors <- get_palette('vividset', type = 'qualitative', n = 5)\n")
cat("# Then reuse: scale_fill_manual(values = my_colors)\n\n")

cat("# Avoid: Repeated palette calls\n")
cat("# scale_fill_manual(values = get_palette('vividset', ...))\n")
```

## 🔧 Troubleshooting Common Issues

### Common Problems and Solutions

```{r troubleshooting}
cat("🛠️ TROUBLESHOOTING GUIDE\n")
cat("=======================\n\n")

cat("❌ Issue: 'Palette not found' error\n")
cat("✅ Solution: Check available palettes with list_palettes()\n\n")

cat("❌ Issue: Not enough colors in palette\n")
cat("✅ Solution: Use n='all' or choose different palette\n\n")

cat("❌ Issue: Colors don't match expected output\n")
cat("✅ Solution: Verify palette type (sequential/qualitative/diverging)\n\n")

cat("❌ Issue: Custom palette not saving\n")
cat("✅ Solution: Check write permissions and file paths\n\n")

# Demonstrate error handling
tryCatch({
  # This will work
  valid_palette <- get_palette("vividset", type = "qualitative", n = 3)
  cat("✅ Successfully retrieved vividset palette\n")
}, error = function(e) {
  cat("❌ Error:", e$message, "\n")
})

tryCatch({
  # This might fail if palette doesn't exist
  invalid_palette <- get_palette("nonexistent", type = "qualitative")
  cat("✅ Retrieved nonexistent palette\n")
}, error = function(e) {
  cat("❌ Expected error for nonexistent palette:", e$message, "\n")
})
```

## 🎯 Summary and Next Steps

The evanverse color palette system provides:

✅ **Comprehensive palette collection** with 15+ carefully curated palettes
✅ **Type-specific organization** (sequential, qualitative, diverging)
✅ **Flexible color extraction** with custom counts and interpolation
✅ **Bio-focused design** optimized for scientific visualization
✅ **Easy customization** with palette creation and modification tools
✅ **Professional quality** suitable for publications and presentations

### Continue Learning:

- 📚 [Comprehensive Guide](comprehensive-guide.html) - Complete package overview
- 📊 [Data Processing](data-processing.html) - Data manipulation techniques
- 🧬 [Bioinformatics Workflows](bioinformatics-workflows.html) - Domain-specific applications

### Quick Reference:

```{r quick-ref, eval = FALSE}
# Essential color palette functions
list_palettes(type = "sequential")          # List available palettes
get_palette("blues", type = "sequential")   # Get specific palette
preview_palette("vividset", "qualitative")  # Preview colors
bio_palette_gallery()                       # Show all palettes
hex2rgb("#FF6B6B")                         # Convert colors
create_palette("custom", colors = c(...))   # Create custom palette
```

---

*🎨 Master the art of color with evanverse palettes!*