ggplot2: ボックスプロットにドットプロットを重ねる

ggplot2 を使うと、ボックスプロットに、ドットプロットを重ねて描画することもできます。バイオリンプロットのときと同様に、 geom_boxplot()geom_dotplot()+ で続けて指定します。

g + geom_boxplot() + geom_dotplot()

g は、ggplot のオブジェクトです。具体的には、下記のようなコードです。

input_data <- tibble("Sample1" = rnorm(100),
                     "Sample2" = rnorm(100))

plot_data <- input_data %>%
  gather(Sample1, Sample2, key = "sample", value = "read_count")

g <- ggplot(plot_data, aes(x = sample, y = read_count))

g + geom_boxplot() +
  geom_dotplot(binaxis = "y", stackdir = "center", binwidth = 0.1)

下記のようなイメージが出力されます。

ボックスプロットにドットプロットを重ねた例。

なお、ドットを整列させない場合は、 geom_jitter() 関数を用います。

g + geom_boxplot() + geom_jitter()

ドットが横方向にランダムに描画されます。ランダムな結果なので、実行するたびにドットの位置が変化します。(見た目だけの問題なので、ばらつきに意味はありません。)geom_point(position = “jitter”) でも同様です。

geom_jitter の例。

 

ggplot2: バイオリンプロット (geom_violin)

データ数が多い場合、データの分布が見るときに、バイオリンプロット geom_violin() を使います。バイオリンプロットでは、データの分布が分布曲線の波形で表示されるので、どの区間に多くデータが存在しているか確認できます。データの分布が内部で大きく2つに分かれているようなケースではも、文字通りバイオリンの形になります。

geom_violin(trim = FALSE)

波形の上端と下端が切り取られたイメージにしたくない場合は、オプションで trim = FALSE を指定します。プロットするためのデータは、 geom_boxplot(), geom_dotplot() と同じです。(例のオブジェクトg までは同じ。)

input_data <- tibble("Sample1" = rnorm(100),
                     "Sample2" = rnorm(100))

plot_data <- input_data %>%
  gather(Sample1, Sample2, key = "sample", value = "read_count")

g <- ggplot(plot_data, aes(x = sample, y = read_count))
g + geom_violin(trim = FALSE)

また、ggplot2 は、プロットを重ねて書くこともできます。 geom_violin() + geom_dotplot() とすることで、バイオリンプロットにドットプロットを重ねて表示できます。

g + geom_violin(trim = FALSE) +
  geom_dotplot(binaxis = "y", stackdir = "center", binwidth = 0.1)

 

ggplot2: ドットプロット (geom_dotplot)

データ数がそれほど多くない場合は、ボックスプロットに代わり、ドットプロットが用いられることもあります。ドットプロットは、データの数だけ、点(ドット)を表示するので、データの広がりをイメージしやすいでしょう。

geom_dotplot(binaxis = "y", stackdir = "center", binwidth = 0.1)

ドットプロットを書くには、geom_dotplot() を使います。ボックスプロットのようにサンプルを横に並べるには、binaxis = “y” を指定します。また、ドットを左右対象に並べるには、 stackdir = “center” を指定します。 binwidth は、ドットを並べる区画の幅です。ドットの大きさにも影響します。(binwidth は、何回か描画して、試行錯誤することになると思います。)

ggplot オブジェクト (=g) を作るまでは、ボックスプロットと同じです。g を定義しておくと、geom_boxplot() を geom_dotplot() に変更するだけで描けます。

input_data <- tibble("Sample1" = rnorm(100),
                     "Sample2" = rnorm(100))

plot_data <- input_data %>%
  gather(Sample1, Sample2, key = "sample", value = "read_count")

g <- ggplot(plot_data, aes(x = sample, y = read_count))
g + geom_dotplot(binaxis = "y", stackdir = "center", binwidth = 0.1)
ドットプロットの例
 

ggplot2: 散布図 (scatter plot)

ggplot2 で散布図を書く例です。散布図は2次元のデータです。x軸とy軸にそれぞれのサンプルを指定し、geom_point() 関数で描画します。

ggplot(input_data, aes(x = Sample1, y = Sample2)) + geom_point()

実際のコードは、下記のようになります。aes の中の x, y の指定は、順序を守っていれば、省略可能です。

input_data <- tibble("Sample1" = rnorm(100),
                     "Sample2" = rnorm(100))

g <- ggplot(input_data, aes(Sample1, Sample2))
g + geom_point()

下記のように散布図が表示されます。

 

ggplot2: ボックスプロット (box plot)

ggplot2 で、グラフを作成する場合、x軸とy軸の座標を意識する必要があります。この点は、慣れないと難しいかもしれません。ボックスプロットを例に解説します。

# 1サンプルあたり100個のデータを持つ2サンプルを生成。
input_data <- tibble("Sample1" = rnorm(100),
                     "Sample2" = rnorm(100))
>
> input_data
# A tibble: 100 x 2
   Sample1 Sample2
     <dbl>   <dbl>
 1  0.0145   0.550
 2  1.00    -0.627
 3  0.193   -0.300
 4  1.45     0.612
 5 -1.25    -0.134
 6  0.965    0.113
 7  0.0219   0.351
 8  0.0158  -1.11
 9  0.802    0.357
10 -0.387   -0.828
# … with 90 more rows

上記のような2サンプルのデータがあったとして、従来の関数を使うのであれば、boxplot(input_data) と書くだけで良いです。しかし、同じ感覚で、geom_boxplot を使おうとすると、下記のような警告が表示されます。

> ggplot(input_data, aes(Sample1, Sample2)) + geom_boxplot()
 警告メッセージ:
Continuous x aesthetic -- did you forget aes(group=...)?

表示されるプロット図も、期待されるイメージと違います。

誤ったイメージ

この原因は、aes() に渡しているのは、xの座標とyの座標として扱われるからです。省略せずに書くと、aes(x = Sample1, y = Sample2) となります。そのため、上記のような誤った結果になっています。

実際に、boxplot に表示させたいのは、下記のイメージのはずです。

実際に作成したいイメージ

つまり、x軸に指定するのは、「Sample1 に属するか Sample2 に属するか」という情報、y軸に指定するのは、データの値(ここでは read_count という名前)でなければなりません。そのためには、input_data に gather() 関数を使って、プロット用のデータに変換する必要があります。

plot_data <- input_data %>%
  gather(Sample1, Sample2, key = "sample", value = "read_count")

> plot_data
# A tibble: 200 x 2
   sample  read_count
   <chr>        <dbl>
 1 Sample1     0.0145
 2 Sample1     1.00
 3 Sample1     0.193
 4 Sample1     1.45
 5 Sample1    -1.25
 6 Sample1     0.965
 7 Sample1     0.0219
 8 Sample1     0.0158
 9 Sample1     0.802
10 Sample1    -0.387
# … with 190 more rows

変換後のデータ (plot_data) は、元のデータで横に並んでいたサンプルが、縦に並ぶイメージです。sample 列は、”Sample1″ または “Sample2″ の文字列です。数値データは、”read_count” という列名を付けて、縦に格納されています(1サンプルあたり100行あったので、200行のデータになります)。この plot_data を ggplot に用います。

ggplot(plot_data, aes(x = sample, y = read_count)) + geom_boxplot()

これで想定したイメージのボックスプロットになります。最初は、馴染めないかもしれません。しかし、この仕組みを理解すると、ある値に応じて、色を変えたり、ドットの大きさを変えたり、複雑な表現も読みやすく記述できるようになります。