bio-data-visualization-color-palettes
Select colormaps and qualitative palettes for scientific figures using perceptual-uniformity, color-vision-deficiency safety, and luminance-monotonicity criteria. Covers Crameri scientific colormaps, viridis/cividis/magma, Okabe-Ito categorical, ColorBrewer, and the rainbow/jet critique. Use when choosing palettes for heatmaps, scatter, networks, or any encoding where color carries quantitative or categorical meaning.
What this skill does
## Version Compatibility
Reference examples tested with: viridis 0.6+, RColorBrewer 1.1+, scico 1.5+ (Crameri colormaps in R), khroma 1.12+ (Tol/Crameri palettes in R), matplotlib 3.8+, colorcet 3.0+, ggsci 3.0+, colorspace 2.1+.
Before using code patterns, verify installed versions match. If versions differ:
- Python: `pip show <package>` then `help(module.function)` to check signatures
- R: `packageVersion('<pkg>')` then `?function_name` to verify parameters
If code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying.
# Color Palettes for Scientific Visualization
**"Pick a color palette"** -> Choose a colormap that (a) is perceptually uniform along the relevant data axis, (b) remains interpretable under common color-vision deficiencies, (c) prints correctly to grayscale, and (d) matches the data type — sequential, diverging, cyclic, or qualitative.
- R: `viridis::viridis`, `scico::scale_color_scico`, `khroma::color`, `RColorBrewer::brewer.pal`
- Python: `matplotlib.colormaps`, `colorcet`, `seaborn.color_palette`, `cmcrameri.cm`
## The Three Modern Standards
1. **Perceptual uniformity** -- equal data steps produce equal perceived color steps. viridis (van der Walt 2015), cividis (Nuñez 2018), and the Crameri family (batlow, roma, vik) are designed for this. Jet, rainbow, and red->green are not.
2. **Color vision deficiency safety** -- ~6% of males have deuteranopia / protanopia (red-green deficiency). cividis was explicitly designed to be near-identical under normal and CVD viewing (Nuñez 2018 *PLOS ONE* 13:e0199239). The Okabe-Ito 8-color qualitative palette (popularized in Wong 2011 *Nat Methods* 8:441) is the CVD-safe categorical default.
3. **Grayscale monotonicity** -- a perceptually-uniform sequential colormap has monotonically increasing luminance. Convert the figure to grayscale; if the order is still readable, the colormap is luminance-monotonic. This is the single most actionable test.
## Palette Type by Data Type
| Data type | Use | Avoid |
|-----------|-----|-------|
| Sequential (expression, coverage, density) | viridis, magma, cividis, batlow, lipari | jet, rainbow, hsv |
| Diverging (log fold change, z-score, signed correlation) | vik, roma, RdBu, BrBG, PiYG | jet, rainbow |
| Cyclic (phase, time-of-day, angle) | romaO, vikO, twilight | linear sequential (wrap creates artifactual jump) |
| Categorical (≤8 groups) | Okabe-Ito (Wong 2011), Tol bright, Dark2 | rainbow with N=20, Set1 if CVD matters |
| Categorical (9-20 groups) | tab20, Paired, Polychrome | too-many categorical hues -- consider faceting |
| Categorical (>20) | None -- reconsider design | More colors will not help |
## The Crameri Scientific Colormaps
Crameri 2020 *Nat Commun* 11:5444 documented the prevalence of misleading palettes (rainbow, red-green) across published science and released a family of perceptually-uniform CVD-safe colormaps via Zenodo (doi:10.5281/zenodo.8409685). Key entries:
| Crameri name | Type | Use case |
|--------------|------|----------|
| `batlow` | sequential | Default jet replacement; runs through dark-blue -> ochre -> light-yellow |
| `lipari` | sequential | Higher-saturation alternative; better for projection |
| `vik` | diverging | Blue -> white -> red equivalent, perceptually uniform |
| `roma` | diverging | Slightly warmer than vik |
| `bam` | diverging | Brown -> white -> green |
| `romaO` | cyclic | Phase, time-of-day, angle data |
| `vikO` | cyclic | Diverging cyclic |
```r
library(scico)
# Sequential
ggplot(df, aes(x, y, fill = value)) + geom_tile() +
scale_fill_scico(palette = 'batlow')
# Diverging
ggplot(df, aes(x, y, fill = lfc)) + geom_tile() +
scale_fill_scico(palette = 'vik', midpoint = 0)
```
```python
from cmcrameri import cm
import matplotlib.pyplot as plt
plt.imshow(data, cmap=cm.batlow) # sequential
plt.imshow(data, cmap=cm.vik, vmin=-vmax, vmax=vmax) # diverging, symmetric
```
## viridis Family (matplotlib default since 3.0)
```r
library(viridis)
scale_color_viridis_c(option = 'viridis') # default: dark blue -> yellow
scale_color_viridis_c(option = 'magma') # black -> red -> yellow
scale_color_viridis_c(option = 'inferno') # black -> purple -> yellow
scale_color_viridis_c(option = 'plasma') # purple -> pink -> yellow
scale_color_viridis_c(option = 'cividis') # CVD-optimized
scale_color_viridis_c(option = 'turbo') # jet-like but perceptually uniform
```
```python
plt.imshow(data, cmap='viridis') # 'magma', 'inferno', 'plasma', 'cividis', 'turbo'
```
**cividis is the only viridis-family colormap optimized for CVD.** Use it for any figure intended to remain interpretable under deuteranopia/protanopia.
## Okabe-Ito Categorical Palette (Wong 2011)
The 8-color CVD-safe categorical palette. Memorize the hexes:
```r
okabe_ito <- c(
'#E69F00', # orange
'#56B4E9', # sky blue
'#009E73', # bluish green
'#F0E442', # yellow
'#0072B2', # blue
'#D55E00', # vermilion
'#CC79A7', # reddish purple
'#000000' # black
)
scale_color_manual(values = okabe_ito)
```
Available as `palette.colors(8, 'Okabe-Ito')` in R 4.0+, `scale_color_manual(values = palette.colors(8, 'Okabe-Ito'))`. In matplotlib, `colorblind` style or manual hex list.
For DE plots, the canonical assignment is Up = `#D55E00` (vermilion), Down = `#0072B2` (blue), NS = `#999999` (grey).
## ColorBrewer (Harrower & Brewer 2003)
```r
library(RColorBrewer)
display.brewer.all() # interactive palette browser
display.brewer.all(colorblindFriendly = TRUE) # CVD-safe subset only
brewer.pal(n = 8, name = 'Dark2') # qualitative
brewer.pal(n = 9, name = 'YlOrRd') # sequential
brewer.pal(n = 11, name = 'RdBu') # diverging
```
ColorBrewer's CVD-safe sequential and diverging palettes are publication-defaults. For qualitative beyond 8 colors, switch to Tol/Polychrome — ColorBrewer qualitative tops out at 12 (Set3).
## Scientific Journal Brand Palettes
```r
library(ggsci)
scale_color_npg() # Nature Publishing Group
scale_color_aaas() # Science (AAAS)
scale_color_lancet() # Lancet
scale_color_jama() # JAMA
scale_color_jco() # JCO
scale_color_nejm() # NEJM
```
These are CVD-imperfect — use journal palettes for stylistic compliance, not for accessibility. Verify by colorblindness simulation (below).
## CVD Simulation -- The Mandatory Check
```r
library(colorspace)
# Simulate deuteranopia / protanopia on a palette
cvd_emulator(palette, type = 'deutan')
cvd_emulator(palette, type = 'protan')
cvd_emulator(palette, type = 'tritan')
# Visual side-by-side
demoplot(palette, type = 'heatmap')
```
```python
# colorspacious provides CVD simulation
from colorspacious import cspace_converter
# or use a CVD-safe palette by construction (cividis, Okabe-Ito, Crameri)
```
If a palette is unreadable under deutan simulation, do not use it for accessible figures. Period.
## Grayscale Monotonicity Test
```r
library(scales)
show_col(viridis(10)) # full color
show_col(grey(seq(0, 1, length = 10))) # equivalent grayscale gradient
```
In practice: save the figure as PNG, open in an image editor, desaturate. If the data order is still readable, the colormap is luminance-monotonic. If it shows arbitrary "rings" or "bands," the colormap is non-monotonic — fix before submitting.
Rainbow / jet fails this test catastrophically. viridis and cividis pass.
## Diverging Palette Setup (LFC, z-score)
```r
library(circlize)
col_fun <- colorRamp2(c(-2, 0, 2), c('#0072B2', 'white', '#D55E00'))
# Symmetric around 0; ALWAYS use symmetric bounds for signed data
```
```python
import matplotlib.pyplot as plt
plt.imshow(data, cmap='RdBu_r', vmin=-2, vmax=2) # symmetric
# do NOT use vmin=data.min(), vmax=data.max() for diverging data
```
The most common diverging-palette error is asymmetric bounds (`vmin=min, vmax=max`) which mis-aligns zero with tRelated in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.