論文作成・統計

【R超初心者向け】beeswarmでdotplotを箱ひげ図の上にのせる方法!

ggplot2を使わずbeeswarmをつかったドットプロットをわかりやすく説明しました。とても簡単ですが、魅力的な図ができます。

これは私がまだRを触ったことがなかった時、自分が必要に迫られて短時間でドットプロットを書かなくてはいけなかった際、有料ソフトを購入するしかないと諦めていたときに無料で出来る見つけ使った方法です。

そのため、はじめてRを触った人でも真似をすれば出来る方法を紹介します。

ggplot2を使った方法を参照したい方はこちらを参照してください。

【超初心者向け】無料のRとggplot2で箱ひげ図とドットプロットをきれいに書く方法!プレゼンテーションや論文に重要な図の作り方です. キレイな図なだけで人の目を引きます. Rではggplot2を使えばでキレイな図が描けます. この記事では次のような図をできるようになります....
【R初心者向け】ggplot2でもbeeswarmで作図したい!ggbeeswarmを使った方法論文や発表で使えるggplot2でbeeswarmを描く方法を紹介します...

データセットの準備とbeeswarmのインストール

まずははじめに作業ディレクトリをセットします。

setwd("~/Rpractice/")

beeswarmのパッケージをインストールしましょう。

install.packages("beeswarm", dependencies = TRUE)

beeswarmを起動します。

library(beeswarm)

アヤメデータを使います。アヤメデータについてはこちらで説明をしています。

【超初心者向け】無料のRとggplot2で箱ひげ図とドットプロットをきれいに書く方法!プレゼンテーションや論文に重要な図の作り方です. キレイな図なだけで人の目を引きます. Rではggplot2を使えばでキレイな図が描けます. この記事では次のような図をできるようになります....
a <- iris
head(a)
> head(a)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> 

アヤメデータがaに格納されました。これで準備ができました。

箱ひげ図を書く

まずは単純な箱ひげ図をかいていきます

boxplot(a$Sepal.Length ~ a$Species)

ラベルをつけていきましょう

boxplot(a$Sepal.Length ~ a$Species, 
        xlab = "Species", ylab = "Sepal Length")

箱ひげ図のかき方はこちらでもいいです。

boxplot(data = a, Sepal.Length ~ Species)

x軸の順番を変えたい時はfactorとlevelを追記します

x軸の順番を変える時、factor()の中にlevel=c()で下のように順番を指定します。

boxplot(a$Sepal.Length ~ factor(a$Species, 
        level = c('versicolor', 'setosa', 'virginica')), 
        xlab = "Species", ylab = "Sepal Length")

colで箱の中を白くします

boxplot(data = a, Sepal.Length ~ Species, 
        col = "white")

lasで軸の文字の向きを変えることができます

boxplot(data = a, Sepal.Length ~ Species, 
        col = "white", las = 1)
boxplot(data = a, Sepal.Length ~ Species, 
        col = "white", las = 2)

下の文字が重なってしまいましたね。

ボックスプロットを横向きにします

boxplot(data = a, Sepal.Length ~ Species, 
        col = "white", 
        horizontal = TRUE, las = 2)

横の文字が重なったのと、2番目の文字列が長すぎてきれてしまいました。初心者向けの記事なので、シンプルにアノテーションをなしにして、また少し外側のスペースを増やしましょう。

par(mar = c(5,5,4,2) + 0.1)  # default is c(5,4,4,2) + 0.1
boxplot(data = a, Sepal.Length ~ Species, 
        col = "white", 
        horizontal = TRUE, ann = FALSE, las = 2)

beeswarmを箱ひげ図にのせていく

beeswarmを使っていきます

ようやくbeeswarmにたどり着きました。

beeswarm(data = a, Sepal.Length ~ Species)

beeswarmでadd = TRUEとすると下の図に重ねることができます

boxplot(data = a, Sepal.Length ~ Species, col = "white", las = 1)
beeswarm(data = a, Sepal.Length ~ Species, add = TRUE)

色をつけます

boxplot(data = a, Sepal.Length ~ Species, col = "white", las = 1)
beeswarm(data = a, Sepal.Length ~ Species,
         col = c("red","blue","green"),
         add = TRUE)

ドットのスタイルを変えるにはpchを指定します。

pchには25種類用意されています

pchを19に指定してみます。好みで選んでください。ちなみに16と19の丸の違いですが、16は普通の丸、19は少し斜め方向に膨らんだような丸になっています。

boxplot(data = a, Sepal.Length ~ Species, col = "white", las = 1)
beeswarm(data = a, Sepal.Length ~ Species,
         col = c("red","blue","green"),
         pch = 19,
         add = TRUE)

cexでドットの大きさを変えます。

boxplot(data = a, Sepal.Length ~ Species, col = "white", las = 1)
beeswarm(data = a, Sepal.Length ~ Species,
         method = "swarm",
         col = c("red","blue","green"),
         pch = 19,
         cex = 1.3,
         add = TRUE)

spacingで点と点の距離を変更できます

beeswarmのmethodは4つある

swarm, center, hex, squareの4つあります

boxplot(data = a, Sepal.Length ~ Species, col = "white", las = 1)
beeswarm(data = a, Sepal.Length ~ Species,
         method = "swarm",
         col = c("red","blue","green"),
         pch = 19,
         cex = 1.3,
         add = TRUE)
