ggplot2 scale_color_viridis() in R: Perceptually Uniform Colors
The viridis family in ggplot2 (scale_color_viridis_c() and scale_color_viridis_d()) provides perceptually uniform color palettes that look good in print, are colorblind-friendly, and work across any number of categories.
+ scale_color_viridis_c() # continuous + scale_color_viridis_d() # discrete + scale_color_viridis_c(option = "magma") + scale_fill_viridis_c() # fill aesthetic + scale_color_brewer() # palette alternative
Need explanation? Read on for examples and pitfalls.
What scale_color_viridis() does in one sentence
The viridis family applies one of several perceptually uniform palettes (viridis, magma, plasma, inferno, cividis, mako, rocket, turbo) to either continuous (_c) or discrete (_d) color aesthetics.
Syntax
scale_color_viridis_c(option = "viridis", direction = 1, ...). _d for discrete; _b for binned.
Five common patterns
1. Continuous viridis
2. Discrete viridis
3. Different option
Options: viridis (default), magma, plasma, inferno, cividis, mako, rocket, turbo.
4. Reverse direction
5. Fill version
scale_color_viridis_c() vs scale_color_brewer() vs scale_color_gradient()
| Function | Continuous | Discrete | Colorblind-safe |
|---|---|---|---|
scale_color_viridis_c() |
Yes | No | Yes |
scale_color_viridis_d() |
No | Yes | Yes |
scale_color_brewer() |
No (use distiller) | Yes | Some palettes |
scale_color_gradient() |
Yes | No | Depends |
When to use which:
- viridis_c for continuous (heatmaps, gradient).
- viridis_d for discrete (groups).
- brewer for small qualitative groups (3-8).
A practical workflow
Use viridis as default for any continuous color encoding.
Common pitfalls
Pitfall 1: wrong variant. Use _c for continuous numeric color; _d for discrete factor; _b for binned numeric. Mismatch produces gradients on factors or vice versa.
Pitfall 2: option names. Magma, plasma, inferno, cividis are options. Get the spelling right.
scale_color_viridis() (without _c or _d) is the OLD API. Modern code uses _c (continuous), _d (discrete), or _b (binned).Try it yourself
Try it: Plot mtcars with color = hp (continuous) using viridis. Save to ex_plot.
Click to reveal solution
Explanation: Continuous viridis maps hp (numeric) to a perceptually uniform color gradient.
Related ggplot2 functions
After mastering scale_color_viridis, look at:
scale_fill_viridis_c()/_d(): fill aestheticscale_color_brewer(): ColorBrewer palettesscale_color_gradient(): 2-color gradientscale_color_gradient2(): 3-color (diverging)viridis::scale_color_viridis(): original from viridis package
FAQ
What does scale_color_viridis_c do in ggplot2?
It applies a perceptually uniform continuous color scale (default: viridis) to a continuous color aesthetic.
What is the difference between viridis_c and viridis_d?
_c is for CONTINUOUS numeric color. _d is for DISCRETE factor color. Use the right one for your aesthetic.
Why is viridis recommended?
It is colorblind-safe, perceptually uniform (equal data differences look equally different), and prints well in greyscale.
What other viridis options are there?
viridis (default), magma, plasma, inferno, cividis, mako, rocket, turbo. Pass via option = "magma".
Should I use scale_color_viridis_c or scale_color_distiller?
Both produce continuous colors. viridis is the modern recommendation; distiller (built on ColorBrewer) is the older option.