🎨 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
# Get all available palettes by type
seq_palettes <- list_palettes(type = "sequential")
#>
#> ── Available Color Palettes ────────────────────────────────────────────────────
#> ℹ Total palettes: 5
#> ℹ Type "sequential": 5 palettes
#> ℹ \u2022 blues (sequential) - 3 colors
#> ℹ \u2022 forest_fade (sequential) - 4 colors
#> ℹ \u2022 muted_gradient (sequential) - 4 colors
#> ℹ \u2022 warm_blush (sequential) - 4 colors
#> ℹ \u2022 ggsci_locuszoom (sequential) - 7 colors
qual_palettes <- list_palettes(type = "qualitative")
#>
#> ── Available Color Palettes ────────────────────────────────────────────────────
#> ℹ Total palettes: 23
#> ℹ Type "qualitative": 23 palettes
#> ℹ \u2022 earthy_triad (qualitative) - 3 colors
#> ℹ \u2022 primary_triad (qualitative) - 3 colors
#> ℹ \u2022 softtrio (qualitative) - 3 colors
#> ℹ \u2022 vintage_triad (qualitative) - 3 colors
#> ℹ \u2022 balanced_quartet (qualitative) - 4 colors
#> ℹ \u2022 vibrant (qualitative) - 5 colors
#> ℹ \u2022 violin (qualitative) - 5 colors
#> ℹ \u2022 harmonysix (qualitative) - 6 colors
#> ℹ \u2022 pastel_harmony (qualitative) - 6 colors
#> ℹ \u2022 ggsci_jama (qualitative) - 7 colors
#> ℹ \u2022 ggsci_tron_legacy (qualitative) - 7 colors
#> ℹ \u2022 ggsci_nejm (qualitative) - 8 colors
#> ℹ \u2022 rcb_set2 (qualitative) - 8 colors
#> ℹ \u2022 ggsci_lancet (qualitative) - 9 colors
#> ℹ \u2022 rcb_set1 (qualitative) - 9 colors
#> ℹ \u2022 vividset (qualitative) - 9 colors
#> ℹ \u2022 ggsci_cosmic (qualitative) - 10 colors
#> ℹ \u2022 ggsci_flatui (qualitative) - 10 colors
#> ℹ \u2022 ggsci_jco (qualitative) - 10 colors
#> ℹ \u2022 ggsci_npg (qualitative) - 10 colors
#> ℹ \u2022 ggsci_futurama (qualitative) - 12 colors
#> ℹ \u2022 rcb_set3 (qualitative) - 12 colors
#> ℹ \u2022 sc_pbmc (qualitative) - 17 colors
div_palettes <- list_palettes(type = "diverging")
#>
#> ── Available Color Palettes ────────────────────────────────────────────────────
#> ℹ Total palettes: 7
#> ℹ Type "diverging": 7 palettes
#> ℹ \u2022 contrast_duo (diverging) - 2 colors
#> ℹ \u2022 fire_ice_duo (diverging) - 2 colors
#> ℹ \u2022 polar_duo (diverging) - 2 colors
#> ℹ \u2022 sunset_sky (diverging) - 2 colors
#> ℹ \u2022 piyg (diverging) - 3 colors
#> ℹ \u2022 earthy_diverge (diverging) - 5 colors
#> ℹ \u2022 gradient_rd_bu (diverging) - 11 colors
cat("📈 Sequential Palettes (", length(seq_palettes), "):\n")
#> 📈 Sequential Palettes ( 4 ):
cat(paste(seq_palettes, collapse = ", "), "\n\n")
#> c("blues", "forest_fade", "muted_gradient", "warm_blush", "ggsci_locuszoom"), c("sequential", "sequential", "sequential", "sequential", "sequential"), c(3, 4, 4, 4, 7), list(c("#deebf7", "#9ecae1", "#3182bd"), c("#B2C9AD", "#91AC8F", "#66785F", "#4B5945"), c("#E2E0C8", "#A7B49E", "#818C78", "#5C7285"), c("#FFCDB2", "#FFB4A2", "#E5989B", "#B5828C"), c("#D43F3A", "#EEA236", "#5CB85C", "#46B8DA", "#357EBD", "#9632B8", "#B8B8B8"))
cat("🏷️ Qualitative Palettes (", length(qual_palettes), "):\n")
#> 🏷️ Qualitative Palettes ( 4 ):
cat(paste(qual_palettes, collapse = ", "), "\n\n")
#> c("earthy_triad", "primary_triad", "softtrio", "vintage_triad", "balanced_quartet", "vibrant", "violin", "harmonysix", "pastel_harmony", "ggsci_jama", "ggsci_tron_legacy", "ggsci_nejm", "rcb_set2", "ggsci_lancet", "rcb_set1", "vividset", "ggsci_cosmic", "ggsci_flatui", "ggsci_jco", "ggsci_npg", "ggsci_futurama", "rcb_set3", "sc_pbmc"), c("qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative", "qualitative"), c(3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 12, 12, 17), list(c("#C64328", "#56BBA5", "#E3A727"), c("#C64328", "#2AA6C6", "#E3A727"), c("#E64B35B2", "#00A087B2", "#3C5488B2"), c("#96A0D9", "#D9BDAD", "#D9D5A0"), c("#5D83B4", "#9FD0E8", "#CDAE9D", "#959683"), c("#BF3F9D", "#B3BCD7", "#6DA6A0", "#D98A29", "#F2C894"), c("#37848C", "#F2935C", "#F2A88D", "#D95555", "#A7CAE9"), c("#BF3641", "#836AA6", "#377BA6", "#448C42", "#D96236", "#B79290"), c("#B2AA76", "#8C91CF", "#D7D79C", "#DABFAC", "#BCEDDB", "#C380A0"), c("#374E55", "#DF8F44", "#00A1D5", "#B24745",
#> "#79AF97", "#6A6599", "#80796B"), c("#FF410D", "#6EE2FF", "#F7C530", "#95CC5E", "#D0DFE6", "#F79D1E", "#748AA6"), c("#BC3C29", "#0072B5", "#E18727", "#20854E", "#7876B1", "#6F99AD", "#FFDC91", "#EE4C97"), c("#66C2A5", "#FC8D62", "#8DA0CB", "#E78AC3", "#A6D854", "#FFD92F", "#E5C494", "#B3B3B3"), c("#00468B", "#ED0000", "#42B540", "#0099B4", "#925E9F", "#FDAF91", "#AD002A", "#ADB6B6", "#1B1919"), c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999"), c("#E64B35",
#> "#4DBBD5", "#00A087", "#3C5488", "#F39B7F", "#8491B4", "#91D1C2", "#DC0000", "#7E6148"), c("#2E2A2B", "#CF4E9C", "#8C57A2", "#358DB9", "#82581F", "#2F509E", "#E5614C", "#97A1A7", "#3DA873", "#DC9445"), c("#c0392b", "#d35400", "#f39c12", "#27ae60", "#16a085", "#2980b9", "#8e44ad", "#2c3e50", "#7f8c8d", "#bdc3c7"), c("#0073C2", "#EFC000", "#868686", "#CD534C", "#7AA6DC", "#003C67", "#8F7700", "#3B3B3B", "#A73030", "#4A6990"), c("#E64B35", "#4DBBD5", "#00A087", "#3C5488", "#F39B7F", "#8491B4", "#91D1C2",
#> "#DC0000", "#7E6148", "#B09C85"), c("#FF6F00", "#C71000", "#008EA0", "#8A4198", "#5A9599", "#FF6348", "#84D7E1", "#FF95A8", "#3D3B25", "#ADE2D0", "#1A5354", "#3F4041"), c("#8DD3C7", "#FFFFB3", "#BEBADA", "#FB8072", "#80B1D3", "#FDB462", "#B3DE69", "#FCCDE5", "#D9D9D9", "#BC80BD", "#CCEBC5", "#FFED6F"), c("#a2d2e7", "#67a8cd", "#ffc17f", "#cf9f88", "#6fb3a8", "#b3e19b", "#50aa4b", "#ff9d9f", "#f36569", "#3581b7", "#cdb6da", "#704ba3", "#9a7fbd", "#dba9a8", "#e40300", "#e99b78", "#ff8831"))
cat("↔️ Diverging Palettes (", length(div_palettes), "):\n")
#> ↔️ Diverging Palettes ( 4 ):
cat(paste(div_palettes, collapse = ", "), "\n")
#> c("contrast_duo", "fire_ice_duo", "polar_duo", "sunset_sky", "piyg", "earthy_diverge", "gradient_rd_bu"), c("diverging", "diverging", "diverging", "diverging", "diverging", "diverging", "diverging"), c(2, 2, 2, 2, 3, 5, 11), list(c("#C64328", "#56BBA5"), c("#2AA6C6", "#C64328"), c("#8CB5D2", "#E18E8F"), c("#57A2FF", "#FF8000"), c("#E64B35B2", "#00A087B2", "#3C5488B2"), c("#283618", "#606C38", "#FEFAE0", "#DDA15E", "#BC6C25"), c("#67001f", "#b2182b", "#d6604d", "#f4a582", "#fddbc7", "#f7f7f7", "#d1e5f0", "#92c5de", "#4393c3", "#2166ac", "#053061"))
Interactive Palette Gallery
# Display the complete palette gallery
bio_palette_gallery()
#> ℹ Type sequential: 5 palettes \u2192 1 page(s)

