Bit more structure

This commit is contained in:
Hadley Wickham 2022-09-26 08:55:42 -05:00
parent 8bb53a7fc6
commit 21dd5aa4a4
1 changed files with 31 additions and 20 deletions

View File

@ -617,17 +617,7 @@ lin_check <- function(df, x, y) {
}
```
```{r}
# https://twitter.com/sharoz/status/1574376332821204999
# Facetting is fiddly - have to use special vars syntax.
foo <- function(x) {
ggplot(mtcars) +
aes(x = mpg, y = disp) +
geom_point() +
facet_wrap(vars({{ x }}))
}
```
Of course you might combine both dplyr and ggplot2:
```{r}
sorted_bars <- function(df, var) {
@ -639,18 +629,25 @@ sorted_bars <- function(df, var) {
diamonds |> sorted_bars(cut)
```
Of course you might combine both dplyr and ggplot2:
Next we'll discuss two more complicated cases: facetting and automatic labelling.
### Facetting
Unfortunately facetting is a special challenge, mostly because it was implemented well before we understood what tidy evaluation was and how it should work.
And unlike `aes()`, it wasn't straightforward to backport to tidy evalution, so you have to use a different syntax to usual.
Instead of writing `~ x`, you write `vars(x)` and instead of `~ x + y` you write `vars(x, y)`.
The only advantage of this syntax is that `vars()` is data masking so you can embrace within it.
```{r}
bars <- function(df, condition, var) {
df |>
filter({{ condition }}) |>
ggplot(aes({{ var }})) +
geom_bar() +
scale_x_discrete(guide = guide_axis(angle = 45))
}
# https://twitter.com/sharoz/status/1574376332821204999
diamonds |> bars(cut == "Good", clarity)
# Facetting is fiddly - have to use special vars syntax.
foo <- function(x) {
ggplot(mtcars) +
aes(x = mpg, y = disp) +
geom_point() +
facet_wrap(vars({{ x }}))
}
```
I've written these functions so that you can supply any data frame, but there are also advantages to hardcoding a data frame, if you're using it repeatedly:
@ -668,6 +665,20 @@ density(species)
density(island, sex)
```
Also note that I hardcoded the `x` variable but allowed the fill to vary.
```{r}
bars <- function(df, condition, var) {
df |>
filter({{ condition }}) |>
ggplot(aes({{ var }})) +
geom_bar() +
scale_x_discrete(guide = guide_axis(angle = 45))
}
diamonds |> bars(cut == "Good", clarity)
```
### Labelling
It'd be nice to label this plot automatically.