第3章ではggplot2を使ったグラフの作り方を紹介しています。


【3-1】ExcelにはないRでグラフを作るメリットと特徴

【3-2】ggplot2でグラフを作る流れを説明します

【3-3】Rのggplot2で散布図を作るgeom_point関数

【3-4】Rのggplot2でヒストグラムを作るgeom_histogram関数

【3-5】Rのggplot2で密度曲線を作るgeom_density関数

【3-6】Rのggplot2で箱ひげ図を作るgeom_boxplot関数

【3-7】棒グラフの基本とRのggplot2で棒グラフを作るgeom_bar関数

【3-8】ggplot2で折れ線グラフを作るgeom_line関数



今回はヒートマップを紹介します。



ヒートマップはx軸,y軸だけでなくタイルの色で3次元的な表現ができます。
ヒートマップといえば天気アプリの雨雲予報などでも見られますが、今回は集計したデータを折れ線グラフとヒートマップで比べてみるとどうなるかをRのコードを書きながら紹介したいと思います。


1.使用するデータ

今回は【2-7】Excelの複数シートをRで一気に読み込むで取り込んだデータを使用します。
ただすぐに始められるように以下のコードを用意しました。
氏名、年齢、病院で使用するFIMという架空のデータです。
FIM18項目ありそれぞれ1〜7点で採点します(合計18〜126点)。
またFIMを3回計測し、sheetという列には1回目,2回目,3回目が入っています。

url <- "https://github.com/mitti1210/myblog/blob/master/fim.csv?raw=true"

dat <- read.csv(url)


2.データハンドリング

今回はFIMの中でもFIM_食事のデータだけを使います。
dat_eat:datから氏名,sheet,FIM_食事の列だけを抜き出す
dat_eat_summarize:dat_eatからsheet毎の平均を集計
dat_eat_stat:1〜7点がそれぞれ何人ずついるかカウント


今回はselect関数, rename関数, group_by関数, summarize関数, n関数, この後グラフ作成で使うggplot2関数は全てtidyverseパッケージに含まれます。

まだtidyverseパッケージを一度も使ったことがなければインストールします。
install.packages("tidyverse")
既にインストールしていればlibrary関数で呼び出します。
library(tidyverse) 

もしデータハンドリングを練習しているところであれば下のコードをみながら作成してみてください。

dat_eat <- 
dat %>%
select(氏名, sheet, FIM_食事) 

dat_eat_summarize <-
dat_eat %>%
group_by(sheet) %>%
summarize(平均 = mean(食事), 項目 = "食事")

dat_eat_stat <-
dat %>%
select(FIM_食事, sheet) %>%
group_by(sheet, FIM_食事) %>%
summarize(n = n())
 
スクリーンショット 2019-08-23 2.47.56
ポイントは以下2つです。
dat_eat_summarizeでは折れ線グラフを作成するのに項目という列を追加しました。
dat_eat_statで個数を数える場合はn()を使います。()の中は何も入れません。

まだなれない場合は下のリンクを参照してください。

【2-4】Rで指定した列や行だけを取り出すselect関数、slice関数、filter関数を紹介します

【2-6】Rでgroup_by関数とsummarize関数を使ってグラフ作成に必要な統計量(平均や標準偏差など)を求める

【演習2】データハンドリングの基礎を復習します


3.折れ線グラフを作る

まずは折れ線グラフを作ってみます。
折れ線グラフはgeom_line関数、数値を入れる場合はgeom_text関数です。

参照:【3-8】ggplot2で折れ線グラフを作るgeom_line関数


平均の折れ線グラフ

まずdat_eat_summarizeを使って平均の折れ線グラフを作ります。
ylim関数はy軸の最大値と最小値を設定します。

ggplot() +

theme_classic(base_family = "HiraKakuPro-W3") +
geom_line(data = dat_eat_summarize, aes(x = sheet, y = 平均, group = 項目), color = "red") +
geom_text(data = dat_eat_summarize, aes(x = sheet, y = 平均, label = 平均), vjust = -1, color = "red") +
ylim(0, 7)
スクリーンショット 2019-08-23 2.07.44



実際の生データと平均を組み合わせる

要約としてはこれでもいいですが、実際のデータも確認してみたいと思います。

実際のデータはdat_eatにあるので使います。group = 氏名 にすると患者毎の折れ線グラフを作ることができます。またcolor = "gray" として薄くしたほうが平均の線が目立ちます。

ggplot() +

theme_classic(base_family = "HiraKakuPro-W3") +
geom_line(data = dat_eat, aes(x = sheet, y = FIM_食事, group = 氏名), color = "gray") +
geom_line(data = dat_eat_summarize, aes(x = sheet, y = 平均, group = 項目), color = "red") +
geom_text(data = dat_eat_summarize, aes(x = sheet, y = 平均, label = 平均), vjust = -1, color = "red")
 
スクリーンショット 2019-08-23 2.07.51