Complete gallery of all available palettes organized by type
#> ✔ Rendered 'sequential' page 1 of 1
#> ℹ Type diverging: 7 palettes \u2192 1 page(s)

Complete gallery of all available palettes organized by type
#> ✔ Rendered 'diverging' page 1 of 1
#> ℹ Type qualitative: 23 palettes \u2192 1 page(s)

Complete gallery of all available palettes organized by type
#> ✔ Rendered 'qualitative' page 1 of 1
🔍 Working with Individual Palettes
Getting Specific Palettes
# Get qualitative palette with default number of colors
vivid_default <- get_palette("vividset", type = "qualitative")
#> ✔ Loaded palette "vividset" ("qualitative"), 9 colors
cat("Vivid palette (default):\n")
#> Vivid palette (default):
print(vivid_default)
#> [1] "#E64B35" "#4DBBD5" "#00A087" "#3C5488" "#F39B7F" "#8491B4" "#91D1C2"
#> [8] "#DC0000" "#7E6148"
# Get specific number of colors from sequential palette
blues_3 <- get_palette("blues", type = "sequential", n = 3)
#> ✔ Loaded palette "blues" ("sequential"), 3 colors
cat("\nBlues palette (3 colors):\n")
#>
#> Blues palette (3 colors):
print(blues_3)
#> [1] "#deebf7" "#9ecae1" "#3182bd"
# Get all available colors from a palette (just omit n parameter)
blues_all <- get_palette("blues", type = "sequential")
#> ✔ Loaded palette "blues" ("sequential"), 3 colors
cat("\nBlues palette (all", length(blues_all), "colors):\n")
#>
#> Blues palette (all 3 colors):
print(blues_all)
#> [1] "#deebf7" "#9ecae1" "#3182bd"
Preview Individual Palettes
# 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")
#> ✔ Loaded palette "vividset" ("qualitative"), 9 colors
#>
#> ── Previewing palette: "vividset" ──
#>
#> ℹ Plot type: "bar", colors: 9
title("Qualitative: VividSet", cex.main = 1.2, col.main = "#0D47A1")
# Sequential palette preview
preview_palette("blues", type = "sequential")
#> ✔ Loaded palette "blues" ("sequential"), 3 colors
#>
#> ── Previewing palette: "blues" ──
#>
#> ℹ Plot type: "bar", colors: 3
title("Sequential: Blues", cex.main = 1.2, col.main = "#0D47A1")
# Another sequential palette
preview_palette("warm_blush", type = "sequential")
#> ✔ Loaded palette "warm_blush" ("sequential"), 4 colors
#>
#> ── Previewing palette: "warm_blush" ──
#>
#> ℹ Plot type: "bar", colors: 4
title("Sequential: Warm Blush", cex.main = 1.2, col.main = "#0D47A1")
# Diverging palette preview
preview_palette("gradient_rd_bu", type = "diverging")
#> ✔ Loaded palette "gradient_rd_bu" ("diverging"), 11 colors
#>
#> ── Previewing palette: "gradient_rd_bu" ──
#>
#> ℹ Plot type: "bar", colors: 11
title("Diverging: Red-Blue Gradient", cex.main = 1.2, col.main = "#0D47A1")

