RAKSUL TechBlog

RAKSULグループのエンジニアが技術トピックを発信するブログです

tidyplotsとggplot2のグラフ描画に対する考え方の違い

はじめに

この記事は ノバセル Advent Calendar 13日目です。

こんにちは。ノバセルでデータサイエンティストをしている松村です。

この記事では、最近R界隈でよく話題に上がっているtidyplotsパッケージにどういう特徴があるのかについて見ていきたいと思います。特に、コードの書き方の単純比較というよりは文法の特徴を通してグラフ描画に対する考え方の違いについて見ていければと思います。

tidyplotsパッケージ

tidyplotsはggplot2という、R言語の世界ではもはやスタンダードとも言えるパッケージをラップしたもので、論文投稿や報告のために整えたきれいなグラフをより簡単に作れるというものです。

library(tidyplots)
study %>% 
  tidyplot(x = treatment, y = score, color = treatment) %>% 
  add_mean_bar(alpha = 0.4) %>% 
  add_sem_errorbar() %>% 
  add_data_points_beeswarm()

同じようなグラフをggplot2で作成すると以下のようになります。

librarry(ggplot2)
study %>%
  ggplot(aes(x = treatment, y = score, fill = treatment)) +
  stat_summary(geom = "bar", fun = "mean") +
  stat_summary(geom = "errorbar", fun.data = "mean_se", width = 0.5) +
  geom_dotplot(binaxis = "y", stackdir = "center", binwidth = 1)

カラーパレットの調整は用途によって変わるのでしていません。目的のグラフにたどり着くまでという観点だとggplot2だと自由度が高い分、典型的なグラフを作る場合でも関数の引数などで指定する項目が多く、慣れていないと調べたりAIに聞いたりと時間がかかるかもしれません。その点ではtidyplotsのほうが細かい調整なしにパッとグラフ描画ができそうです。

もともと、このパッケージの論文はbioRxivという生物学系のpreprintサイトに投稿されていたり、パッケージのサブタイトルが"Publication-ready plots for scientific papers"であったりと、かなり学術用途を意識しているようです。

すでにいくつかの使ってみた記事1解説動画も出ていますしドキュメントも充実しているので、この記事では使い方そのものには踏み込まず、パッケージの特徴、とりわけggplot2パッケージとの違いについて触れられればと思います。

tidyって何?

先述したggplot2パッケージはtidyverseという、Hadley Wickham氏が提唱した世界観及びパッケージ群に含まれています。tidyというワードはtidyverse登場以後、R言語の中では頻繁に使われるようになり、tidymmodelsといったパッケージ名、Tidy data2というデータ構造など「整然とした」という意味合いで広く使われるようになりました。

また、特にtidyverseやtidymodelsのようなパッケージは多くの関連パッケージを内包したパッケージ「群」として、一つのエコシステムを形成しているため、「tidy〇〇」というパッケージ名だったり、verseやmodelのような範囲の広い一般的なワードが入っているとこのようなエコシステム系パッケージを連想する方も多いのではないでしょうか。

tidyplotsの特徴

ドキュメントや論文、使ってみた系の記事を読むと、tidyplotsの大きな特徴は以下の2点のようです。

  1. パイプ演算子で繋いだ記述ができる
  2. 主要な関数名に動詞が使われている

それぞれについて見ていきます。

パイプ演算子で繋いだ記述ができる

R言語においてパイプ演算子は、「前の結果を次の関数の第一引数として渡す」という働きがあります。その便利さからtidyverseで %>% 演算子が実装されてから3以後広く使われるようになり、R 4.1からはパッケージを呼ばずに使える |> というパイプ演算子が実装されるなど、その登場は本体に影響をあたえるほど大きいものでした。

tidyverseに含まれるほとんどの関数はパイプで繋いでいけるのに対し、ggplot2は関数を + 演算子で繋いでいくため、勉強会などユーザーから紛らわしいという声もよく聞きます。この点はggplot2の生みの親であるHadley Wickham氏も同様のことを言っています4

