fct_reorder() を使った並び替え
以前、ボックスプロットを並び替える方法を紹介しました。そのときは、あらかじめ、並べたいラベルの文字列を factor() 型で定義しておくというものでした。
もう一つの方法として、tidyverse の fct_reorder() という関数を使う方法を紹介します。プロットするデータの中に、並び順に指定したいスコアが含まれている場合は、 fct_reoder() を使うと便利です。
プロット用に整形したデータは前回と同様です。
> 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
加えて、各サンプルの中央値 (=median) を算出します。サンプルごとにグループ化 (group_by) すると簡単に計算できます。
median_data <- plot_data %>%
group_by(Sample) %>%
summarize("Median" = median(Read_count))
計算結果は、下記のようなテーブルです。
> median_data
# A tibble: 5 × 2
Sample Median
<chr> <dbl>
1 Sample1 9.83
2 Sample2 10.0
3 Sample3 10.2
4 Sample4 9.80
5 Sample5 10.2
プロットデータに inner_join() を使って結合させます。そして、ここで、fct_reorder() を使って、 Sample をファクターに変更します。
plot_data_with_median <- plot_data %>%
inner_join(median_data) %>%
mutate("Sample" = fct_reorder(Sample, Median))
これで、Sample の値が factor 型になり、そのレベルは Median の順になりました。あとは、通常通り、プロットするだけです。
g <- ggplot(plot_data_with_median,
aes(x = Sample, y = Read_count, fill = Sample))
g + geom_boxplot() + scale_fill_brewer(palette = "Spectral")
下記のように Median の低い順に並んだボックスプロットが表示されます。(逆に、降順にしたい場合は、 fct_reorder(Sample, Median, .desc = TRUE) とします。)
この記事が気に入ったらサポートをしてみませんか?