===== ggplot2で折れ線グラフ ===== [[初めての医療統計:index.html|初めての医療統計 目次]] ggplot2は、Rでグラフを描くときに便利なパッケージです。 使い方 1. RStudioにtidyverseを インストール(ggplot2なども自動的にインストールされる) 2. library(tidyverse) 3. 元データを整然データに変換(gather関数) 4. グラフ描画のコードを記載(ggplot関数) 整然データについては、以下のサイトの解説が非常にわかりやすいです。 整然データとは何か\\ http://id.fnshr.info/2017/01/09/tidy-data-intro ===== 開発環境 ===== Windows 8.1 Pro (64-bit)\\ R Studio 1.1.383 ===== 0. RStudioにtidyverseをインストール ===== tidyverseをインストールすることにより、tidyrやggplot2なども自動的にインストールされます。 console画面(RStudioですと、左下の画面内に"console"タブがあると思います。)で、以下を入力して、tidyverseパッケージをインストールします。(ggplot2なども一緒にインストールされます。) install.packages("tidyverse") ===== 1.ExcelデータからR読み込み用csvファイルの作成 ===== エクセルに書き込んでいくのですが、1行目にIDや年齢、糖尿病DMの有無などの項目を並べていき、2行目からは各症例の生データを打ち込んでいきます。できれば、項目もデータも『半角英数字』が望ましいです。もし欠損データがある場合は、『NA』と入力します。 今回は、以下のようなデータを用意します。糖尿病の7症例の3ヶ月間のHbA1c[%]の推移のデータだとします。 ^ ID ^ age ^ sex ^ DM ^ HbA1c00M ^ HbA1c01M ^ HbA1c02M ^ HbA1c03M ^ | 00001 | 56 | M | 1 | 7.3 | 7.4 | 7.3 | 7.4 | | 00002 | 77 | F | 1 | 8.3 | 8.4 | 8.3 | 8.2 | | 00003 | 68 | M | 1 | 7.1 | 7.0 | 7.0 | 7.0 | | 00004 | 81 | F | 1 | 7.6 | 7.4 | 7.3 | 7.4 | | 00005 | 42 | M | 1 | 10.1 | 8.4 | 7.3 | 6.5 | | 00006 | 65 | M | 1 | 6.1 | 6.2 | 6.2 | 6.3 | | 00007 | 68 | F | 1 | 7.8 | 7.4 | 7.9 | 8.4 | エクセルの画面では以下のようになります。 {{:pasted:20171124-072636.png}} 上記のエクセルファイルは、以下からダウンロードできます。 {{book2.xlsx}} ファイル > 名前をつけて保存 > CSV(コンマ区切り)(*.csv) で、"保存"をクリック。 {{:pasted:20171217-003135.png}} この、book2.csvというファイルを、C:/r/R_data/ 下にコピーしておく。(R Notebookでファイルを簡単に指定できるように。) ===== 2.csvファイルの読み込み ===== R Studioの画面で、"File" > "New File" > "R Notebook" をクリック。 {{:pasted:20171217-000522.png}} 下のような画面になる {{:pasted:20171217-000210.png}} チャンクの部分(灰色の部分)に、以下のように記載。 x <- read.csv("book2.csv") x {{:pasted:20171217-003916.png}} チャンクの右側の三角ボタンをクリックして、チャンク内のコードを実行。 {{:pasted:20171217-003957.png}} 以下のようになる。 {{:pasted:20171217-004016.png}} ===== 3.元データを整然データに変換(gather関数)===== ggplot関数を用いてグラフを描画するためには、元データを『整然データ』(tidy data)に変換する必要があります。 整然データ"tidy data"については、以下のサイトの解説が非常にわかりやすいです。 整然データとは何か http://id.fnshr.info/2017/01/09/tidy-data-intro R Studioの画面で、画面右上の方の、"Insert" > "R" で、新しいチャンク(灰色の部分)が挿入されるので、そちらに、以下のコードを記載します。 library(tidyverse) x <- read.csv("book2.csv") data_plot_individuals <- x %>% gather(key, value, -ID, -age, -sex, -DM) data_plot_individuals {{:pasted:20171227-215513.png}} ===== 4. グラフ描画のコードを記載(ggplot関数) ===== 各患者でHbA1cの時系列の折れ線グラフ(IDでグループ分け) library(tidyverse) x <- read.csv("book2.csv") data_plot_individuals <- x %>% gather(key, value, -ID, -age, -sex, -DM) a <- ggplot(data_plot_individuals, aes(x = key, y = value, group = ID, colour = ID)) + geom_line() a {{:pasted:20171227-215800.png}} IDが数値扱いになり、色分けが変な風になってしまう。\\ そのため、as.character()関数を用いて、IDを文字列として認識させてから、ggplot関数でグラフを描画します。 library(tidyverse) x <- read.csv("book2.csv") x$ID <- as.character(x$ID) x data_plot_individuals <- x %>% gather(key, value, -ID, -age, -sex, -DM) a <- ggplot(data_plot_individuals, aes(x = key, y = value, group = ID, colour = ID)) + geom_line() a {{:pasted:20171227-220537.png}} ==== 男女で平均とSDを求める ==== library(tidyverse) x <- read.csv("book2.csv") x$ID <- as.character(x$ID) x data_plot_individuals <- x %>% gather(key, value, -ID, -age, -sex, -DM) group_time_mean_sd <- data_plot_individuals %>% group_by(sex, key) %>% summarize(mean = mean(value), sd=sd(value)) group_time_mean_sd {{:pasted:20171227-222115.png}} ==== 男女で平均とSDを求めて折れ線グラフ ==== library(tidyverse) x <- read.csv("book2.csv") x$ID <- as.character(x$ID) x data_plot_individuals <- x %>% gather(key, value, -ID, -age, -sex, -DM) group_time_mean_sd <- data_plot_individuals %>% group_by(sex, key) %>% summarize(mean = mean(value), sd=sd(value)) b <- ggplot(group_time_mean_sd, aes(x=key, y=mean, group=sex, colour=sex)) + geom_line() b {{:pasted:20171227-222259.png}} ==== 折れ線グラフにエラーバーをつける ==== library(tidyverse) x <- read.csv("book2.csv") x$ID <- as.character(x$ID) x data_plot_individuals <- x %>% gather(key, value, -ID, -age, -sex, -DM) group_time_mean_sd <- data_plot_individuals %>% group_by(sex, key) %>% summarize(mean = mean(value), sd=sd(value)) b <- ggplot(group_time_mean_sd, aes(x=key, y=mean, group=sex, colour=sex)) + geom_line() errors <- aes(ymax = mean + sd, ymin = mean - sd) b <- b + geom_errorbar(errors, width = 0.2) + geom_point(aes(colour=sex, shape=sex), size=4) b {{:pasted:20171227-222408.png}} ===== 参考文献 ===== ggplot2 — きれいなグラフを簡単に合理的に\\ https://heavywatal.github.io/rstats/ggplot2.html Plotting means and error bars (ggplot2)\\ http://www.cookbook-r.com/Graphs/Plotting_means_and_error_bars_(ggplot2)/ 2016-08-22 ggplot2を使って、折れ線グラフを作る-1\\ http://mukkujohn.hatenablog.com/entry/2016/08/22/215632 グラフ描画ggplot2の辞書的まとめ20のコード\\ https://mrunadon.github.io/ggplot2/ 論文用の棒グラフと折れ線グラフをggplot2で描く\\ https://mrunadon.github.io/ThesisPlot/ R言語でデータの並べ替え\\ http://webbeginner.hatenablog.com/entry/2015/06/02/015010\\ ->reshape2パッケージのmelt関数 reshape2\\ http://qh73xebitbucketorg.readthedocs.io/ja/latest/1.Programmings/r/library/reshape2/main/ 整然データ"tidy data"とは何か?\\ http://id.fnshr.info/2017/01/09/tidy-data-intro/\\ 『グラフ作成用のパッケージであるggplot2は、整然データを入力として受け付ける』\\ @wakuteka 2016年12月05日に更新 tidyr::gather( )とtidyr::spread( )でデータフレームを自在に変形する \\ https://qiita.com/wakuteka/items/a16783571794f12af2ac\\ 2017年現在、ggplot2を用いる際には、 library(tidyverse) してから、tidyrパッケージのgather()関数を用いるのがお勧めです。このページでは具体例を用いて解説させていただいています。なお、ggplot2は、tidyverseパッケージに含まれています。 ===== 参考文献2 ===== ggplot2の使い方については、ggplot2の作者が著者の以下の本が非常にお勧めです。 ggplot2を用いたグラフの描き方については、以下の本が非常にお勧めです。 英語ですが、以下のサイトに非常によくまとまっています。 http://www.cookbook-r.com/Graphs/ ===== リンク ===== [[初めての医療統計:index.html|初めての医療統計 目次]] 前:[[RNotebookで折れ線グラフ]] 次:[[ggplot2で論文用の白黒折れ線グラフ|ggplot2で論文用の白黒折れ線グラフ]]