ジョンとヨーコのイマジン日記

キョウとアンナのラヴラブダイアイリー改め、ジョンとヨーコのイマジン日記です。

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

これです:

GitHub - abikoushi/ggbrick: An R package for brick plot

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の有力な代替案になりうると考えています。

下記のページから入手できるデータセットをいくつかの方法で図示してみます。
Same Stats, Different Graphs

まずは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()