山羊の午後

研究関係の備忘録。

Rで描く、棒グラフ

barplot()で平均値+標準偏差のエラーバーを描く

図の例

f:id:yk_uminami:20160422002515p:plain


コード

#データ入力
group<-c(10,20,30) #群
m.data<-c(0.079,0.102,0.146) #平均値
sd.data<-c(0.022,0.031,0.026) #標準偏差

#y軸の最大値を指定
yRoof=round(max(m.data+sd.data)*1.2, 1)

#棒グラフ
graph1<-barplot(m.data,names=group, ylim=c(0,yRoof), 
        xlab="Amount of drug (mg/kg)", ylab="Responses (/sec)",
        col="royalblue3", space=0.5)

#上向きのエラーバー
arrows(graph1,m.data,graph1,m.data+sd.data,angle=90,length=0.1,lwd=2) 
#下向きのエラーバー
arrows(graph1,m.data,graph1,m.data-sd.data,angle=90, length=0.1,lwd=2) 

# x軸を描く
axis(side=1, graph1, labels=F) 

#タイトルをつける
title("Bar graph with error bars", cex =2)

#有意差のマークをつける
segments(graph1[1], yRoof*0.8, graph1[2], yRoof*0.8,lwd=2)
points((graph1[1]+graph1[2])/2,yRoof*0.83, pch="*", cex=2)

segments(graph1[1], yRoof*0.9, graph1[3], yRoof*0.9,lwd=2)
points((graph1[1]+graph1[3])/2,yRoof*0.93, pch="*", cex=2)

コードの説明

データ入力
  • 群は数でも文字でもかまわない。
  • 表として表示するには、
group<-c(10,20,30) #群
m.data<-c(0.079,0.102,0.146) #平均値
sd.data<-c(0.022,0.031,0.026) #標準偏差

d.table<-data.frame(Group=group, Mean=m.data, SD=sd.data)
d.table

  Group  Mean   SD
1   10  0.079  0.022
2   20  0.102  0.031
3   30  0.146  0.026

棒グラフの準備
  • エラーバーを描くために、先にy軸の最大値を設定すると便利。
    • yRoof=round(max(m.data+sd.data)*1.2, 1)
    • 各群ごとに平均値に標準偏差を足し、その中から最大値をmax()で探して、1.2倍してround()で少数一桁を四捨五入。
    • 小数点一桁で四捨五入する round(x, 1)
  • 最小値が固定(=0)でない場合、同様に最初に指定すると便利。
    • 例)yFloor=round(min(m.data-sd.data)*1.3,1)
  • エラーバーをあえてy軸枠外に突き抜けて描きたい場合、par(xpd=T) をarrows()の前に入力し、枠外への書き込みを許可する。
棒グラフ bargraph()
  • graph1<-barplot(height=m.data, names=group, ylim=c(0,yRoof))
    • graph1に代入することで、x軸上の各棒の真ん中の値が得られる。これをエラーバーの作図に利用する。
  • barplot()で設定できるプロパティ
height 第一引数。各棒の高さを指定する。一番目に指定したベクトルが自動的に使われる。
names 各棒のラベルを指定する。数字でも文字でも可。
ylim 縦軸を c(最小値, 最大値)で指定する。指定しないとheightから適宜計算される。
xlab, ylab 軸名を指定。サイズはcexで指定。*1
col 棒の色を指定。エクセルっぽい青 col="royalblue3"、エクセルっぽい赤 col="brown3"
weight 第二引数。各棒の幅を指定する。指定しない場合、等分幅になる
space 棒の間隔を指定。space=c(0.5, 0.8)とすると間隔の1番目から順番に幅を指定。*2
注意
graph1<-barplot(m.data, group, ylim=c(0,yRoof))とnamesを指定しないで二番目にベクトルを指定すると、weightとして認識され、幅の異なるグラフになる。


yaginogogo.hatenablog.jp


エラーバーを描く
  • arrows(x0, y0, x1, y1)は指定された点A(x0,y0)から点B(x1,y1)へ矢印を描く。
arrowsの例
#描画領域を作る
plot(3,3, xlim=c(0,5),ylim=c(0,5))
#点(0,0)から点(3,3)に矢印を引く
arrows(0,0,3,3)
  • arrows()のプロパティ
angle 矢印先端の角度。90でフラットになる。初期値は30
length 矢印先端の長さ。単位はインチ、初期値は0.25
lwd 矢印の線の太さ。初期値は1
lty 線の種類。初期値は1(実線)、2~6が点線、0は線なし
  • これを使って、棒の端・中央を点Aとし、そこから上に標準偏差だけ離れた点Bに矢印を描き、矢印の先端を90度に指定するとエラーバーになる。
#上向きのエラーバー
arrows(graph1, m.data, graph1, m.data + sd.data, angle=90,length=0.1,lwd=2) 
  • barplot()を代入したgraph1は、各棒の中央にあたるx座標を返してくれる。(Rがグラフを描くために設定した値)
  • この値を矢印のx座標とし、y座標には棒の高さであるm.dataと、m.dataにエラーバーの長さであるsd.dataを加えた値を指定する。
  • 指定しているデータの表
点A x0 = 点B x1 点A y0 点B y1
group graph1 m.data m.data+sd.data
10 1.0 0.079 0.101
20 2.5 0.102 0.133
30 4.0 0.146 0.172
  • 下向きの矢印は同様に平均値m.dataから標準偏差sd.dataを引いた点Bにむかって矢印を引く。
#下向きのエラーバー
arrows(graph1, m.data, graph1, m.data - sd.data, angle=90,length=0.1,lwd=2) 
目盛り付きx軸を描く
  • axis(side=1, graph1, labels=F)
  • side=1がグラフ底辺をさす。
  • 目盛りの値にbargraph()を代入したgraph1を指定することで、棒の中央に目盛りがつく 
注意
labels=Tにするとgraph1の数値が表示される。
タイトルを書く
  • title(main="title")
    • 文字サイズは cex = 1 がデフォルト。2にすると2倍に拡大される。subで下にサブタイトル。
有意差のマークをつける
#有意差のマークをつける
segments(graph1[1], yRoof*0.8, graph1[2], yRoof*0.8,lwd=2)
points((graph1[1]+graph1[2])/2,yRoof*0.83, pch="*", cex=2)
  • segment()は点A(x0,y0)から点B(x1,y1)に線を引く。
  • point()は点(x,y)に記号(pch)を描く。
    • xの値はgraph1に代入された各棒の中央の値をつかう。
    • yの値はグラフ天井からの相対値 yRoof*0.8 で出すか、エラーバーの最大値との相対値でだす。
    • 例)max(m.data+sd.data)*1.2 


yaginogogo.hatenablog.jp

*1:x,y軸をちがう文字サイズにするときはどちらかを xlab="" として描かずにおいて、あとから title(xlab="xxxx", cex=2) で描く。

*2:左端x軸との間隔、右端の領域は別の指定が必要