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()

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

 

ggplot2 の基本型

ggplot2 の基本的な書式は、下記のようになっています。

ggplot() + geom_xxx() + スケール + コーディネイト + テーマ + ラベル

最初の ggplot() 関数では、使用するデータを含むオブジェクトと、オブジェクトのうち、実際使用するデータをaes()で宣言します。次の geom_xxx() 関数で、ヒストグラムや、散布図、ヒートマップといった表示形式を宣言します。 geom_bar(), geom_point(), geom_tile() などがあります。ここまでが、グラフの描画に最低限必要なオブジェクトです。

ある値に応じて、プロットの色やサイズを変更する場合は、スケールの部分で指定します。scale_fill_gradient() 関数や、scale_size() 関数があります。

コーディネイトの部分は、必須ではありませんが、描画する範囲 (従来の xlim, ylim に近い) を指定する場合に用います。coord_cartesian() 関数や、プロットの向きを回転させる coord_flip() 関数などがあります。

テーマの部分で、見た目の変更を行います。プロットの背景や、各軸の目盛りの書式などがまとめて定義されたテーマを指定できます。モノクロのテーマ (theme_bw), 明るいテーマ(theme_light), 従来のスタイル (theme_classic), 背景なし (theme_void) などがあります。

ラベルの部分で、x軸のラベル、y軸のラベル、タイトル、キャプションなどを指定します。labs( x = "x軸ラベル", y = "y軸ラベル", title ="タイトル")

全て指定すると、下記のようなコードになります。(1行に書く必要はありません。途中で、改行を入れることができます。)

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

ggplot(input_data, aes(Sample1)) +
  geom_histogram(bins = 20, aes(fill = ..x..)) +
  scale_fill_distiller(palette = "Blues") +
  coord_cartesian(xlim = c(-2, 2)) +
  theme_light() +
  labs(title = "histogram", y = "read count")
設定を変更したヒストグラムの例

オブジェクトの保存

途中のコードをオブジェクトとして保存することもできます。確定している部分をオブジェクトにすることで、テーマだけ変更して確認したりといった、コードの再利用もしやすくなります。

オブジェクトに格納した段階では、グラフの描画は行われません。オブジェクトをコールした時点(=オブジェクトに代入しなかった場合)で描画されます。

g  <- ggplot(input_data, aes(Sample1))                 # g に格納。
gg <- g + geom_histogram(bins = 20, aes(fill = ..x..)) # gg に格納。

# グラフは、下記でコールされた時点で描画される。
gg + scale_fill_distiller(palette = "Blues") +
  coord_cartesian(xlim = c(-2, 2)) +
  theme_light() +
  labs(title = "histogram", y = "read count")
 

ggplot2 を使った作図方法

tidyverse では、 ggplot() 関数を用いて図を作成します。従来の plot 関数と異なり、多次元のデータも、2次元に並び替える必要があるため、多少、慣れが必要です。

まずは、1次元のデータを例に、ggplot の作法を紹介します。(この場合は、並び替える必要はありません。)

> # 適当なデータを100個生成
> input_data <- tibble("Sample1" = rnorm(100))
> 
> input_data
# A tibble: 100 x 1
   Sample1
     <dbl>
 1 -1.64
 2  1.91
 3  0.890
 4  0.178
 5  0.0393
 6 -1.09
 7  0.544
 8  0.387
 9 -2.48
10 -0.309
# … with 90 more rows
>
>
> ggplot(input_data, aes(Sample1)) + geom_histogram(bins = 20)

ggplot() 関数で、どのオブジェクトのどの列を使うかを指定します。その際、列のデータは、aes() の形式で指定します。上記では、count の列を指定しています。

ggplot の後の 「+」 に続く関数で、図の種類を指定します。上記では、 geom_histogram() として、ヒストグラムを指定しています。(bins = 20 は、ヒストグラムの細かさを指定するオプション。)

ウィンドウが開き、下記のような画像が表示されます。

ヒストグラムの例

画像を保存するには、 ggsave() 関数を用います。ファイルの形式は、拡張子 (.png, .pdfなど) から、自動で判断されます。(従来コードのように、いちいちデバイスを指定しなくて済むので楽です。)

ggsave("ファイル名.png")

> ggsave("histogram_image.png")
Saving 7 x 7 in image

オプションなしで、 ggsave 関数を使用すると、その時点で表示されているウィンドウの大きさで画像ファイルが作成されます。上記の場合は、7 インチ x 7 インチのサイズで保存されています。明示的に、サイズを指定する場合は、次のように width, height, unit オプションで指定します。

> ggsave("histogram_image.png", width = 7, height = 7, unit = "in")

その他の1次元データを表示する関数は、 geom_dotplot(), geom_density(), geom_bar() などがあります。 チートシートでは、 one variable の項目で紹介されています。

ggplot2

https://ggplot2.tidyverse.org