Rで折れ線グラフ(2)

繰り返すが、折れ線グラフを描くだけなら、エクセルが簡単。

https://dekiru.net/article/12622/

繰り返し、折れ線グラフをかく機会があったため、また、自分好みのグラフを描きたいため、Rで折れ線グラフをかけるようになりたいと思って、今回、わざわざ面倒なRでグラフをかこうと四苦八苦している。私レベルでは、こんなことでもとても難しい、、、

前回は、他のサイトの写経してみた。

Rで折れ線グラフ(1)
折れ線グラフを描くだけなら、エクセルが簡単。 繰り返し、折れ線グラフをかく機会があったため、また、自分好みのグラフを描きたいため、Rで折れ...

個人的に、時系列データをグラフにしたいのだが、ググってみると、時系列データが縦に並んでいるものの解説が多い。

http://yyhhyy.hatenablog.com/entry/2015/10/24/203000

しかし、私の手元によくあるデータは、一番左の列に個体番号が並んでいて、時系列は横に並んでいるようなデータ。例えば、

https://stat.biopapyrus.net/data/rat.food.txt

のデータ。しかも、その一部分を抜き出したい。

いろいろググってみて、tryしてみる。

(環境)
Windows8.1
Anaconda3 4.1.1(64-bit)

(参考)

biopapyrus
biostatistics > グラフィックス > 折れ線グラフ
2015.05.04
https://stat.biopapyrus.net/graph/lines.html

Rでデータフレームからデータを抽出(検索)
gigatune
2016年01月16日に更新
http://qiita.com/gigatune/items/f3aa0afef7f50ab791cd

(0)ファイルを保存したい場所でcmd.exe(コマンドプロンプト)またはGit Bash Hereして、

jupyter notebook

new > R で、oresen002 という名前で保存して始めていく。

image

(1)データの取り込み

今回は、

biopapyrus
biostatistics > グラフィックス > 折れ線グラフ
2015.05.04
https://stat.biopapyrus.net/graph/lines.html

の方の、ラットの体重データを自分のパソコンにダウンロードして、取り込む。

https://stat.biopapyrus.net/data/rat.food.txt

のリンクを右クリックして、「名前をつけてリンク先を保存」で、ダウンロードして、そのまま保存。(rat.food.txt)

x <- read.table("rat.food.txt", header = TRUE)
head(x, 10)

image

ここで、うまくいかない場合は、

「txtファイルの文字コードが UTF-8 になっているか」
「txtファイルの改行コードの、BOM(?)のチェックははずれているか」

などをさくらエディタなどで開いてチェックする。

image

うまくいかなければ、エクセルファイルで開いて、csv形式で保存して、

x <- read.csv("rat.food.csv", header = TRUE)
head(x, 10)

とするのがよいかもしれない。

(2)csvファイルを取り込む場合

image

image

image

image

csvファイルで保存。rat.food.csv という名前で保存。

image

y <- read.csv("rat.food.csv", header = TRUE)
y

image

(3)すべてのデータを折れ線として描く

各個体それぞれの体重遷移を折れ線グラフに描く例。

これは、下記サイトのコードをコピペすればよい。

https://stat.biopapyrus.net/graph/lines.html

xaxis <- 1:ncol(x[, -1])          # x 軸座標を設定
cols <- c("red", "blue", "green") # PF を赤色、C を青色、G を緑色

# 描画の準備
plot(0, 0, type = "n", xlim = range(xaxis), ylim = range(x[, -1]),
     xlab = "Date", ylab = "Weight")

# 各個体のデータを折れ線として描く
type <- unique(x[, 1])            # 餌の種類を取得
for (i in 1:nrow(x)) {
  lines(xaxis, x[i, -1], col = cols[c(1:length(cols))[type == x[i, 1]]])
}

# グラフに凡例を書き入れる
legend("topleft", legend = type, lty = 1, col = cols)

image

このコードを少し、解読してみる。

(参考)
21. 行列の操作
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/21.html

x[,-1]

まず、これがググっても本当に分からなかった。試しに、

x[,-2]
x[,-3]

としてみたら、

image

image

となり、結局、おそらく、

x[,-1] # table xから、1列目を消去したtableを作成

x[,-2] # table xから、2列目を消去したtableを作成
x[,-3] # table xから、3列目を消去したtableを作成

だろうということが分かった。

(3)ncol() 関数

(参考)
21. 行列の操作
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/21.html

行列xの行数を求めるときは、nrow()関数。列数を求めるときは、ncol()関数を用いる。

dim(x) # 行列xの行数と列数を返す

nrow(x) # 行列xの行数を返す

ncol(x) # 行列xの列数を返す

ということで、今回は、

ncol(x[,-1]) #=> 8

image

となる。

(4)規則性のあるベクトルの作成

(参考)
12. ベクトルの作成
規則性のあるベクトルの作成
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/12.html

●ベクトルを作成する基本的な関数は c() である.

