Skip to content

Commit 21db0d6

Browse files
authored
Merge pull request #44 from nanxstats/observable
Implement Observable 10 palette
2 parents eca46d5 + 1b2a3ee commit 21db0d6

11 files changed

+245
-0
lines changed

NAMESPACE

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export(pal_locuszoom)
1616
export(pal_material)
1717
export(pal_nejm)
1818
export(pal_npg)
19+
export(pal_observable)
1920
export(pal_rickandmorty)
2021
export(pal_simpsons)
2122
export(pal_startrek)
@@ -40,6 +41,7 @@ export(scale_color_locuszoom)
4041
export(scale_color_material)
4142
export(scale_color_nejm)
4243
export(scale_color_npg)
44+
export(scale_color_observable)
4345
export(scale_color_rickandmorty)
4446
export(scale_color_simpsons)
4547
export(scale_color_startrek)
@@ -62,6 +64,7 @@ export(scale_colour_locuszoom)
6264
export(scale_colour_material)
6365
export(scale_colour_nejm)
6466
export(scale_colour_npg)
67+
export(scale_colour_observable)
6568
export(scale_colour_rickandmorty)
6669
export(scale_colour_simpsons)
6770
export(scale_colour_startrek)
@@ -84,6 +87,7 @@ export(scale_fill_locuszoom)
8487
export(scale_fill_material)
8588
export(scale_fill_nejm)
8689
export(scale_fill_npg)
90+
export(scale_fill_observable)
8791
export(scale_fill_rickandmorty)
8892
export(scale_fill_simpsons)
8993
export(scale_fill_startrek)

NEWS.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# ggsci 3.1.0.9000
22

