Rを通じて統計学を学ぶ備忘録ブログ

SPSSからRに移行したい私のような人向けのR解説ブログ兼学習用備忘録。

第65回 ggplotの備忘録その2

年末はグラフィックに集中してまとめていきます。個人的にRを使う時にグラフィック関係のコードをよく忘れてしまうので、備忘録として書いていきます。基礎の基礎から始めて、ggplotまで書く予定です。では、まずは基本的なものから見ていきましょう。それは、「高水準作図関数」と「低水準作図関数」と呼ばれる2つの関数です。

 

高水準作図関数:一枚の物の図を作るグラフィック関数

低水準作図関数:高水準作図関数で作った図に線や点、タイトルを追記するための関数

 

高水準作図関数でグラフを作成した後に、低水準作図関数で脚色していくというのが基本的な作図の流れになると思いますので、そのおさらい(備忘録)をしていきます。グラフを作成することが目的なので、グラフそのものには意味はありません。

 

□基本の基本

基本的なオプションを使いまわして作図したもの。そして、その解説。 

>plot(sample$x, sample$y, xlab="x", ylab="y", xlim=c(0, 10), ylim=c(0, 10), cex=1, pch=5, col="red", type="o", lwd=2)

 

sample$x:データフレーム”sample“の変数”x“を横軸に設定

sample$y:データフレーム“sample“の変数”y“を縦軸に設定

xlab="x":横軸のラベルを“x”に設定

ylab="y":縦軸のラベルを“y”に設定

xlim=c(0,10):横軸の範囲を0-10に設定

ylim=c(0,10):縦軸の範囲を0-10に設定

cex=1:点の大きさを設定

pch=5:点の形を設定

col="red":点の色を設定

type="o":点プロットと線プロットの重ね書きを設定

lwd=2:線の太さを設定

f:id:teruaki-sugiura:20151231144233p:plain

 

□質的変数内カテゴリを分けて作図

ある変数xの中に順序でも、名義尺度でもいいのだけれど、いくつかのカテゴリ(ファクター)が存在している時に、そのカテゴリを分けて作図したい場合の作図コード。以下の例では、xとyを基準に変数”class”内に”a”,”b”という2つのカテゴリでわけて作図した時のサンプル。

 

> class.a<-sample[sample$class=="a",]

#class”a”に該当する物でサブグループ”class.a”を作成

> class.b<-sample[sample$class=="b",]

#class”b”に該当する物でサブグループ”class.b”を作成

> plot(sample$x1, sample$y, type = 'n', xlab = "x", ylab = "y")

#type = 'n' :プロット行わず軸やラベルだけを作成

> points(class.a$x,class.a$y, col = 2, cex = 1.5)

#class”a”に該当する物を「赤」でプロット

> points(class.b$x,class.b$y, col = 4, cex = 1.5)

#class”b”に該当する物を「青」でプロット

 

※classを分けるなら、pch=c(1,16)[sample$class], col=c(1,2)[sample$class]を追記するだけで、サブグループは作らなくても問題なし。

f:id:teruaki-sugiura:20151231144559p:plain

□一枚の図に複数の変数を追加する場合

データフレームの中に[y,x1,x2,x3]があってy軸は"y"を設定し、x軸にはそれに対応する"x1","x2","x3"を追加する場合のサンプル。

 

> plot(sample$x1,sample$y,xlim=c(0,10),ylim=c(0,10),col='black',xlab='x_group',ylab ='y') 

> par(new=TRUE)  #重ね書き

> plot(sample$x2,sample$y,xlim=c(0,10),ylim=c(0,10),col='blue',xlab='',ylab ='')

#ラベルは重ならないように「空」にする

> par(new = TRUE)  #重ね書き

> plot(sample$x3,sample$y,xlim=c(0,10),ylim=c(0,10),col='red',xlab='',ylab ='')

#ラベルは重ならないように「空」にする

 

f:id:teruaki-sugiura:20151231145139p:plain

□散布図に回帰直線を書き込む場合

散布図に回帰直線を書き込む場合のサンプルコード。

 

> plot(sample$x1,sample$y,main="linear line+plot",xlab="x1",ylab="y")

> linear<-glm(sample$y~sample$x1+1) #回帰分析

> coefficients<- linear$coefficients #回帰係数を取り出す

> curve(coefficients[1] + coefficients[2] * x, from = min(sample$x1), to = max(sample$x1), add = TRUE) #abline関数を使えばもっと楽かも。 

> usr<-par('usr')

> usr #順にx軸の最小値、最大値、y軸の最小値、最大値が返される

[1] 0.68 9.32 0.68 9.32

> x_loc <- (usr[1] + usr[2]) / 2 # x軸の50%の位置をxに代入

> y <- (usr[4] - usr[3]) * 0.9 + usr[3]  # y軸90%の位置をyに代入

> tx <- sprintf('y = %.2f * x + %.2f', coefficients [2], coefficients [1]) #%.2f'は少数第2まで