Preview of different palette types with color swatches
# Restore previous par settings
par(oldpar)
🛠️ Creating Custom Palettes
Basic Custom Palette Creation
# 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")
#> Custom palette examples:
cat("Modern vivid:", paste(modern_colors, collapse = ", "), "\n")
#> Modern vivid: #FF6B6B, #4ECDC4, #45B7D1, #96CEB4, #FFEAA7
cat("Nature gradient:", paste(nature_colors, collapse = ", "), "\n")
#> Nature gradient: #2E7D32, #66BB6A, #A5D6A7, #E8F5E8
cat("Corporate blue:", paste(corporate_colors, collapse = ", "), "\n")
#> Corporate blue: #0D47A1, #1976D2, #42A5F5, #90CAF9, #E3F2FD
Color Space Utilities
# Convert between HEX and RGB formats
hex_colors <- c("#FF6B6B", "#4ECDC4", "#45B7D1")
# HEX to RGB conversion
rgb_matrix <- hex2rgb(hex_colors)
#> ✔ Converted 3 HEX values to RGB.
#> ℹ #FF6B6B -> RGB: c(255, 107, 107)
#> ℹ #4ECDC4 -> RGB: c(78, 205, 196)
#> ℹ #45B7D1 -> RGB: c(69, 183, 209)
cat("HEX to RGB conversion:\n")
#> HEX to RGB conversion:
print(rgb_matrix)
#> $`#FF6B6B`
#> r g b
#> 255 107 107
#>
#> $`#4ECDC4`
#> r g b
#> 78 205 196
#>
#> $`#45B7D1`
#> r g b
#> 69 183 209
# RGB back to HEX conversion
hex_back <- rgb2hex(rgb_matrix)
#> ✔ Converted 3 RGB values to HEX.
#> ℹ RGB: c(255, 107, 107) → HEX: #FF6B6B
#> ℹ RGB: c(78, 205, 196) → HEX: #4ECDC4
#> ℹ RGB: c(69, 183, 209) → HEX: #45B7D1
cat("\nRGB back to HEX:\n")
#>
#> RGB back to HEX:
print(hex_back)
#> #FF6B6B #4ECDC4 #45B7D1
#> "#FF6B6B" "#4ECDC4" "#45B7D1"
# Verify round-trip conversion
cat("\nRound-trip verification:\n")
#>
#> Round-trip verification:
print(data.frame(
Original = hex_colors,
Converted = hex_back,
Match = hex_colors == hex_back
))
#> Original Converted Match
#> #FF6B6B #FF6B6B #FF6B6B TRUE
#> #4ECDC4 #4ECDC4 #4ECDC4 TRUE
#> #45B7D1 #45B7D1 #45B7D1 TRUE
📊 Practical Applications in Visualization
Qualitative Palettes for Categorical Data
# 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)
#> ✔ Loaded palette "vividset" ("qualitative"), 9 colors
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)