4.ヒートマップを作る

上の折れ線グラフもいいのですが、線が重なっているので数字が多いのか少ないのかわかりません。
そのため次はヒートマップを作成してみます。

ヒートマップはgeom_tile関数、またはgeom_raster関数です。

geom_tile関数でヒートマップの色を指定するのにfillを指定します。
使うデータはdat_eat_stat, x軸にsheet(1〜3回目) , y軸にFIM_食事(1〜7点), 色をn(カウント数)としたいので以下になります。

geom_tile(data = dat_eat_stat, aes(x = sheet, y = FIM_食事, fill = n)) 

ggplot() +
	
theme_gray(base_family = "HiraKakuPro-W3") +
geom_tile(data = dat_eat_stat, aes(x = sheet, y = FIM_食事, fill = n))
 
スクリーンショット 2019-08-23 2.07.59



5.タイルの色を変える

タイルの色を変えるにはscale_fill_gradientn関数を使います。
折れ線グラフの線の色を変える時はscale_color_gradientn関数でした。
今回は中の色を指定するのでcolorではなくfillになっています。
colours =で2色指定するとグラデーションができます。
3色以上指定すると中間の色も指定できます。

ggplot(data = dat_eat_stat) +

theme_gray(base_family = "HiraKakuPro-W3") +
geom_tile(aes(x = sheet, y = FIM_食事, fill = n)) +
scale_fill_gradientn(colours = c("yellow", "red"))
スクリーンショット 2019-08-23 2.08.06

すると1→3回目になるにつれて7点が増えていることがわかります。


6.ヒートマップに数値を加える

ヒートマップで傾向はつかめますが数値も欲しいところです。
棒グラフや折れ線グラフの時と同様にgeom_text関数を使います。

【3-7】棒グラフの基本とRのggplot2で棒グラフを作るgeom_bar関数

【3-8】ggplot2で折れ線グラフを作るgeom_line関数


ggplot() +

theme_gray(base_family = "HiraKakuPro-W3") +
geom_tile(data = dat_eat_stat, aes(x = sheet, y = FIM_食事, fill = n)) +
scale_fill_gradientn(colours = c("yellow", "red")) +
geom_text(data = dat_eat_stat, aes(x = sheet, y = FIM_食事, label = n))
 

よく見るとgeom_tileもgeom_textも"data = dat_eat_stat, aes(x = sheet, y = FIM_食事" までは同じなので下のようにまとめることができます。
ggplot(data = dat_eat_stat, aes(x = sheet, y = FIM_食事)) +
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_tile(aes(fill = n)) +
  scale_fill_gradientn(colours = c("yellow", "red")) +
  geom_text(aes(label = n)) 
スクリーンショット 2019-08-23 2.08.14


数値が入ったことで見やすくなりました。



7.ヒートマップに折れ線グラフを組み合わせる

更にヒートマップと折れ線グラフを重ねてみます。
ポイントは下に書いたコードが上に配置されます。

1番上:数値
2番目:折れ線グラフ
3番目:ヒートマップ

順番が大事です。

ggplot() +

theme_gray(base_family = "HiraKakuPro-W3") +
geom_tile(data = dat_eat_stat, aes(x = sheet, y = FIM_食事, fill = n)) +
scale_fill_gradientn(colours = c("yellow", "red")) +
geom_line(data = dat_eat, aes(x = sheet, y = FIM_食事, group = 氏名), color = "gray") +
geom_text(data = dat_eat_stat, aes(x = sheet, y = FIM_食事, label = n))
 
スクリーンショット 2019-08-23 2.08.21


これで十分ではありませんが、数値の変化も少し追えるようになりました。


8.全部のグラフを重ねる

過剰かもしれませんが、上のグラフに平均の折れ線グラフも加えてみます。
順番に注意してください。

ggplot() +

theme_gray(base_family = "HiraKakuPro-W3") +
geom_tile(data = dat_eat_stat, aes(x = sheet, y = FIM_食事, fill = n)) +
scale_fill_gradientn(colours = c("yellow", "red")) +
geom_line(data = dat_eat, aes(x = sheet, y = 食事, group = 氏名), color = "gray") +
geom_line(data = dat_eat_summarize, aes(x = sheet, y = 平均, group = 項目), color = "red", size = 1.5) +
geom_text(data = dat_eat_stat, aes(x = sheet, y = FIM_食事, label = n)) +
geom_text(data = dat_eat_summarize, aes(x = sheet, y = 平均, label = 平均), vjust = -1, color = "black")
 
スクリーンショット 2019-08-23 2.08.28




9.まとめ

今回はヒートマップを紹介しました。
難しそうに感じますが、x軸とy軸にfillを加えるだけでヒートマップができてしまいます。
いろいろアイデアを試してみるとggplot2やその前のデータハンドリングの理解にもつながりますので、3章の他のグラフも見ながらグラフ作成に挑戦してみてください。