!データを視覚化する データ処理を学ぶに当たってはデータ理解の基本である統計学の知識やデータを処理するためのデータベースや分析ツールの技能が必要となる。 さらには、データから得られる知見を形にするための視覚化のノウハウも習得する必要がある。視覚化には、グラフによる表現が典型的である。 Rにはグラフ表現のためにplot()という関数が標準的に用意されている。それを使いこなすだけでもかなりのことが表現できるが、さらに細かい設定をしたり使い勝手という面を考えると、ggplot()がお勧めである。ggplot()は、Rにおけるグラフ表現の事実上の標準となっているようだ。 !ggplot()の思想 グラフの作成は、如何にして分析の結果を正しく伝えるかというところに重点を置くべきで、装飾の部分に神経を使うのは本末転倒である。そのような考え方で、レイヤ別にグラフの要素を作成して重ね合わせるという考え方が採られているようだ。 詳しくは、ggplotの開発者でもあるHadley Wickamのサイトに掲載されている論文を参照する。 * [A layered grammar of graphics|http://vita.had.co.nz/papers/layered-grammar.html] {{category グラフ作成}} 湯谷さんに教わったところでは、 ""基本はレイヤーごとにデータとマッピングがあって、 ggplot() や + aes() でプロット全体に指定することもできる、という理解でいいかと思います(実際にはレイヤーごとに指定するのはめんどくさいので後者でやることが多いとは思いますが) ! ggplotのパラメタについて こちらを参照 http://triadsou.hatenablog.com/entry/20100528/1275042816 * identity: 無変換(そのまま) * stack: 積み重ね * dodge: ずらす * step: 階段状 * density: 密度変換 * ecdf: 経験的累積分布変換 ! ggplotの基本的な書き方 :以下、r-wakalangの@ill_identifiedさんに教わった。 ""以下はこれに基づいた私なりの解釈です ""geom = データをどう表示するか ""stat = データをどう統計的に加工するか * 元データ require(ggplot2) df <- data.frame( x = c(rnorm(100, 0, 3), rnorm(100, 0, 10)), g = gl(2, 100) ) * レイヤを描く ggplot(df, aes(x)) + layer(geom = "density", stat = "density", position = "identity") ggplot(df, aes(x)) + layer(geom = "line", stat = "density", position = "identity") ggplot(df, aes(x)) + layer(geom = "density", stat = "ecdf", position = "identity") 以下の関数を使うと、そのグラフタイプのデフォルト値があるので変数を省略できる。この省略が初心者にはわかりにくいつまづきどころ。 * stat_系の関数(ラッパー)を使う ggplot(df, aes(x)) + stat_ecdf(geom = "step") ggplot(df, aes(x)) + stat_density(geom = "density", position = "identity") * geom_系の関数(ラッパー) ggplot(df, aes(x)) + geom_step(stat = "ecdf") ggplot(df, aes(x)) + geom_density(stat = "density", position = "identity") ggplot(df, aes(x)) + geom_line(stat = "density", position = "identity") ggplot(df, aes(x)) + geom_density(stat="ecdf") ggplot(df, aes(x)) + geom_step(stat="ecdf") また同じく、ill_identifiedさんに教わった下記のリンク先の解説もわかりやすい。 * [What is the difference between geoms and stats in ggplot2?|https://stackoverflow.com/questions/38775661/what-is-the-difference-between-geoms-and-stats-in-ggplot2] !日本語文字化け対策 ggplotによるグラフをxelatex経由PDFで出力しようとすると、日本語フォントが化けたり落ちたりする。 どうやらHTML出力の時は、文字化けすることはないがXelatexを使うときには対策が必要らしい。 Ubuntu環境ではとりあえず、以下のチャンクオプションで凌いでいるが、リクツはよくわからない。 knitr::opts_chunk$set(dev = "cairo_pdf", dev.args = list(family = "ipaexg")) 以上の設定で注意が必要なのは、knit2PDFのときにはグラフもPDFで出力するので上記で問題ないが、逆にHTML出力(slidyなども含む)の時は、このオプションを使うとPDFに出力されがグラフが読み込まれるので、通常のpngを前提とした表示などが壊れてしまう。 r-wakalangで@ill_identifiedさんに教わったところでは、 ""どのOSでもXeLaTeX (より正確には画像をPDF形式で埋め込む/保存する場合) の場合は cairo_pdf にするのが安牌です. ""[奥村先生のページ|https://oku.edu.mie-u.ac.jp/~okumura/stat/first.html ]にも少しだけ書いてありますが, だいたいどのOSでもうまくいくことが多いです. ""cairo_pdf を薦める理由の1つに, フォント指定が環境に依存することが多いが, cairo_pdf ならあまり気にしなくていいという点があります. ""日本語を表示するだけならPNGとかでもいいですが, せっかくpdfで出してるので画像もベクタ形式にしたほうがきれいに見えるという利点 ただ困ったことに、cairo_pdfを設定してslidyをやると、グラフの部分のPDF表示がおかしくなります。具体的にはブラウザのPDF表示で出てくるツールメニュ部分が含まれて、グラフが半分に切れたりする。 ""slidy は html で書かれているので, それはお使いのブラウザの設定の問題だと思います (私の場合はそもそもpdfが表示されません) ""htmlで, かつベクタ画像だったら svg なら今はだいたいのブラウザで表示できるのでpdfよりいいかもしれませんね. 冒頭のチャンクに以下のような記述をしてみてください (お遊びで「青柳隷書しも」というフォントを指定してますがそこは適宜変更してください) ""なおこの方法だと文字も画像として埋め込まれるのでテキスト検索に引っかかないはずです knitr::opts_chunk$set(dev = "svg", dev.args = list(family = "aoyagireisyo2")) ! 参考 :ill-identifiedさんのまとめ: * [おまえはもうRのグラフの日本語表示に悩まない (各OS対応)|https://ill-identified.hatenablog.com/entry/2020/10/03/200618] ! 付録 :参考::Rで解析:RStudioのR MarkDownのPDFで日本語を扱う環境設定 * https://www.karada-good.net/analyticsr/r-633 * [Rmarkdownで日本語PDFを出力する|https://qiita.com/Atsushi776/items/9ef1e5d744e2b91c61ee#%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AB%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88] * https://www.trifields.jp/how-to-set-up-for-outputting-a-pdf-of-the-japanese-at-knitr-in-ubuntu-1404-and-r-1615