Color Palettes
Palette Types
Type Use Case Example
Sequential Continuous data (expression, coverage) viridis, Blues
Diverging Centered data (fold change, z-score) RdBu, coolwarm
Qualitative Categories (clusters, conditions) Set1, tab10
viridis (Colorblind-Safe)
library(viridis)
Continuous scale
ggplot(df, aes(x, y, color = value)) + geom_point() + scale_color_viridis_c()
Discrete scale
ggplot(df, aes(x, y, color = group)) + geom_point() + scale_color_viridis_d()
Options: viridis, magma, plasma, inferno, cividis, turbo
scale_color_viridis_c(option = 'magma')
import matplotlib.pyplot as plt
plt.scatter(x, y, c=values, cmap='viridis')
Options: viridis, magma, plasma, inferno, cividis
RColorBrewer (R)
library(RColorBrewer)
View all palettes
display.brewer.all()
Sequential
scale_fill_brewer(palette = 'Blues') scale_color_distiller(palette = 'YlOrRd', direction = 1)
Diverging
scale_fill_brewer(palette = 'RdBu') scale_color_gradient2(low = '#4DBBD5', mid = 'white', high = '#E64B35', midpoint = 0)
Qualitative
scale_color_brewer(palette = 'Set1') scale_fill_brewer(palette = 'Dark2')
Get colors directly
brewer.pal(n = 5, name = 'Set1')
matplotlib/seaborn (Python)
import matplotlib.pyplot as plt import seaborn as sns
Sequential
plt.scatter(x, y, c=values, cmap='Blues')
Diverging
plt.scatter(x, y, c=values, cmap='RdBu_r', vmin=-2, vmax=2)
Qualitative
palette = sns.color_palette('Set1', n_colors=5) sns.scatterplot(x=x, y=y, hue=group, palette='Set1')
Custom palette
custom_palette = {'Control': '#4DBBD5', 'Treatment': '#E64B35'} sns.scatterplot(x=x, y=y, hue=group, palette=custom_palette)
Scientific Journal Palettes
library(ggsci)
Nature Publishing Group
scale_color_npg() scale_fill_npg()
AAAS Science
scale_color_aaas()
Lancet
scale_color_lancet()
JAMA
scale_color_jama()
JCO
scale_color_jco()
Custom Palettes
Define custom colors
my_colors <- c( 'Control' = '#4DBBD5', 'Treatment' = '#E64B35', 'Vehicle' = '#00A087' )
scale_color_manual(values = my_colors) scale_fill_manual(values = my_colors)
Create gradient
colorRampPalette(c('blue', 'white', 'red'))(100)
from matplotlib.colors import LinearSegmentedColormap
colors = ['#4DBBD5', 'white', '#E64B35'] cmap = LinearSegmentedColormap.from_list('custom_diverging', colors) plt.imshow(data, cmap=cmap)
Heatmap Colors
library(circlize)
For ComplexHeatmap
col_fun <- colorRamp2(c(-2, 0, 2), c('#4DBBD5', 'white', '#E64B35'))
For pheatmap
pheatmap(mat, color = colorRampPalette(rev(brewer.pal(9, 'RdBu')))(100))
import seaborn as sns
sns.heatmap(data, cmap='RdBu_r', center=0, vmin=-2, vmax=2)
Colorblind Simulation
library(colorspace)
Check if palette is colorblind safe
demoplot(rainbow(5), type = 'map') demoplot(viridis(5), type = 'map')
Simulate colorblindness
cvd_colors <- deutan(c('#E64B35', '#4DBBD5', '#00A087')) # deuteranopia cvd_colors <- protan(c('#E64B35', '#4DBBD5', '#00A087')) # protanopia
Recommended Palettes
Data Type Recommended Avoid
Expression heatmap RdBu (diverging) Rainbow
Categories (<8) Set1, Dark2, npg Too many colors
Categories (>8) tab20, Paired Qualitative sets
Continuous viridis, plasma Jet, rainbow
p-values viridis (reversed) Red-green
Transparency
Add alpha
scale_color_manual(values = alpha(c('#E64B35', '#4DBBD5'), 0.7))
In geom
geom_point(alpha = 0.6)
Add alpha to hex
def add_alpha(hex_color, alpha): return hex_color + format(int(alpha * 255), '02x')
color_with_alpha = add_alpha('#E64B35', 0.7)
In scatter
plt.scatter(x, y, c='#E64B35', alpha=0.7)
Extract Colors from Palette
Get discrete colors
pal <- brewer.pal(8, 'Set1') pal[1:3] # First 3 colors
Interpolate more colors
colorRampPalette(brewer.pal(8, 'Set1'))(20)
import seaborn as sns
palette = sns.color_palette('Set1', n_colors=8) palette[:3] # First 3 colors
As hex
palette.as_hex()
Related Skills
-
data-visualization/ggplot2-fundamentals - Apply colors
-
data-visualization/heatmaps-clustering - Heatmap colors
-
data-visualization/specialized-omics-plots - Plot styling