これに対しtidyplotsパッケージは、グラフの描画をパイプ演算子で繋いで記述することができます。

主要な関数名に動詞が使われている

ここがggplot2と最も思想的に異なる部分と言えるでしょう。ggplto2はレイヤーの概念で必要な幾何を重ねていくという発想からスタートしているため、レイヤーに関わる関数を + 演算子で繋いでいく文法になっています。

# ggplot2
animals %>%
  ggplot(aes(x = weight, y = size)) +
  geom_point() +
  ggtitle("ggplot2によるグラフ")

ggplotで作成したグラフ

一方で、tidyplotsは動詞由来の関数をパイプ演算子で繋いでいくという文法になっています。

# tidyplots
animals %>% 
  tidyplot(x = weight, y = size) %>% 
  add_data_points() %>%
  add_title("tidyplotsによるグラフ")

tidyplotsで作成したグラフ

tidyplotsにどういう関数があるかについては、ドキュメントにまとまっていますのでそちらも参照ください。

tidyplotsのドキュメントより引用

関数名に動詞が使われている点はdplyrパッケージにおける思想とかなり近いものと言えます。 dplyrパッケージのドキュメントでは以下のように述べられています。

dplyr is a grammar of data manipulation, providing a consistent set of verbs that help you solve the most common data manipulation challenges

「データ操作のための動詞を提供する」ということです。tidyplotsでも add_***() でグラフの要素を重ねていき、 adjust_***()reverse_***() といった関数でグラフの見た目を調節するといった作りになっています。つまり「グラフ操作のための動詞を提供」しています。tidyplotsは幾何的にレイヤーを重ねていくggolot2パッケージとはグラフ描画に対する考え方が異なっていると言えます。

おそらく、プログラミングが専門ではない人からすると、dplyrがbase Rに比べて直感的で扱いやすかったように、tidyplotsのほうが操作(動詞)を繋げていくほうが直感的に扱いやすいという観点もあるのでしょう。

tidyplotsはtidyか?

以上のように、tidyplotsはいくつかのtidyverse由来の特徴があります。

tidyplotsという名前ですが、前提としてラップ元のggplot2もtidyverseパッケージ群に含まれていますので、その意味でggplot2も十分tidyであると言えるでしょう。 実際にggplot2はTidy data(いわゆる縦型のデータ)を入力として想定しています。

tidyplotsもTidy dataを前提としていたり、グラフ描画や編集の流れが「整然としている」という意味ではtidyと言えます。 しかしtidyverseやtidymodelsのように一つのエコシステムを形成するものではなく、あくまで「tidyな要素のある、定型グラフ描画」です。

つまりggplot2を置き換えるものではなく、学術論文形式などを想定した用途特化型のパッケージと捉えるのが良さそうです。

おわりに

まとめると、tidyplotsパッケージは以下のような特徴のあるパッケージです。

  • 特に学術分野の論文で使いやすい、ある程度定型のグラフを
  • ggplot2に比べて短いコードで簡単に書ける
    • プログラミングが生業でない人からすると楽で良い
  • tidyplotsという名前の背景にはグラフ操作(動詞)をパイプラインで繋いでいくという考え方がありそう

これらの特徴を踏まえたうえで、上手く使い分けができるといいなと思いました。

それにしてもtidyplotsというパッケージ名は結構思い切った命名だなあという感想でこの記事を締めたいと思います。

明日のAdvent Calendarは@shuya_ishiiさんです!乞うご期待!

参考URL・記事

tidyplots関連

tidyverse関連


  1. tidyplotsを試すRでggplot2クオリティのグラフをカンタンに描画できるtidyplotsパッケージ
  2. Tidy Data | Journal of Statistical Software
  3. 正確には、%>% 演算子はtidyverseの中のmagrittrパッケージにて実装されています。
  4. 一方で、「ggplot2はレイヤーの概念で必要な幾何を重ねていくんだからパイプじゃなくて+のほうがいい」という意見もあるようです。