廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

ggplot2でヒストグラムを箱ひげ図風に並べてプロットするパッケージggbrickを書いた

今日の川柳

English version:

abrahamcow.hatenablog.com

github.com

ggtetrisって名前にしようかと思ったんだけど、もうある(GitHub - EmilHvitfeldt/ggtetris: Create Tetris Chart Visualizations in R)みたいなので、ggbrickにしました。

brickはレンガっていう意味らしいです。

マニュアルは気が向いたときにちょっとずつ書きます。

インストールは

devtools::install_github("abikoushi/ggbrick")

で多分いけます。

入ってる関数は基本的にはgeom_brickだけです。

気が向いたら触ってみて変なところを教えていただけると嬉しいです。

以下デモです。

基本的な使い方はこう。

library(ggplot2)
library(ggbrick)
ggplot(data = iris) +
  geom_brick(aes(y = Sepal.Length, x=Species), binwidth = 0.1)

f:id:abrahamcow:20190325205328p:plain

引数binwidthまたはbinsでビンの幅を変えられます。

ggplot(data = iris) +
  geom_brick(aes(y = Sepal.Length, x=Species), binwidth = 0.5)

f:id:abrahamcow:20190325205431p:plain

塗りつぶし。

ggplot(data = iris) +
  geom_brick(aes(y = Sepal.Length, x=Species), binwidth = 0.5, fill = "black")

f:id:abrahamcow:20190325205501p:plain

色を変えてサブカテゴリを積み上げることができます。

ggplot(data = mpg,aes(y = cty, x=factor(year), fill=factor(cyl))) +
  geom_brick(binwidth = 1)

f:id:abrahamcow:20190325205552p:plain

引数stackgroupsをFALSEにすると積み上げません。

ggplot(data = mpg,aes(y = cty, x=factor(year), fill=factor(cyl))) +
  geom_brick(binwidth = 1, stackgroups = FALSE, alpha = 0.5)

f:id:abrahamcow:20190325205637p:plain

でも見づらいのであんまり使わないかも。

stackdirを"centerwhole"にするとバイオリンプロットライクに左右にブロックを積みます。

ggplot(data = mpg,aes(y = cty, x=factor(year), fill=factor(cyl))) +
  geom_brick(binwidth = 1, stackgroups = FALSE, alpha = 0.5,
            stackdir = "centerwhole", position = position_dodge(0.5))

f:id:abrahamcow:20190325205748p:plain

横向きにしたいときはcoord_flipで。

ggplot(data = diamonds, aes(x = color, y=carat, colour=cut)) +
  geom_brick(binwidth=0.2) +
  coord_flip()

f:id:abrahamcow:20190325205839p:plain

stat_summaryと合わせてメディアンを表示。

ggplot(data = iris,aes(y = Sepal.Length, x=Species)) +
  geom_brick(binwidth = 0.1, stackdir = "centerwhole")+
  stat_summary(fun.y = median, fun.ymin = median, fun.ymax = median,
               geom = "crossbar")

f:id:abrahamcow:20190325205942p:plain

当たり前かもしれませんがfacetもできます。

iris2 <- tidyr::gather(iris,key,value,-Species)
ggplot(data = iris2,aes(y = value, x=Species)) +
  geom_brick(binwidth = 0.3,fill="black")+
  facet_wrap(~key,scales = "free_y")

f:id:abrahamcow:20190325210030p:plain

以上です。

追記:アンスコム的な例

geom_brickを使うとなにが嬉しいかを示したいので、もう一つ例を追加します。

geom_brickはgeom_violinやgeom_boxplotの有力な代替案になりうると考えています。

下記のページから入手できるデータセットをいくつかの方法で図示してみます。
The Datasaurus Dozen - Same Stats, Different Graphs: Generating Datasets with Varied Appearance and Identical Statistics through Simulated Annealing | Autodesk Research

まずはgeom_jitterです。

f:id:abrahamcow:20190326024556p:plain

データに忠実な視覚化です。ただし点の数が多くなると頻度を把握しづらい面があります。

次に同じデータの箱ひげ図(geom_boxplot)です。

f:id:abrahamcow:20190326024702p:plain

このデータは要約統計量にしてしまうと、分布の違いがまったく見て取れません。

geom_brickです。

f:id:abrahamcow:20190326024903p:plain

分布が直感的にわかると思います。

最後にバイオリンプロット(geom_violin)です。

f:id:abrahamcow:20190326025019p:plain

もちろん悪くはないですが、やや平滑化しすぎる傾向がある気がします。まったく点のないところにも少しデータがありそうに見えます。

作図のための R のコードは以下の通りです:

library(tidyverse)
library(ggbrick)
dat <- read_tsv("~/Downloads/SameStatsDataAndImages/datasets/BoxPlots.tsv") 
dat_t <- gather(dat,key,value,-X1)

ggplot(dat_t,aes(x=key,y=value))+
  geom_jitter()

ggplot(dat_t,aes(x=key,y=value))+
  geom_boxplot()

ggplot(dat_t,aes(x=key,y=value))+
  geom_brick()

ggplot(dat_t,aes(x=key,y=value))+
  geom_violin()