image

●規則性のあるベクトルの作成

1:7    # 1 から 7 まで 1 づつ増加するベクトルを作る

比率にしか見えないんだけど、、、ベクトルだそうです。。。

image

ということで、今回は、以下のようなxaxis というベクトルが作成される。

image

本当は、グラフのx軸は、Day0, Day1, Day2, … , Day7 となってほしいのだけれど、それについては、また次回以降で。。。今は写経写経と、、、

(5)plot()関数、描画の準備

(参考)以下のサイト、本当に便利!

48. とりあえず plot()

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/48.html

x <- 1:10
y <- 1:10                # plot(x 軸のデータ, y 軸のデータ, オプション)
plot(x, y)               # 範囲は自動で決まる(xlim=c(1,10)を指定した場合と同じ)

image

(参考)

2010-12-20
MikuHatsune2010-12-20
12/20 プログラミングセミナー plotの軸がうまくいかないのだが
http://d.hatena.ne.jp/MikuHatsune/20101220/1292850583

2010-12-25 0と1と-1とでできた正方行列
ryamada2010-12-25
■[R]軸の表示いろいろ 23:04
http://d.hatena.ne.jp/ryamada/20101225/1292853846

plot()関数には、いろいろなオプションがあって、軸を消したい場合は、axes=FALSE オプションを記載する。

par(mfrow=c(2,2))

plot(1:100,rnorm(100),axes=FALSE,xlab="axis(1)",ylab="axis(2)",main="axes=FALSE")
axis(1)

image

par(mfrow=c(2,2))

plot(1:100,rnorm(100),axes=FALSE,xlab="axis(1)",ylab="axis(2)",main="axes=FALSE")
axis(1)

axis(2)

image

● range()関数

59. 基本統計量の算出
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/59.html

range() 関数は、ベクトルの要素の最小値と最大値を返す

今回は、行列x[, -1]の要素の最小値と最大値を求めて、y軸(今回はラットの体重)の表示する範囲を指定している。

image

image

横軸(xlim)が、1から8までの整数、縦軸(ylim)が160から約300まで表示されている。

(6)各個体のデータを折れ線として描く

ここまででも、私にはヒーヒーといった感じだが、ここから、さらに難しくなってくる。

# 各個体のデータを折れ線として描く
type <- unique(x[, 1])            # 餌の種類を取得
for (i in 1:nrow(x)) {
  lines(xaxis, x[i, -1], col = cols[c(1:length(cols))[type == x[i, 1]]])
}

image

nrow(x) は、行列xの行数(headerはカウントしない)を返すらしい。

●for による繰り返し

for ( ループ変数 in リスト )

たとえば、

for (i in 1:10)) {
  (iを含む式)
}

では、(iを含む式)の、iに、1、2、3、、、、10を代入した式の結果を返す。

image

今回は、

for (i in 1:nrow(x)) {
  (iを含む式)
}

なので、i=1, 2, 3, … , (行列xの行数(headerを除く)(今回は15)) を、(iを含む式)に代入したものを返す ことになる。

(参考)30. 繰り返し文
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/30.html

(7)lines() 関数

lines(xaxis, x[i, -1], col = cols[c(1:length(cols))[type == x[i, 1]]])

lines()関数というものは、「低水準作図関数」らしい。なるほど、まったくわからん。とにかく、lines()関数を使って折れ線グラフをかくときは、その前に、必ず、plot()関数でグラフをかく必要があるらしい。

まずは、高水準作図関数(たとえば、plot())でメインのグラフを作る。
低水準作図関数(たとえば、lines())は、高水準がないと存在しえない。

さらに、ここが微妙に分かりにくいのだが、

(x1,y1)-(x2,y2)のラインを引くときは、

lines(c(x1,x2),c(y1,y2)
とする。

らしい。これは、私の感覚とはだいぶ異なるので、最初、だいぶ戸惑った。

(例)

plot(1:10)  # まず、高水準作図関数を作成

lines(c(0,1),c(1,1))    # 座標(0,1)-座標(1,1)
lines(c(1,3),c(1,3))    # 座標(1,1)-座標(3,3)
lines(c(5,5),c(0,5))    # 座標(5,0)-座標(5,5)
lines(c(2,5),c(4,9))    # 座標(2,4)-座標(6,9)

上記の例で、点A(2,4)と、点B(6,9)をつなぐ線分を描くのに、lines(c(2,6), c(4,9))と、なんともわかりづらい描き方になる。3点をつなぐときのことも試してみると、理解しやすいかもしれない。

image

(参考)下記PDFファイルのP30-P31(plot関数について)
https://cran.r-project.org/doc/contrib/manuals-jp/Mase-Rstatman.pdf

cars     # 行列carsが、デフォルトでRに入っている

dim(cars) # 行列carsの行数と列数を求める

plot(cars) # lines(cars)よりも先にplot(cars)が必要

lines(cars) # 折れ線グラフの描画

image

image

image

次に、(1,1), (2,2), …, (10,10)の点をplotして、折れ線グラフでつなげてみる。

plot(1:10) # この書き方だと、x軸は指定していない気がする、、、
lines(1:10)

image

(8)今回のグラフ

以下の文の、i = 1 のときを考えてみる。

for (i in 1:nrow(x)) {
  lines(xaxis, x[i, -1], col = cols[c(1:length(cols))[type == x[i, 1]]])
}

i = 1, length(cols))=3 のときは、for文の中身が、以下のようになる。

