Rで折れ線グラフ(2)
繰り返すが、折れ線グラフを描くだけなら、エクセルが簡単。
https://dekiru.net/article/12622/
繰り返し、折れ線グラフをかく機会があったため、また、自分好みのグラフを描きたいため、Rで折れ線グラフをかけるようになりたいと思って、今回、わざわざ面倒なRでグラフをかこうと四苦八苦している。私レベルでは、こんなことでもとても難しい、、、
前回は、他のサイトの写経してみた。
http://twosquirrel.mints.ne.jp/?p=16286
個人的に、時系列データをグラフにしたいのだが、ググってみると、時系列データが縦に並んでいるものの解説が多い。
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 という名前で保存して始めていく。
(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)
ここで、うまくいかない場合は、
「txtファイルの文字コードが UTF-8 になっているか」
「txtファイルの改行コードの、BOM(?)のチェックははずれているか」
などをさくらエディタなどで開いてチェックする。
うまくいかなければ、エクセルファイルで開いて、csv形式で保存して、
x <- read.csv("rat.food.csv", header = TRUE)
head(x, 10)
とするのがよいかもしれない。
(2)csvファイルを取り込む場合
csvファイルで保存。rat.food.csv という名前で保存。
y <- read.csv("rat.food.csv", header = TRUE)
y
(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)
このコードを少し、解読してみる。
(参考)
21. 行列の操作
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/21.html
x[,-1]
まず、これがググっても本当に分からなかった。試しに、
x[,-2]
x[,-3]
としてみたら、
となり、結局、おそらく、
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
となる。
(4)規則性のあるベクトルの作成
(参考)
12. ベクトルの作成
規則性のあるベクトルの作成
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/12.html
●ベクトルを作成する基本的な関数は c() である.
●規則性のあるベクトルの作成
1:7 # 1 から 7 まで 1 づつ増加するベクトルを作る
比率にしか見えないんだけど、、、ベクトルだそうです。。。
ということで、今回は、以下のようなxaxis というベクトルが作成される。
本当は、グラフの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)を指定した場合と同じ)
(参考)
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)
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)
● range()関数
59. 基本統計量の算出
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/59.html
range() 関数は、ベクトルの要素の最小値と最大値を返す
今回は、行列x[, -1]の要素の最小値と最大値を求めて、y軸(今回はラットの体重)の表示する範囲を指定している。
横軸(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]]])
}
nrow(x) は、行列xの行数(headerはカウントしない)を返すらしい。
●for による繰り返し
for ( ループ変数 in リスト )
たとえば、
for (i in 1:10)) {
(iを含む式)
}
では、(iを含む式)の、iに、1、2、3、、、、10を代入した式の結果を返す。
今回は、
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点をつなぐときのことも試してみると、理解しやすいかもしれない。
(参考)下記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) # 折れ線グラフの描画
次に、(1,1), (2,2), …, (10,10)の点をplotして、折れ線グラフでつなげてみる。
plot(1:10) # この書き方だと、x軸は指定していない気がする、、、
lines(1:10)
(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"])
結局、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")
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)
(参考)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
ディスカッション
コメント一覧
まだ、コメントがありません