Demonstration of qualitative palettes for categorical data visualization
Sequential Palettes for Continuous Data
# 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)
#> ✔ Loaded palette "ggsci_locuszoom" ("sequential"), 7 colors
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()
#> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
#> ℹ Please use `linewidth` instead.
#> This warning is displayed once every 8 hours.
#> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
#> generated.
print(p2)

Sequential palette demonstration with heatmap-style visualization
Diverging Palettes for Centered Data
# 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)
#> ✔ Loaded palette "gradient_rd_bu" ("diverging"), 11 colors
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)

Diverging palette showing data with meaningful center point
🔬 Bioinformatics-Specific Applications
Palette Selection Guidelines
cat("🧬 BIOINFORMATICS PALETTE GUIDELINES\n")
#> 🧬 BIOINFORMATICS PALETTE GUIDELINES
cat("=====================================\n\n")
#> =====================================
cat("📊 For Gene Expression Data:\n")
#> 📊 For Gene Expression Data:
cat(" • Sequential: Use 'blues', 'greens', or 'oranges'\n")
#> • Sequential: Use 'blues', 'greens', or 'oranges'
cat(" • Diverging: Use 'gradient_rd_bu' or 'earthy_diverge' for fold changes\n\n")
#> • Diverging: Use 'gradient_rd_bu' or 'earthy_diverge' for fold changes
cat("🔬 For Pathway Analysis:\n")
#> 🔬 For Pathway Analysis:
cat(" • Qualitative: Use 'vividset' or 'softpastel' for pathways\n")
#> • Qualitative: Use 'vividset' or 'softpastel' for pathways
cat(" • Sequential: Use 'purples' for p-value gradients\n\n")
#> • Sequential: Use 'purples' for p-value gradients
cat("🎯 For Multi-omics Data:\n")
#> 🎯 For Multi-omics Data:
cat(" • Qualitative: Use 'brightcontrast' for distinct data types\n")
#> • Qualitative: Use 'brightcontrast' for distinct data types
cat(" • Avoid red/green combinations for colorblind accessibility\n\n")
#> • Avoid red/green combinations for colorblind accessibility
cat("📈 For Time Course Data:\n")
#> 📈 For Time Course Data:
cat(" • Sequential: Use 'blues' or 'teals' for temporal progression\n")
#> • Sequential: Use 'blues' or 'teals' for temporal progression
cat(" • Qualitative: Use 'vividset' for treatment groups\n")
#> • Qualitative: Use 'vividset' for treatment groups
Example: Multi-omics Visualization
# 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)
#> ✔ Loaded palette "vividset" ("qualitative"), 9 colors
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)