lines(xaxis, x[1, -1], col = cols[c(1:3)[type == x[1, 1]]])

x[1,1] = PF なので、

lines(xaxis, x[1, -1], col = cols[c(1:3)[type == "PF"]])

type は、[PF, C, G]というベクトルなので、c(1:3)[type == “PF”] は、1 となり、

lines(xaxis, x[1, -1], col = cols[1])

xaxisと、x[1,-1]を入れて書き直すと、

lines(c(1,2,3,4,5,6,7,8),

c(200,203,195,192,187,185,184,178),

col = "red"])

image

結局、i = 1 のときの折れ線グラフは以下のようになる。

x <- read.table("rat.food.txt", header = TRUE)

xaxis <- 1:ncol(x[, -1])          # x 軸座標を設定

# 描画の準備 (高水準作図関数plot()を描画)
plot(0, 0, type = "n", xlim = range(xaxis), ylim = range(x[, -1]),
     xlab = "Date", ylab = "Weight")

# i = 1の場合の折れ線グラフ(lines()関数:低水準作図関数)を描く
lines(c(1,2,3,4,5,6,7,8), c(200,203,195,192,187,185,184,178),col = "red")

image

i =1 から、i=15 まで繰り返してグラフをかくと、今回のグラフの最終形態となる。

ほどほどに理解できた(つもりになった)が、疲れた。。。

ここまで苦労するなら、最初からエクセルでやればよかったかもしれない。。。
プログラミングが好きな人以外には、Rでグラフを描くのはあまりお勧めできないか。。。

x <- read.csv("rat.food.csv", header = TRUE)   # csvファイルの読み込み

xaxis <- 1:ncol(x[, -1])          # x 軸座標を設定
cols <- c("red", "blue", "green") # PF を赤色、C を青色、G を緑色

# 描画の準備  (高水準作図関数plot()を描画、これは、lines()関数で描画する前に行う必要がある)
plot(0, 0, type = "n", xlim = range(xaxis), ylim = range(x[, -1]),
     xlab = "Date", ylab = "Weight")

# 各個体のデータを折れ線として描く (lines()関数:低水準作図関数)
type <- unique(x[, 1])            # 餌の種類を取得
for (i in 1:nrow(x)) {
  lines(xaxis, x[i, -1], col = cols[c(1:length(cols))[type == x[i, 1]]])
}

# グラフに凡例を書き入れる
legend("topleft", legend = type, lty = 1, col = cols)

image

(参考)13. ベクトル要素へのアクセス
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/13.html

(参考)2015年8月22日 (土)
[R]データフレームから条件に一致するレコード(値、行番号)を抽出する
http://goldenstate.cocolog-nifty.com/blog/2015/08/r-6d7f.html

Rのお仕事
2007年08月29日
lines()
http://blog.livedoor.jp/dmr2008/archives/177691.html

R_列名で列を削除する
Last-modified: 2009-11-20 (金) 14:41:49 (2722d)
http://rmecab.jp/wiki/index.php?R_%CE%F3%CC%BE%A4%C7%CE%F3%A4%F2%BA%EF%BD%FC%A4%B9%A4%EB

●列番号が一致する範囲のデータを抽出

いま、オブジェクトxには、ラットのタイプ別5匹ずつ、Day0からDay7の体重が記載されている。

http://qiita.com/gigatune/items/f3aa0afef7f50ab791cd

#answer というtableのオブジェクトがあったとして、3列目~4列目を抽出
answer[,3:4]

これを参考に、Day0からDay2までのデータを抜き出して、折れ線グラフに記載したい。

(参考)

日々のつれづれ、良かった探し
2011-12-22
直線とか曲線とか
http://d.hatena.ne.jp/myopomme/20111222/1324551313

2010-12-20
MikuHatsune2010-12-20
12/20 プログラミングセミナー plotの軸がうまくいかないのだが
http://d.hatena.ne.jp/MikuHatsune/20101220/1292850583

2010-12-25 0と1と-1とでできた正方行列
ryamada2010-12-25
■[R]軸の表示いろいろ 23:04
http://d.hatena.ne.jp/ryamada/20101225/1292853846

2013-04-10
NROWとNCOLを使えばベクトルのサイズも取得できる
http://d.hatena.ne.jp/teramonagi/20130410/1365599828

関連記事
Count per Day
    Popular Posts
    スポンサーリンク

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする