R苦手の会#7(Skype読書会)

id:wakuteka主催の読書会7回目です。前回レポ書いてないことに今気づくなど。
今回はここ。

あとid:wakutekaの作ってくれた参考資料があります。

のーと

扱うデータ
> data(VADeaths)
> VADeaths
      Rural Male Rural Female Urban Male Urban Female
50-54       11.7          8.7       15.4          8.4
55-59       18.1         11.7       24.3         13.6
60-64       26.9         20.3       37.0         19.3
65-69       41.0         30.9       54.6         35.1
70-74       66.0         54.3       71.1         50.0

VA(バージニア)における都会、田舎、男女、年齢別の死亡率データ。

棒グラフ(barplot)

VADeathsのような行列形式のデータを与えた場合、列単位で区切って棒グラフにまとめられる。同じ列のデータは積み上げられる。

barplot(VADeaths)


第二引数に数値ベクトルを指定すると棒の幅を操作できる。

barplot(1:10, 1:10)


データを積み上げたくない場合はbeside = TRUEを指定する。また、legendで凡例を描画できる。

barplot(VADeaths, beside=TRUE, legend = rownames(VADeaths))

円グラフ(pie)

使うなってヘルプn(ry

sales <- c(Cherry = 15, Apple =20, Grape = 25, Banana = 10, Other = 30)
pie(sales)


radius=で半径を指定できるのだが、どうも一定の角度ごとにベクトルで指定しているらしく、異なる数値を含むベクトルを与えると面白いことに。

pie(sales, radius=c(0.5, 1))


こういう円グラフだったらまあ許してやろうかなーとか思いませんけどね別に。

ヒストグラム(hist)

irisを使います。

> data(iris)
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

データベクトルを与えてやれば区切り幅とかも適当に決めて(指定もできる)プロットしてくれる。

hist(iris[1:50, 2])


histと一緒によく紹介されるのはMASSパッケージのtruehist。違う区切り方でヒストグラムを描ける。y軸の単位も変わる。

library(MASS)
truehist(iris[1:50,2])


苦手の会ではやらなかったけどhistとtruehist比べると階級数も幅も一緒なのに形が変わってたりしてちょっと気になる。
ここでちょっとggplot2の例を見てみる。
data=irisの中のSepal.Lengthを使ってヒストグラムを描き、中身をSpeciesごとに塗り分ける。

library(ggplot2)
ggplot(iris, aes(Sepal.Length, fill=Species))+
  geom_histogram()


Speciesごとに領域を用意してヒストグラムを描き、ついでに密度関数をプロット。密度関数を重ね描きするときはy軸をdensityに変更すると見栄えが良くなる。

ggplot(iris, aes(Sepal.Length, ..density..)) +
  geom_histogram() + geom_density()+ facet_wrap(~Species) 

折れ線グラフ(matplot)

ここではmatplotを使っている。matplotを使うとmatrixにまとめられたデータを一度にプロットできる。ただrownamesなどは反映されないので綺麗に書くには多少工夫が必要。

matplot(VADeaths, type = "l", axes=FALSE) ## 軸を描かない
CL <- length(VADeaths[,1])   ## 階級数をメモ
axis(1,                      ## 軸の位置 1:下, 2:左
     1:CL,                   ## もとの値(座標)
     row.names(VADeaths))    ## 置き換える値(文字列)
axis(2)                      ## y軸描画
box()                        ## 枠の描画
legend(1, max(VADeaths),     ## 座標
       colnames(VADeaths),
       col = 1:CL,
       lty = 1:CL)

箱ひげ図(boxplot)

あとboxplotがあったけどメモってなかった。というかなんか四分位とかヒンジとかそんな話してた。
参考:

どこかで見たことあるブログとかurlとかカボチャとかでてきてびっくりしただ。

余談

ggplotを使う場合に、生のデータではなくてすでに集計されたデータから棒グラフを描くにはどうすればいいのか、という点についてid:syou6162とちょろっと話したのでメモ。
そもそも

ggplot(iris, aes(Sepal.Length, fill=Species))+
  geom_histogram()

のgeom_histogram()が何をやっているかということをまず。
この中にはstat_bin()というものも含まれていて、それによってcount, densityなどの新しい変数が計算されている。そしてこの新しい変数を使って棒グラフを描画している。
それで、http://had.co.nz/ggplot2/geom_bar.html

If you have presummarised data, use stat="identity" to turn off the default summary

Sometimes, bar charts are used not as a distributional summary, but instead of a dotplot. Generally, it's preferable to use a dotplot (see geom_point) as it has a better data-ink ratio. However, if you do want to create this type of plot, you can set y to the value you have calculated, and use stat='identity'.

とあるように、stat="identity"を指定してやればその集計作業がスキップされて、y軸にセットされた値をそのまま使って棒グラフをプロットできる。
qplotでやるとこんな感じ。

a <- c(1, 8, 6, 11, 24, 15, 9, 12, 7, 3, 2, 1, 1)
b <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14)
qplot(b, a, geom="bar", stat="identity")
  • x軸のデータ: a
  • y軸のデータ: b
  • 形を棒グラフに: geom="bar"
  • データはそのまま使って: stat="identity"

ということ。

ただどうもクラスの情報を見ているらしく、table関数により作成されたtableクラスのオブジェクトだと上手くいかない。ただこれは名前付きのベクトルみたいなものなのでちょっと小細工してやれば通る。

> ## classがtableだと使えない
> qplot(tNn, y=tN, geom="bar", stat="identity")
Error in pmin(y, 0) : object 'y' not found
> ## ベクトルに変換すると使える
> qplot(tNn, y=as.vector(tN), geom="bar", stat="identity")
> ## クラスを書き換えても使える
> class(tN) <- "integer"
> qplot(tNn, y=tN, geom="bar", stat="identity")

では集計済みのデータから積み上げ棒グラフを描くにはどうすればいいのかというとよく分からない。
でもstatでパラメータを計算してプロットしているのだろうから

str(ggplot(iris, aes(Sepal.Length, fill=Species))+
  geom_histogram())

の結果を観察するとかしてパラメータの受け渡し方を考えたら上手いことできるような気もする。
気もするけど今日は眠いのでやらない。