はじめに
facet を使うと以下のようにグループごとにプロットを分けることができます.しかし,グループ間の比較を行うのがちょっと辛いですね.こんな時,どうすればいいのでしょうか.
「ggplot で scale = free な facet の軸を調整する」と同様,基本はレイヤーを足すかデータを弄るかです.
library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) +
geom_point() +
facet_wrap(vars(Species))facet で表示されない部分のデータをグレーでプロットしてみる
ここからは tidyverse パッケージのオンパレードですね.
nested data frame の扱いに慣れていないと辛いです.
library(dplyr)
library(tidyr)
library(purrr)
bg <- iris %>%
mutate(Species = map(Species, ~ setdiff(unique(Species), .x))) %>%
unnest
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) +
geom_point(data = bg, colour = "gray") +
geom_point() +
facet_wrap(vars(Species))いいですね!
bgは以下のようにして facet と group の組み合わせを調整しています.
| 元のデータフレーム | ||
|---|---|---|
| x | y | group |
| 1 | 1 | a |
| 2 | 2 | b |
| 3 | 3 | c |
↓
| 背景用に用意したデータフレーム | |||
|---|---|---|---|
| x | y | group | group_for_facet |
| 1 | 1 | a | b |
| 1 | 1 | a | c |
| 2 | 2 | b | a |
| 2 | 2 | b | c |
| 3 | 3 | c | a |
| 3 | 3 | c | b |
versicolor と virginica だけで facet してそれぞれの facet に setosa を表示する
iris %>%
mutate(
Species = as.character(Species),
facet = ifelse(
Species == "setosa",
list(setdiff(unique(Species), "setosa")),
as.list(Species)
)
) %>%
unnest %>%
ggplot(aes(Sepal.Length, Sepal.Width, colour = Species)) +
geom_point() +
facet_wrap(vars(facet))GOOD! このような用途では scales = "fixed" がいいと思います.
データフレームの操作では以下のようにして facet と group の組み合わせを調整しています.
| 元のデータフレーム | ||
|---|---|---|
| x | y | group |
| 1 | 1 | a |
| 2 | 2 | b |
| 3 | 3 | c |
↓
| プロット用に整形したデータフレーム | |||
|---|---|---|---|
| x | y | group | facet |
| 1 | 1 | a | b |
| 2 | 2 | b | b |
| 1 | 1 | a | c |
| 3 | 3 | c | c |
Atusy's blog