agentsclimarketplace

Bio data visualization color palettes skills color palettes

Skill bg-szy/TOP-SKILLS/skills/awesome-skills/bio-data-visualization-color-palettes__skills-color-palettes

全球最大的 Claude Code 技能聚合库 · 收录 3900+ 来自 12+ 来源的技能,提供在线搜索与趋势分析看板 / The world's largest Claude Code skill aggregation hub — 3900+ skills from 12+ sources with online search and trend dashboard

Install
npx -y skills add bg-szy/TOP-SKILLS --skill bio-data-visualization-color-palettes__skills-color-palettes

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

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.

SKILL.md

14.2 KB, as published. Nobody here has run it

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 typeUseAvoid
Sequential (expression, coverage, density)viridis, magma, cividis, batlow, liparijet, rainbow, hsv
Diverging (log fold change, z-score, signed correlation)vik, roma, RdBu, BrBG, PiYGjet, rainbow
Cyclic (phase, time-of-day, angle)romaO, vikO, twilightlinear sequential (wrap creates artifactual jump)
Categorical (≤8 groups)Okabe-Ito (Wong 2011), Tol bright, Dark2rainbow with N=20, Set1 if CVD matters
Categorical (9-20 groups)tab20, Paired, Polychrometoo-many categorical hues -- consider faceting
Categorical (>20)None -- reconsider designMore 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 nameTypeUse case
batlowsequentialDefault jet replacement; runs through dark-blue -> ochre -> light-yellow
liparisequentialHigher-saturation alternative; better for projection
vikdivergingBlue -> white -> red equivalent, perceptually uniform
romadivergingSlightly warmer than vik
bamdivergingBrown -> white -> green
romaOcyclicPhase, time-of-day, angle data
vikOcyclicDiverging cyclic
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)
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)

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
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:

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)

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

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

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')
# 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

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)

library(circlize)
col_fun <- colorRamp2(c(-2, 0, 2), c('#0072B2', 'white', '#D55E00'))
# Symmetric around 0; ALWAYS use symmetric bounds for signed data
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 the white midpoint.

Custom Palette Construction

# Discrete categorical
my_palette <- c('Control' = '#0072B2', 'Treatment' = '#D55E00', 'Vehicle' = '#009E73')
scale_color_manual(values = my_palette)

# Continuous gradient between custom colors
colorRampPalette(c('#0072B2', 'white', '#D55E00'))(100)
from matplotlib.colors import LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list('cvd_div', ['#0072B2', '#FFFFFF', '#D55E00'])

When building a custom diverging palette: pick endpoints with similar luminance (so neither side dominates), pass through pure white at the midpoint (NOT light gray), and verify with the grayscale test.

Common Failure Modes

Asymmetric bounds on diverging data

Trigger: vmin=data.min(), vmax=data.max() on signed data with skewed distribution.

Mechanism: Zero no longer maps to the midpoint (white) of the diverging palette.

Symptom: Half the cells visually look "below zero" but are actually positive; reviewer confusion.

Fix: vmax = max(abs(data.min()), abs(data.max())); then vmin = -vmax. Or pre-clip data to a fixed range.

Categorical palette with too many colors

Trigger: 15+ groups all on one colormap.

Mechanism: Human color discrimination saturates around 8-10 distinct hues.

Symptom: Groups look identical; legend has no information value.

Fix: Facet by category, or aggregate small groups into "Other," or use a categorical+marker-shape combination.

Rainbow / jet still in use

Trigger: Default colormaps in older matplotlib (<2.0), MATLAB-derived code, or colorRampPalette(rainbow(...)).

Mechanism: Rainbow has non-monotonic luminance and includes a perceptual "yellow band" that creates artifactual boundaries.

Symptom: Figures show banding that doesn't exist in the data; CVD viewers cannot interpret.

Fix: Migrate to viridis (sequential) or vik/roma (diverging). For nostalgic jet-like appearance with perceptual properties, use turbo (matplotlib 3.3+).

Light gray midpoint instead of pure white

