日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

グラフに文字を記入する

グラフに文字を記入したいときはtext関数とmtext関数が便利。

  • text関数

引数x, yで座標を指定できるので、自由度がかなり高い。
また、引数posで座標(x,y)に対して文字を書く位置を指定する。pos=1なら下辺、2なら左、3なら上、4なら右。
記入する文字は引数labelsで指定する。

> dat <- runif(100,min=10,max=20)
> x <- hist(dat,plot=FALSE)
> str(x) # $midsが棒グラフの中点、$countsが高さになる
List of 7
 $ breaks     : num [1:11] 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 ...
 $ counts     : int [1:10] 8 6 9 19 11 8 13 4 10 12
 $ intensities: num [1:10] 0.8 0.6 0.9 1.9 1.1 ...
 $ density    : num [1:10] 0.8 0.6 0.9 1.9 1.1 ...
 $ mids       : num [1:10] 0.05 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.95
 $ xname      : chr "dat"
 $ equidist   : logi TRUE
 - attr(*, "class")= chr "histogram"
> 
> jpeg("text.jpg")
> plot(x,ylim=c(0,max(x$counts)*1.2))
> points(x=x$mids,y=x$counts,pch=1,cex=2.5)
> text(x=x$mids[1],y=x$counts[1],labels=x$counts[1]) #座標に書く(defaultはpos=NULL)
> text(x=x$mids[2],y=x$counts[2],labels=x$counts[2],pos=1) #下に書く
> text(x=x$mids[3],y=x$counts[3],labels=x$counts[3],pos=2) #左に書く
> text(x=x$mids[4],y=x$counts[4],labels=x$counts[4],pos=3) #上に書く
> text(x=x$mids[5],y=x$counts[5],labels=x$counts[5],pos=4) #右に書く
> text(x=x$mids[2],y=x$counts[2],labels=x$counts[2],pos=1,offset=1,col=2) #offsetは座標からの距離(defaultは0.5)
> text(x=x$mids[3],y=x$counts[3],labels=x$counts[3],adj=c(-1,-1),col=2) #座標からの距離を細かく指定、左と下が正の方向(defaultはadj=c(.5,.5))
> text(x=x$mids[6],y=x$counts[6],labels=x$counts[6],pos=3,font=2) #font=2は太字
> text(x=x$mids[7],y=x$counts[7],labels=x$counts[7],pos=3,font=3) #font=3は斜体
> text(x=x$mids[8],y=x$counts[8],labels=x$counts[8],pos=3,font=4) #font=4は太字 斜体
> text(x=x$mids[9],y=x$counts[9],labels="\300",pos=3,font=5,cex=2) #font=5はsymbol
> text(x=x$mids[10],y=x$counts[10],labels=x$counts[10],pos=3,srt=90) #srtは回転
> dev.off()

で、こんな感じ。

  • mtext関数

座標を指定せず、グラフの枠からどれだけ離れたところに文字を記入するか決める。
引数linesはグラフの枠から何行離れるか、を指定する。
記入する文字は引数textで指定する。
text関数と同じ引数があったり、違う引数があったり、この辺を統一してくれると嬉しいんだけど。

> jpeg("mtext.jpg")
> par(mai=c(.8,.8,1,2))
> plot(x,ylim=c(0,max(x$counts)*1.2),ann=FALSE,yaxt="n")
> box()
> mtext(text="line=0&side=3") #上に書く(defaultはlines=0,side=3)
> mtext(text="line=1&side=3",line=1,col=2) #1行分、上にずれる
> mtext(text="line=-1&side=3",line=-1,col=3) #1行分、下にずれる
> mtext(text="line=0&side=1",side=1) #下に書く
> mtext(text="line=0&side=2",side=2) #左に書く(軸にそって自動で回転する)
> mtext(text="line=0&side=4",side=4) #右に書く(軸にそって自動で回転する)
> mtext(text="line=0&side=4",side=4,line=1,las=1) #回転させたくないときはlas=1
> mtext(text="adj=0",adj=0) #side=1に対して相対位置を指定(左端が0、右端が1)
> mtext(text="adj=1",adj=1) #adj=0は左揃え、adj=1は右揃え
> mtext(text="at=10",at=10,line=-1,col=2) #atはsideに対して絶対位置を指定(side=1, 3はx座標、side=2, 4はy座標)
> mtext(text="at=10",at=10,line=-1,padj=1,col=3) #上下の調整はpadjを使う
> mtext(text="at=10",at=10,line=-1,padj=1,adj=-1,col=4) #左右の調整adjを使う
> mtext(text="side=3&line=-1",line=-1,col=5,outer=TRUE) #outer=TRUEはグラフ領域 の四辺に大してlineを指定する
> dev.off()

で、こんな感じ。

text関数とmtext関数は似ているけど、同じ引数があったり、違う引数があったり、引数で戸惑うことが多い。
どっちかに統一してくれると嬉しいのですが。