読者です 読者をやめる 読者になる 読者になる

Mukku John Blog

取り組んでいること を つらつら と

ggplot2を使い始める前に

R グラフィックス クックブック 1回目

ggplot2の利用を開始する前に、ggplot2パッケージの考え方にふれておきます。

データグラフィックス

データ属性からグラフィックス内の視覚属性へのマッピングが発生します。

  • データ属性:数値またはカテゴリカルな値
  • 視覚属性:{ \displaystyle x}{ \displaystyle y}の座標値、線の色、棒の高さ

下記の2つは、データの視覚化において同じことを指しています。
データ属性が同じで、視覚属性が異なるだけです。

  • ある数を、{ \displaystyle x}座標の値で表現すること
  • ある数を、点の色で表現する事

グラフィックスの文法は、上記の考え方が中核をなしています。

baseパッケージに含まれるグラフィックス関数は、
データ属性から視覚属性へのマッピングを変えるには、下記を行う必要があります。

  • データ属性の構造を変える
  • 違うグラフィックス関数を使う

ここで、このメンドクサイ仕様に沿って、グラフを作成してみます。

データ属性はこちら。

> simpledat
   A1 A2 A3
B1 10  7 12
B2  9 11  6

棒グラフで、視覚化。

> barplot(simpledat, beside = TRUE)

f:id:MukkuJohn:20160803211943p:plain

ここから、Bを{ \displaystyle x}軸に取る場合は、データ属性の再構築が必要です。

> t(simpledat)
   B1 B2
A1 10  9
A2  7 11
A3 12  6

この再構築したデータを使って、棒グラフで視覚化。

> barplot(t(simpledat),beside = TRUE)

f:id:MukkuJohn:20160803212139p:plain

今度は、折れ線グラフで視覚化。
違うグラフィックス関数を利用して、データ属性の構造も変えるメンドクササ

1本目。Aを{ \displaystyle x}軸に取り、B1行を{ \displaystyle y}軸に取っています。

> plot(simpledat[1, ], type = "l")

f:id:MukkuJohn:20160803212503p:plain

2本目。B2行のデータ。

> lines(simpledat[2, ], type = "l")

f:id:MukkuJohn:20160803212513p:plain

もうね。ちゃんちゃらおかしいんですよ。このグラフ。
まず、{ \displaystyle x}軸。
A1、A2、A3としてしてほしいところですが、1,2,3、、、、

次、2本目の{ \displaystyle x}軸の3の部分。表現しきれてません。

とまぁ、baseパッケージに含まれるグラフィックス関数をディスるのはやめて
ggplot2パッケージを利用してみます。

ggplot2パッケージでのデータ属性

データ属性には、wideフォーマットではなく、longフォーマットが必要になります。
これが、wideフォーマットのデータ

> simpledat
   A1 A2 A3
B1 10  7 12
B2  9 11  6

上で使ったデータのフォーマットです。

そして、これが、longフォーマットのデータ

> simpledat_long
  Aval Bval value
1   A1   B1    10
2   A1   B2     9
3   A2   B1     7
4   A2   B2    11
5   A3   B1    12
6   A3   B2     6

データ構造がはげしく異なります。
行列で表現するよりも、1行でまとまっていますので、シンプルな構造です。

このデータをggplot2パッケージの棒グラフで視覚化します。
Aval列を{ \displaystyle x}軸に、Bval列でグループ化、value列が{ \displaystyle y}軸です。

> ggplot(simpledat_long, aes(x=Aval, y=value, fill=Bval)) + geom_bar(stat="identity",position="dodge")

f:id:MukkuJohn:20160803213725p:plain

Aval列とBval列のマッピングを、Aval列でグループ化、Bval列を{ \displaystyle x}軸に変更します。

> ggplot(simpledat_long, aes(x=Bval, y=value, fill=Aval)) + geom_bar(stat="identity",position="dodge")

f:id:MukkuJohn:20160803213956p:plain

上記の事を行うのに、データ構造の再構築がいりません。


次に、グラフの形を折れ線グラフに変えてみます。