Multi-omics data visualization using appropriate color palettes
🎨 Advanced Palette Techniques
Palette Interpolation and Blending
# Create custom gradient using palette interpolation
base_colors <- get_palette("vividset", type = "qualitative", n = 3)
#> ✔ Loaded palette "vividset" ("qualitative"), 9 colors
# 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)

Advanced color techniques: interpolation and custom gradients
📋 Best Practices and Recommendations
Accessibility Considerations
cat("♿ ACCESSIBILITY & BEST PRACTICES\n")
#> ♿ ACCESSIBILITY & BEST PRACTICES
cat("================================\n\n")
#> ================================
cat("🌈 Color Vision Considerations:\n")
#> 🌈 Color Vision Considerations:
cat(" • Test palettes with colorblind simulators\n")
#> • Test palettes with colorblind simulators
cat(" • Avoid relying solely on red/green distinctions\n")
#> • Avoid relying solely on red/green distinctions
cat(" • Use high contrast ratios (minimum 3:1)\n")
#> • Use high contrast ratios (minimum 3:1)
cat(" • Consider texture/pattern alternatives\n\n")
#> • Consider texture/pattern alternatives
cat("📱 Multi-Platform Compatibility:\n")
#> 📱 Multi-Platform Compatibility:
cat(" • Test on different displays (mobile, print, projector)\n")
#> • Test on different displays (mobile, print, projector)
cat(" • Use sufficient color separation for small elements\n")
#> • Use sufficient color separation for small elements
cat(" • Consider grayscale conversion compatibility\n\n")
#> • Consider grayscale conversion compatibility
cat("📊 Data Visualization Guidelines:\n")
#> 📊 Data Visualization Guidelines:
cat(" • Match palette type to data type (sequential/categorical)\n")
#> • Match palette type to data type (sequential/categorical)
cat(" • Limit qualitative palettes to 8-10 distinct categories\n")
#> • Limit qualitative palettes to 8-10 distinct categories
cat(" • Use consistent color meaning across related plots\n")
#> • Use consistent color meaning across related plots
cat(" • Reserve bright colors for important data points\n")
#> • Reserve bright colors for important data points
Performance Optimization
cat("⚡ PERFORMANCE OPTIMIZATION TIPS\n")
#> ⚡ PERFORMANCE OPTIMIZATION TIPS
cat("===============================\n\n")
#> ===============================
cat("🚀 Efficient Palette Usage:\n")
#> 🚀 Efficient Palette Usage:
cat(" • Cache frequently used palettes in variables\n")
#> • Cache frequently used palettes in variables
cat(" • Use specific n= parameter to avoid unused colors\n")
#> • Use specific n= parameter to avoid unused colors
cat(" • Pre-compile custom palettes for repeated use\n\n")
#> • Pre-compile custom palettes for repeated use
# Demonstrate efficient palette caching
cat("Example of efficient palette caching:\n")
#> Example of efficient palette caching:
cat("# Good: Cache palette once\n")
#> # Good: Cache palette once
cat("my_colors <- get_palette('vividset', type = 'qualitative', n = 5)\n")
#> my_colors <- get_palette('vividset', type = 'qualitative', n = 5)
cat("# Then reuse: scale_fill_manual(values = my_colors)\n\n")
#> # Then reuse: scale_fill_manual(values = my_colors)
cat("# Avoid: Repeated palette calls\n")
#> # Avoid: Repeated palette calls
cat("# scale_fill_manual(values = get_palette('vividset', ...))\n")
#> # scale_fill_manual(values = get_palette('vividset', ...))
🔧 Troubleshooting Common Issues
Common Problems and Solutions
cat("🛠️ TROUBLESHOOTING GUIDE\n")
#> 🛠️ TROUBLESHOOTING GUIDE
cat("=======================\n\n")
#> =======================
cat("❌ Issue: 'Palette not found' error\n")
#> ❌ Issue: 'Palette not found' error
cat("✅ Solution: Check available palettes with list_palettes()\n\n")
#> ✅ Solution: Check available palettes with list_palettes()
cat("❌ Issue: Not enough colors in palette\n")
#> ❌ Issue: Not enough colors in palette
cat("✅ Solution: Use n='all' or choose different palette\n\n")
#> ✅ Solution: Use n='all' or choose different palette
cat("❌ Issue: Colors don't match expected output\n")
#> ❌ Issue: Colors don't match expected output
cat("✅ Solution: Verify palette type (sequential/qualitative/diverging)\n\n")
#> ✅ Solution: Verify palette type (sequential/qualitative/diverging)
cat("❌ Issue: Custom palette not saving\n")
#> ❌ Issue: Custom palette not saving
cat("✅ Solution: Check write permissions and file paths\n\n")
#> ✅ Solution: Check write permissions and file paths
# 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")
})
#> ✔ Loaded palette "vividset" ("qualitative"), 9 colors
#> ✅ Successfully retrieved vividset palette
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")
})
#> ❌ Expected error for nonexistent palette: Palette "nonexistent" not found in any type.
🎯 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 - Complete package overview
- 📊 Data Processing - Data manipulation techniques
- 🧬 Bioinformatics Workflows - Domain-specific applications
Quick Reference:
# 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!