boxplot(data = a, Sepal.Length ~ Species, col = "white", las = 1)
beeswarm(data = a, Sepal.Length ~ Species,
         method = "center",
         col = c("red","blue","green"),
         pch = 19,
         cex = 1.3,
         add = TRUE)

アヤメデータは小数点1桁までなので、methodによる違いがあまりはっきりしません。

rnormで乱数をつくってみます

x <- rnorm(100, 10, 10)
y <- rnorm(100, 25, 10)
z <- rnorm(100, 20, 15)

それぞれのmethodによるグラフの違いをみていきましょう

methodによる違い

もう一度methodの違いを見ていきます

swarm

boxplot(list(x, y, z), col = "white", las = 1)
beeswarm(list(x, y, z),
         method = "swarm",
         col = c("red","blue","green"),
         spacing = 0.6,
         cex = 1.3,
         pch = 19,
         add = TRUE)

center

boxplot(list(x, y, z), col = "white", las = 1)
beeswarm(list(x, y, z),
         method = "center",
         col = c("red","blue","green"),
         spacing = 0.9,
         cex = 1.3,
         pch = 19,
         add = TRUE)

hex

boxplot(list(x, y, z), col = "white", las = 1)
beeswarm(list(x, y, z),
         method = "hex",
         col = c("red","blue","green"),
         spacing = .9,
         cex = 1.3,
         pch = 19,
         add = TRUE)

square

boxplot(list(x, y, z), col = "white", las = 1)
beeswarm(list(x, y, z),
         method = "square",
         col = c("red","blue","green"),
         cex = 1.3,
         spacing = .9,
         pch = 19,
         add = TRUE)

ラベルを変えてみます

boxplot(list(x, y, z),
        names = c("A", "B", "C"),
        xlab = "Names",
        ylab ="Values",
        col = "white",
        las = 1,
        cex.lab = 1.5,
        cex.axis = 1.5)
beeswarm(list(x, y, z),
         method = "swarm",
         col = c("red","blue","green"),
         pch = 19,
         spacing = .6,
         priority = "density",
         add = TRUE)

その他の機能を簡単に紹介します

corral

corralは点が大きく外側に外れたものを調整する方法です。

“none”, “gutter”, “wrap”, “random”, “omit”の5つの方法があります。

boxplot(list(x, y, z),
        names = c("A", "B", "C"),
        xlab = "Names",
        ylab ="Values",
        col = "white",
        las = 1,
        cex.lab = 1.5,
        cex.axis = 1.5)
beeswarm(list(x, y, z),
         method = "swarm",
         col = c("red","blue","green"),
         corral = "wrap",
         cex = 1.3,
         spacing = .9,
         pch = 19,
         add = TRUE)

priority

点の配置ですが、実際に見てみたほうがわかりやすいです。

descending

boxplot(list(x, y, z),
        names = c("A", "B", "C"),
        xlab = "Names",
        ylab ="Values",
        col = "white",
        las = 1,
        cex.lab = 1.5,
        cex.axis = 1.5)
beeswarm(list(x, y, z),
         method = "swarm",
         col = c("red","blue","green"),
         pch = 19,
         cex = 1.3,
         spacing = .9,
         priority = "descending",
         add = TRUE)

random

boxplot(list(x, y, z),
        names = c("A", "B", "C"),
        xlab = "Names",
        ylab ="Values",
        col = "white",
        las = 1,
        cex.lab = 1.5,
        cex.axis = 1.5)
beeswarm(list(x, y, z),
         method = "swarm",
         col = c("red","blue","green"),
         pch = 19,
         spacing = .9,
         priority = "random",
         add = TRUE)

density

boxplot(list(x, y, z),
        names = c("A", "B", "C"),
        xlab = "Names",
        ylab ="Values",
        col = "white",
        las = 1,
        cex.lab = 1.5,
        cex.axis = 1.5)
beeswarm(list(x, y, z),
         method = "swarm",
         col = c("red","blue","green"),
         pch = 19,
         spacing = .9,
         priority = "density",
         add = TRUE)

side

点を右側か左側に集めます。

side = 1

右側に集めます。

boxplot(list(x, y, z),
        names = c("A", "B", "C"),
        xlab = "Names",
        ylab ="Values",
        col = "white",
        las = 1,
        cex.lab = 1.5,
        cex.axis = 1.5)
beeswarm(list(x, y, z),
         method = "swarm",
         col = c("red","blue","green"),
         pch = 19,
         spacing = .9,
         side = 1,
         add = TRUE)

side = -1

左側に集めます。

boxplot(list(x, y, z),
        names = c("A", "B", "C"),
        xlab = "Names",
        ylab ="Values",
        col = "white",
        las = 1,
        cex.lab = 1.5,
        cex.axis = 1.5)
beeswarm(list(x, y, z),
         method = "swarm",
         col = c("red","blue","green"),
         pch = 19,
         spacing = .9,
         side = -1,
         add = TRUE)

無料のオープンソースでここまでできるのはすごいですよね。

ggplot2とggbeeswarmを使った方法はこちらで紹介をしています。

どちらがいいかは好みですので、どちらでも使いやすいほうを使うのがいいと思います。

【R初心者向け】ggplot2でもbeeswarmで作図したい!ggbeeswarmを使った方法論文や発表で使えるggplot2でbeeswarmを描く方法を紹介します...

お役に立ちましたら幸いです。