見出し画像

ggplot2: ボックスプロットを並び替える

ggplot2 でボックスプロットを作成するとき、X軸のデータの並び方(例では Sample) は、自動的に決められています。内部では、aes() の x に指定した列の値を factor 型のデータとして扱い、アルファベット順に並べて表示されます。

指定しない場合のボックスプロット

下記の例の場合、文字列として、Sample1, Sample2, Sample3, … となっているのは、番号の若い順に並べられたためです。もとの input_data の列の並びが反映されたわけではありません。この並びを直接指定するには、少しコツが入ります。

boxplot
ボックスプロット:横軸の並びは自動的にソートされている。
> input_data
# A tibble: 100 × 5
   Sample1 Sample2 Sample3 Sample4 Sample5
     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1   11.1    10.3     8.03    8.39   11.1
 2    9.80   10.9    10.4     9.78    8.98
 3    9.22   11.8     8.45    9.85   10.3
 4   10.2    10.3    13.0     9.28    9.30
 5   10.8    10.9    11.3    11.0    11.0
 6    9.54    9.46   10.4    11.8    10.6
 7   10.4     9.64    8.52    8.44    8.68
 8   11.0    11.2    10.6     9.31    9.96
 9   10.7    10.2     9.27   12.0     9.28
10   10.4    11.1    10.7     9.90   11.5
# … with 90 more rows
# ℹ Use `print(n = ...)` to see more rows

input_data を gather で整形してから ggplot() 関数に渡すため、この状態の並びは影響しません。(これを並び替えても結果は変わりません。)

factor() に levels を指定して並び替え

X軸のデータ(例ではサンプル)の並びを任意に指定したい場合は、 gather() で整形した際に、サンプルを factor() 型のデータに変換します。そのとき、factor() の引数に levels として、並びを指定する文字列を渡します。

ボックスプロット用に整形したデータ

冒頭のボックスプロットを作成するために整形したデータ (plot_data) は、下記のようになっています。

> plot_data <- input_data %>%
+   gather(starts_with("Sample"), key = "Sample", value = "Read_count")

>
> plot_data
# A tibble: 500 × 2
   Sample  Read_count
   <chr>        <dbl>
 1 Sample1      11.1
 2 Sample1       9.80
 3 Sample1       9.22
 4 Sample1      10.2
 5 Sample1      10.8
 6 Sample1       9.54
 7 Sample1      10.4
 8 Sample1      11.0
 9 Sample1      10.7
10 Sample1      10.4
# … with 490 more rows
# ℹ Use `print(n = ...)` to see more rows

この plot_data は、2列のテーブルです。1列目は、X軸に指定する予定のデータで、Sample1 が 100個、 Sample2 が100個、、、と続く500行のデータです。この状態では、Sample 列の型は、character型なので、「<chr>」と表示されています。

factor 型に変換して levels を指定

この character 型の Sample を factor 型に変換するには、 mutate を使います。mutate("Sample" = factor(Sample)) とすると変換できます。その際、引数の levels に希望の順序に並んだ文字列を指定します。ここでは、サンプルの順序を指定した文字列として、下記のような sample_order を定義して使用しました。

sample_order <- c("Sample5", "Sample3", "Sample2", "Sample1", "Sample4")

plot_data <- input_data %>%
  gather(starts_with("Sample"), key = "Sample", value = "Read_count") %>%
  mutate("Sample" = factor(Sample, levels = sample_order))

plot_data と入力して、中身を確認すると、下記のように <chr> から <fct> に変わっていることが分かります。

> plot_data
# A tibble: 500 × 2
   Sample  Read_count
   <fct>        <dbl>
 1 Sample1      11.1
 2 Sample1       9.80
 3 Sample1       9.22
 4 Sample1      10.2
 5 Sample1      10.8
 6 Sample1       9.54
 7 Sample1      10.4
 8 Sample1      11.0
 9 Sample1      10.7
10 Sample1      10.4
# … with 490 more rows
# ℹ Use `print(n = ...)` to see more rows

この plot_data を使用して、ボックスプロットを作成します。ボックスプロット部分のコードに変更はありません。

ggplot(plot_data, aes(x = Sample, y = Read_count, fill = Sample)) +
  geom_boxplot() + scale_fill_brewer(palette = "Spectral")

並び替えられたボックスプロットが表示されます。今回、指定した文字列 sample_order は、中央値の高い順に並べた時のサンプルの順序です。

boxplot reordered
並び替えたボックスプロット


この記事が気に入ったらサポートをしてみませんか?