Figureで小数点以下の桁数を表示

Rでfigureを作ると,何もしないdefaultの状態ではy軸の数値は横向きとなる.

x <- seq(0, 1, by=0.1)
y <- seq(0, 1, by=0.1)
plot(x, y, pch=16)

これでも悪くはないが,やはりy軸の数値を縦向きにしたほうが見やすくはなる.axis関数でlas=2とし,数値の向きをかえることは可能だが,こうすると小数点以下が0の場合,表示されなくなり見栄えが悪い.as.character関数を使って文字列に変換しても,やはり下のようなfigureになる.

At <- seq(0, 1, by=0.2)
AtChar <- as.character(At)
plot(x, y, pch=16, xaxt="n", yaxt="n")
axis(side=1, at=At, labels=At)
axis(side=2, at=At, labels=At, las=2)

上の状況を回避し0.0や1.0のような表記にするため,ここではregexpr関数を使った方法を考える.

regexpr関数は文字列から何かしらのパターンを見つける関数である.使い方は簡単で,regexpr(pattern=探しているパターン, x=文字列)といった形で 使え,探しているパターンの場所を返してくれる.例えば

x <- c("abc", "bcd", "cde")
regexpr("b", x)

このような例では,与えられたxという3つの要素からなる文字列の中に,bが含まれているかどうか,含まれている場合はその場所を返す.ここでは,2 1 -1の3つの数字を返すが実際,abcという文字列ではbは2番目であり,bcdでは1番目である.最後のcdeについてはbは含まれない.そのような場合は-1を返す関数である.この関数を使って,小数点以下に0を追加する関数を考えると以下のようなものが作れる.

x <- seq(0, 1, by=0.1)
y <- seq(0, 1, by=0.1)
At <- seq(0, 1, by=0.2)
Label <- as.character(At)
Location <- regexpr("[.]", Label)
for (i in 1:length(At)){
  if (Location[i] == -1){
    Label[i] <- paste(Label[i], ".0", sep="")
  }
}
plot(x, y, pch=16, xaxt="n", yaxt="n")
axis(side=1, at=At, labels=At)
axis(side=2, at=At, labels=Label, las=2)

ここではまず,軸に表記する数値を文字列に直し,Labelの中に格納する.次にLabelの中の文字列で小数点があるかどうかをregexpr関数で調べる.ここで注意が必要なのは,単純に”.”としてもregexpr関数は小数点と認識してくれない.そのため,”[.]”と括弧でくくる必要がある.各文字列に含まれる小数点の位置をLocationの中に格納し,仮にLocation[i]==-1,つまり小数点が含まれないならば,該当する文字列Label[i]の後ろに”.0″とpaste関数で小数点と0を追加する.

上のような加工を加えると,小数点以下が無視されて整数となってしまっているケースも「.0」というように,他の値とformatを揃えることができる. 毎回forで書くのも手間なので,下のように0を追加するような関数を作っておくと楽.

AddZero <- function(Vec){
  lVec     <- length(Vec)
  Vec_Char <- as.character(Vec)
  for (i in 1:lVec){
    Loc <- regexpr("[.]", Vec_Char[i])
    if (Loc[1] == -1){
      Vec_Char[i] <- paste(Vec_Char[i],".0",sep="")
    }
  }
  return(Vec_Char)
}
AddZero(seq(0, 1, by=0.2))
[1] "0.0" "0.2" "0.4" "0.6" "0.8" "1.0"

小数点をさらに追加したい場合は,以下のように変更すればよい.

AddZeros <- function(Vec, Decimal){
  lVec     <- length(Vec)
  Vec_Char <- as.character(Vec)
  for (i in 1:lVec){
    Loc   <- regexpr("[.]", Vec_Char[i])
    nChar <- nchar(Vec_Char[i])
    if (Loc[1] == -1){Vec_Char[i] <- paste0(Vec_Char[i],".",paste0(rep("0",Decimal),collapse=""))}
    if (Loc[1] >   0){Vec_Char[i] <- paste0(Vec_Char[i],    paste0(rep("0",(Loc[1]+Decimal-nChar)),collapse=""))}
  }
  return(Vec_Char)
}
AddZeros(seq(0, 1, by=0.2), 2)
[1] "0.00" "0.20" "0.40" "0.60" "0.80" "1.00"

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です