Trigger: colorRamp2(c(-2, 0, 2), c('blue', '#EEEEEE', 'red')).

Mechanism: Light gray reads as "weakly significant" rather than zero — the visual "where is zero" anchor is lost.

Symptom: Zero values appear muted, drawing the eye away from the actual midpoint.

Fix: Use pure white '#FFFFFF' or 'white' at the midpoint.

Wrong cmap for non-numeric data

Trigger: Continuous colormap applied to a categorical variable (e.g., cluster ID as a continuous gradient).

Mechanism: Cluster IDs are nominal — ordering is meaningless; gradient implies false ordering.

Symptom: Cluster 2 "looks closer to" cluster 1 than cluster 8, but the cluster numbering is arbitrary.

Fix: Use a qualitative categorical palette (Okabe-Ito ≤8; tab20 for more).

CVD-unsafe palette in a CVD-sensitive figure

Trigger: Red-green Set1 in a clinical figure intended for broad audience.

Mechanism: ~6% of male readers cannot distinguish red from green.

Symptom: Reviewer or colleague reports the figure is unreadable.

Fix: Pre-flight with colorspace::cvd_emulator; switch to Okabe-Ito for categorical, cividis for sequential.

Quantitative Thresholds

ThresholdValueSource
Max distinguishable categorical hues8-10Wong 2011; perceptual research
CVD prevalence (males of European descent)~6% deutan/protan, ~0.5% tritanVarious; Nuñez 2018 cites figures
Diverging midpointpure white (#FFFFFF)Not light gray; preserves zero anchor
Crameri batlow / lipari -- general-purpose sequentialCrameri 2020
cividis -- CVD-optimal sequentialNuñez 2018
Okabe-Ito -- 8-color qualitative CVD-safeWong 2011

Common Errors

Error / symptomCauseSolution
Diverging plot with zero not at whiteAsymmetric boundsUse symmetric vmin = -vmax
Rainbow "bands" visible in heatmapNon-monotonic luminance of rainbowReplace with viridis or turbo
Categorical plot with indistinguishable groupsToo many huesFacet, aggregate, or shape+color
CVD viewer reports unreadable figureRed-green paletteSwitch to Okabe-Ito or cividis
Light gray at diverging midpointWrong center colorUse pure white
Grayscale conversion shows bandingNon-luminance-monotonic colormapUse viridis family or Crameri
Heatmap with one cell saturating the scaleNo quantile clippingSee data-visualization/heatmaps-clustering for robust bounds

References

  • Crameri F, Shephard GE, Heron PJ. 2020. The misuse of colour in science communication. Nat Commun 11:5444. doi:10.1038/s41467-020-19160-7
  • Harrower M, Brewer CA. 2003. ColorBrewer.org: an online tool for selecting colour schemes for maps. Cartogr J 40(1):27-37.
  • Nuñez JR, Anderton CR, Renslow RS. 2018. Optimizing colormaps with consideration for color vision deficiency to enable accurate interpretation of scientific data. PLOS ONE 13(7):e0199239.
  • Borland D, Taylor RM II. 2007. Rainbow color map (still) considered harmful. IEEE Comput Graph Appl 27(2):14-17.
  • Light A, Bartlein PJ. 2004. The end of the rainbow? Color schemes for improved data graphics. Eos Trans AGU 85(40):385,391.
  • Wong B. 2010. Points of view: Color coding. Nat Methods 7(8):573.
  • Wong B. 2011. Points of view: Color blindness. Nat Methods 8(6):441.
  • Gehlenborg N, Wong B. 2012. Points of view: Mapping quantitative data to color. Nat Methods 9(8):769.

Related Skills

  • data-visualization/heatmaps-clustering - Robust diverging bounds for heatmaps
  • data-visualization/volcano-and-ma-plots - Okabe-Ito Up/Down/NS conventions
  • data-visualization/ggplot2-fundamentals - Applying palettes in ggplot2 scales
  • data-visualization/dimensionality-reduction-plots - Categorical palette for cluster labels

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.