> ggplot(simpledat_long, aes(x=Aval, y=value, colour=Bval, group=Bval)) + geom_line()

f:id:MukkuJohn:20160803214355p:plain

グラフの形を変更するのに、
変更した箇所が、aes引数と + geom_line()部分だけです。

また、baseパッケージの関数と異なり、
複数の線が、まとめて描画されるため、表現されない部分が出てきません。

baseパッケージのグラフィックス関数にあったメンドクササ・困った点が
ggplot2パッケージのグラフィックス関数では解消されています。


棒グラフのコマンドと折れ線グラフのコマンドを見ると、
データ属性のコマンド + 視覚属性のコマンドで構成されている気がします。

ここで、ggplot2パッケージで利用される用語を理解して、
視覚化を行うコマンドの構成を理解を深めたいと思います。

用語の定義と理論

抑える用語は、下記のとおりです。

  • データ
  • 幾何オブジェクト
  • エステティック属性 または エステティック
  • マッピング
  • スケール
  • ガイド
データ

視覚化の対象。変数で構成され、データフレームに列で保存される。

幾何オブジェクト

データを表現するために、描画される棒、折れ線、点など。

エステティック属性 または エステティック

幾何オブジェクトの{ \displaystyle x}{ \displaystyle y}の位置、線の色、点の形。

マッピング

データの値から、エステティックに変換すること(マッピングすること)

スケール

マッピングする際のコントロール。大きい値は、軸を大きく取るなど。

ガイド

視覚属性が、データ空間にどのようにマッピングされているか。目盛りやラベル。

上記の内容を理解するために、こんなデータを用いてグラフを作成してみます。

> dat
  xval yval group
1    1    3     A
2    2    5     B
3    3    6     A
4    4    9     B

まず、データをaes()引数で、エステティックマッピングを行います。

> ggplot(dat,aes(x=xval,y=yval))

エステティックマッピングだけですと、幾何オブジェクトがないため、エラーになります。

次に幾何オブジェクトを指定します。(この例では散布図)
+ geom_point()部分が幾何オブジェクトの指定です。

> ggplot(dat,aes(x=xval,y=yval)) + geom_point()

f:id:MukkuJohn:20160807110037p:plain

エステティックマッピングは変数に格納する事ができます。

> p <- ggplot(dat,aes(x=xval,y=yval))
> p + geom_point()

このコマンドは、上記の散布図と同じです。

エステティックマッピングを、変数に取っておけば、
幾何オブジェクトに対するエステティックマッピングを変更する際の
コマンドの変更量も少なくなります。

> p + geom_point(aes(colour=group))

f:id:MukkuJohn:20160807110631p:plain
このグラフは、このような構成です。

  • エステティックマッピング{ \displaystyle x}軸 = xval/{ \displaystyle y}軸 = yval
  • 幾何オブジェクト:散布図
  • 幾何オブジェクトに対するエステティックマッピング:点の色

点の色幾何オブジェクトに対するエステティックマッピングを指定してみます。

> p + geom_point(colour="blue")

f:id:MukkuJohn:20160807111328p:plain

{ \displaystyle x}軸のスケールを変更してみます。

> p + geom_point() + scale_x_continuous(limits=c(0,8))

f:id:MukkuJohn:20160807111350p:plain
スケールを変更すると、ガイド{ \displaystyle x}軸のメモリ)も変更されています。

散布図の点の色幾何オブジェクトに対するエステティックマッピングスケールを変更してみます。

> p + geom_point(aes(colour=group)) + scale_colour_manual(values = c("orange","forestgreen"))

f:id:MukkuJohn:20160807111359p:plain
ここでも、ガイド凡例が変更されています。

まとめ

ggplot2パッケージを利用するにあたり、この手順を意識して取り組めば良さそうです。
2~5は各々+演算子で独立して、指定可能。

  1. データは、longフォーマットで用意する
  2. データを、エステティックにマッピングする
  3. 幾何オブジェクトを指定する
  4. データを幾何オブジェクトのエステティックにマッピングする
  5. スケールを設定する

次回は、ggplot2パッケージを使っていきます。