3+
## New features
4+
5+
- Add the Observable 10 palette in `scale_color_observable()`
6+
and `scale_fill_observable()` (#41).
7+
38
## Improvements
49

510
- Move internal color palette data from `R/sysdata.rda` to `R/palettes.R`.

R/discrete-observable.R

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#' Observable 10 color palette
2+
#'
3+
#' The Observable 10 palette.
4+
#'
5+
#' @param palette Palette type.
6+
#' Currently there is one available option: `"observable10"`
7+
#' (10-color palette).
8+
#' @param alpha Transparency level, a real number in (0, 1].
9+
#' See `alpha` in [grDevices::rgb()] for details.
10+
#'
11+
#' @export pal_observable
12+
#'
13+
#' @importFrom grDevices col2rgb rgb
14+
#' @importFrom scales manual_pal
15+
#'
16+
#' @author Nan Xiao | \email{[email protected]} | <https://nanx.me>
17+
#'
18+
#' @references
19+
#' Pettiross J (2023). "Crafting data colors and staying on brand."
20+
#' _Observable blog_. <https://observablehq.com/blog/crafting-data-colors>
21+
#'
22+
#' @examples
23+
#' library("scales")
24+
#' show_col(pal_observable("observable10")(10))
25+
#' show_col(pal_observable("observable10", alpha = 0.6)(10))
26+
pal_observable <- function(palette = c("observable10"), alpha = 1) {
27+
palette <- match.arg(palette)
28+
29+
if (alpha > 1L || alpha <= 0L) stop("alpha must be in (0, 1]")
30+
31+
raw_cols <- ggsci_db$"observable"[[palette]]
32+
raw_cols_rgb <- col2rgb(raw_cols)
33+
alpha_cols <- rgb(
34+
raw_cols_rgb[1L, ], raw_cols_rgb[2L, ], raw_cols_rgb[3L, ],
35+
alpha = alpha * 255L, names = names(raw_cols),
36+
maxColorValue = 255L
37+
)
38+
39+
manual_pal(unname(alpha_cols))
40+
}
41+
42+
#' Observable 10 color scales
43+
#'
44+
#' See [pal_observable()] for details.
45+
#'
46+
#' @inheritParams pal_observable
47+
#' @param ... Additional parameters for [ggplot2::discrete_scale()].
48+
#'
49+
#' @export scale_color_observable
50+
#'
51+
#' @importFrom ggplot2 discrete_scale
52+
#'
53+
#' @author Nan Xiao | \email{[email protected]} | <https://nanx.me>
54+
#'
55+
#' @references
56+
#' Pettiross J (2023). "Crafting data colors and staying on brand."
57+
#' _Observable blog_. <https://observablehq.com/blog/crafting-data-colors>
58+
#'
59+
#' @rdname scale_observable
60+
#'
61+
#' @examples
62+
#' library("ggplot2")
63+
#' data("diamonds")
64+
#'
65+
#' ggplot(
66+
#' subset(diamonds, carat >= 2.2),
67+
#' aes(x = table, y = price, colour = cut)
68+
#' ) +
69+
#' geom_point(alpha = 0.7) +
70+
#' geom_smooth(method = "loess", alpha = 0.1, size = 1, span = 1) +
71+
#' theme_bw() +
72+
#' scale_color_observable()
73+
#'
74+
#' ggplot(
75+
#' subset(diamonds, carat > 2.2 & depth > 55 & depth < 70),
76+
#' aes(x = depth, fill = cut)
77+
#' ) +
78+
#' geom_histogram(colour = "black", binwidth = 1, position = "dodge") +
79+
#' theme_bw() +
80+
#' scale_fill_observable()
81+
scale_color_observable <- function(palette = c("observable10"), alpha = 1, ...) {
82+
palette <- match.arg(palette)
83+
if (is_ggplot2_350()) {
84+
discrete_scale("colour", palette = pal_observable(palette, alpha), ...)
85+
} else {
86+
discrete_scale("colour", scale_name = "observable", palette = pal_observable(palette, alpha), ...)
87+
}
88+
}
89+
90+
#' @export scale_colour_observable
91+
#' @rdname scale_observable
92+
scale_colour_observable <- scale_color_observable
93+
94+
#' @export scale_fill_observable
95+
#' @importFrom ggplot2 discrete_scale
96+
#' @rdname scale_observable
97+
scale_fill_observable <- function(palette = c("observable10"), alpha = 1, ...) {
98+
palette <- match.arg(palette)
99+
if (is_ggplot2_350()) {
100+
discrete_scale("fill", palette = pal_observable(palette, alpha), ...)
101+
} else {
102+
discrete_scale("fill", scale_name = "observable", palette = pal_observable(palette, alpha), ...)
103+
}
104+
}

R/palettes.R

+14
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,20 @@ ggsci_db$"d3"$"category20c" <- c(
137137
"Snuff" = "#DADAEB", "Alto" = "#D9D9D9"
138138
)
139139

140+
# Observable 10 color palette
141+
ggsci_db$"observable"$"observable10" <- c(
142+
"Blue" = "#4269D0",
143+
"Orange" = "#EFB118",
144+
"Red" = "#FF725C",
145+
"Cyan" = "#6CC5B0",
146+
"Green" = "#3CA951",
147+
"Pink" = "#FF8AB7",
148+
"Purple" = "#A463F2",
149+
"LightBlue" = "#97BBF5",
150+
"Brown" = "#9C6B4E",
151+
"Gray" = "#9498A0"
152+
)
153+
140154
# Color palette inspired by IGV
141155
ggsci_db$"igv"$"default" <- c(
142156
"chr1" = "#5050FF", "chr2" = "#CE3D32", "chr3" = "#749B58",

README.Rmd

+8
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,14 @@ p2_d3 <- p2 + scale_fill_d3()
158158
grid.arrange(p1_d3, p2_d3, ncol = 2)
159159
```
160160

161+
### Observable
162+
163+
```{r, ggsci-observable}
164+
p1_observable <- p1 + scale_color_observable()
165+
p2_observable <- p2 + scale_fill_observable()
166+
grid.arrange(p1_observable, p2_observable, ncol = 2)
167+
```
168+
161169
### LocusZoom
162170

163171
```{r, ggsci-locuszoom}

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ open with `vignette("ggsci")` in R) for a quick-start guide.
7171

7272
<img src="man/figures/README-ggsci-d3-1.png" width="100%" style="display: block; margin: auto;" />
7373

74+
### Observable
75+
76+
<img src="man/figures/README-ggsci-observable-1.png" width="100%" style="display: block; margin: auto;" />
77+
7478
### LocusZoom
7579

7680
<img src="man/figures/README-ggsci-locuszoom-1.png" width="100%" style="display: block; margin: auto;" />

_pkgdown.yml

+6
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ reference:
6060
- scale_color_d3
6161
- scale_colour_d3
6262
- scale_fill_d3
63+
- title: "Observable"
64+
contents:
65+
- pal_observable
66+
- scale_color_observable
67+
- scale_colour_observable
68+
- scale_fill_observable
6369
- title: "LocusZoom"
6470
contents:
6571
- pal_locuszoom
26.7 KB
Loading

man/pal_observable.Rd

+31
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/scale_observable.Rd

+55
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vignettes/ggsci.Rmd

+14
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ summarized in the table below.
8484
| | | `"category20b"` | |
8585
| | | `"category20c"` | |
8686
+-----------------+------------------------------+--------------------------------+----------------------+
87+
| Observable | `scale_color_observable()` | `"observable10"` | `pal_observable()` |
88+
| | `scale_fill_observable()` | | |
89+
+-----------------+------------------------------+--------------------------------+----------------------+
8790
| LocusZoom | `scale_color_locuszoom()` | `"default"` | `pal_locuszoom()` |
8891
| | `scale_fill_locuszoom()` | | |
8992
+-----------------+------------------------------+--------------------------------+----------------------+
@@ -266,6 +269,17 @@ p2_d3 <- p2 + scale_fill_d3()
266269
grid.arrange(p1_d3, p2_d3, ncol = 2)
267270
```
268271

272+
### Observable
273+
274+
The [Observable 10 palette](https://observablehq.com/blog/crafting-data-colors)
275+
is the default categorical colors scheme used by Observable.
276+
277+
```{r}
278+
p1_observable <- p1 + scale_color_observable()
279+
p2_observable <- p2 + scale_fill_observable()
280+
grid.arrange(p1_observable, p2_observable, ncol = 2)
281+
```
282+
269283
### LocusZoom
270284

271285
The LocusZoom palette is based on the colors used by

0 commit comments

Comments
 (0)