gghighlightがあらゆるGeomをハイライトできるようになりました(たぶん)

gghighlightパッケージは、データ系列が多すぎるとき、いい感じに一部をハイライトしてくれるパッケージでした。

もうすぐリリース予定のggplot2 2.3.0の新機能を使ってパワーアップ中です。 詳しい解説はおいおい書くとして、簡単に紹介だけします。

おさらい

gghighlightは、こういうデータがあったときに、

library(dplyr, warn.conflicts = FALSE)

set.seed(2)
d <- purrr::map_dfr(
  letters,
  ~ data.frame(idx = 1:400,
               value = cumsum(runif(400, -1, 1)),
               type = .,
               stringsAsFactors = FALSE))

こんな感じでふつうに可視化したのではもじゃもじゃで系列が見分けられなくてどうしよう...、みたいなとき、

library(ggplot2)

ggplot(d) +
  geom_line(aes(idx, value, colour = type))

こんな風に書けば一部だけハイライトしてくれますよ、というやつでした。

library(gghighlight)

gghighlight_line(d, aes(idx, value, colour = type), max(value) > 20)

gghighlight()

でも、ggplot2って、+でレイヤーを重ねたり減らしたりして探索的に書いていくのに、いきなり別の関数を持ち出してこないといけないのは不便ですよね。 そんなときのために、gghighlight()という関数をつくりました。

さっきのプロットに、gghighlight()を重ねるだけであら不思議、

ggplot(d) +
  geom_line(aes(idx, value, colour = type)) +
  gghighlight(max(value) > 20)

gghighlight_line()を引数の順番とか覚えてなくてもこれで簡単にハイライトできちゃいます。

なんでもハイライトできる

gghighlight()は、linepointだけではなくて、なんでもハイライトできます。

単純なものとしてはこういう棒グラフとか(絞り込みの表現を指定しなくても使えることに注目)、

ggplot(iris) +
  geom_histogram(aes(Petal.Length, fill = Species), binwidth = 0.5) +
  gghighlight() +
  facet_wrap(~ Species)

ggplot2 2.3.0の新機能geom_sf()もハイライトできます。

nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)

p1 <- ggplot(nc) +
  geom_sf(aes(fill = AREA)) +
  ggtitle("All")

p2 <- p1 + gghighlight(grepl("^A", NAME)) +
  ggtitle("Polygons that starts with A")
#> Warning: You set use_group_by = TRUE, but grouped calculation failed.
#> Falling back to ungrouped filter operation...

library(patchwork)

p1 / p2

Grouped vs ungrouped?

詳しい議論は前回のを見てもらうとして、geom_pointgeom_lineではハイライトの仕方が違います。 点は、それぞれの点に関してハイライトするかしないか選べる(ungrouped)一方で、線は系列全体でハイライトするかしないかを選ばないと(grouped)変なことになります。 そこで、groupedかungroupedかを明確に区別してたんですが、gghighlight()はそういうのを意識しなくても使えるようになってます。

set.seed(10)
d2 <- sample_n(d, 20)

ggplot(d2) +
  geom_point(aes(idx, value)) +
  gghighlight(value > 0)

これはなぜかというと単純で、いちどgroupedなものとして計算してみて、エラーが出たらungroupedでもういちど計算してそっちの結果を使う、という泥臭いことをしています。 なのであんまり効率が良くないです。時間のかかる計算はちゃんと自分でやりましょう。

使ってみてください

まあそんな感じで、あらゆる場面で使えるようになった反面、想定することが多すぎてちょっと自分ではテストしきれない、というところがあります。 まだもうちょっと開発中だし、ドキュメントは足りてないのでわかりづらいところもあるんですが、人柱になっていただける方は使ってみてください。

# 注:ggplot2 2.3.0(開発版)もインストールされます!
devtools::install_github("yutannihilation/gghighlight")

そして、何か変なところあれば、英語ならGitHubで、日本語ならこのブログのコメント欄、Twitterあたりでお知らせください!