> text(x, y, tx) #(xの位置、yの位置、名前)

 

f:id:teruaki-sugiura:20151231145456p:plain

□散布図に回帰直線をカテゴリ分けして書き込む場合

> class.a <- sample [sample$class == 'a',]

> class.b <- sample [sample$class == 'b',]

> plot(sample$x1, sample$y, type = 'n', xlab = "x1", ylab = "y",main = "Two linear Models")

> points(class.a$x1, class.a$y, col ="red", cex = 1)

> points(class.b$x1, class.b$y, col ="green", cex = 1)

> linear.a <- glm(class.a$y ~ class.a$x1+1)   

> cf1 <- linear.a $coefficients             

> curve(cf1[1] + cf1[2] * x, from = min(sample$x1), to = max(sample$x1), add = TRUE, col = “red”)

> linear.b <- glm(class.b$y ~ class.b$x1+1)   

> cf2 <- linear.b $coefficients             

> curve(cf2[1] + cf2[2] * x, from = min(sample$x1), to = max(sample$x1), add = TRUE, col = “green”)

> usr <- par('usr')                      

> x<- usr[1] + (usr[2] - usr[1]) * 0.5

> y.a <- (usr[4] - usr[3]) * 0.9 + usr[3] 

> eq.a <- sprintf('y = %.2f * x + %.2f', cf1[2], cf1[1])

> text(x, y.a, eq.a, col = “red”)

> y.b <- (usr[4] - usr[3]) * 0.8 + usr[3] 

> eq.b <- sprintf('y = %.2f * x + %.2f', cf2[2], cf2[1])

> text(x, y.b, eq.b, col = “green”) 

f:id:teruaki-sugiura:20151231145745p:plain

□for文を使って、自動で作図する場合

for文を使えば、同じようなコードを打ち込む作業を減らして、作業効率をアップさせることができます。for文は最初は取っ付きにくいけれども、慣れるとすごく便利。apply family関数というのもありますが、それは次回。

 

> plot(0, 0, type = 'n', xlim = range(sample1), ylim = range(sample[3:5]), xlab = 'no', ylab = 'x')

> for (i in 3:5) {    

+     lines(sample1, samplei, col = i-1, lwd=i, lty=i) 

+   }

> legend("bottomright", legend = colnames(sample[3:5]), col = 2:4, lty = 1) 

f:id:teruaki-sugiura:20151231150232p:plain

□for文を使って、カテゴリ分けを自動で行い、作図する場合

> class.list<-levels(d$class)

> class.no<-length(class.list)

> class.list

[1] "a" "b"

> class.no

[1] 2

> plot(0, 0, type = 'n',xlim = range(d$x1),ylim = range(d$y),xlab = 'x1', ylab = 'y')

> for (i in 1:class.no) {    # 各classが終わるまで

+     d.sub <- d[d$class == class.list[i], ]  #  i種類番目からなるデータフレーム

+     points(d.sub$x1, d.sub$y, col = i)

+  }

> labels <- c("a","b")

> colors <- c("black", "red")

> legend("topleft", legend = labels, col = colors, pch=1) #bg = "transparent"で凡例を透明に 

f:id:teruaki-sugiura:20151231150322p:plain

□オプションを設定した場合とそうでない場合。

> par(mfrow=c(1,2))

 

#何もオプションを指定しない場合。 

> plot(d$x1, d$y, pch = c(1, 16)[d$class], type = 'p',

+      xlab = "x1",

+      ylab = "y",

+      main = "plot sample normal")

> legend ("topleft", legend = levels(d$class), pch = c(1, 16))

 

 #オプションを指定しまくった場合。 

> par(lwd = 2)   #  線の太さ

> plot(d$x1, d$y, pch = c(1, 16)[d$class], type = 'p',

+      xlab = "x1",

+      ylab = "y",

+      main = "plot sample",

+      cex      = 2,      #  記号の大きさ

+      cex.lab  = 2,        #  軸(文字)の大きさ

+      cex.axis = 2,      #  軸(数字)の大きさ

+      cex.main = 2,      #  メインタイトルの字の大きさ

+      xlim = c(0, 10),        # x軸の範囲

+      xaxp  = c(0, 10, 5),    # x軸の目盛(from, to), 目盛間隔数

+      ylim = c(0, 10),      # y軸の範囲

+      yaxp  = c(0, 10, 5))  # y軸の目盛(from, to), 目盛間隔数

> par(font = 3)  # フォントをイタリック 

> legend ("topleft", legend = levels(d$class), pch = c(1, 16),

+         cex = 2,    #  字の大きさ

+         pt.cex = 2,   #  記号の大きさ

+         bty = "o",    #  凡例タイプ。"n" だと箱なし、"o"は箱あり

+         inset = c(0.1, 0.05))   # 凡例箱の位置を変更

 

f:id:teruaki-sugiura:20151231150526p:plain

 

以上でおしまい。

 

 

広告を非表示にする