【R】ヒストグラムの結果がおかしい

Rで行列要素に、数値がいくつ出現するかをヒストグラムで表現しようと思っていたが結果がおかしい。原因は、分かっていないが、メモ。

Rでヒストグラムを描いてみた。

> hist(as.vector(random.matrix),breaks=48,xlim=c(0,50),ylim=c(0,400),col="#95ff71")

これでできたと思っていたが、1だけ頻度が大きい。
おかしいと思って、Excelでグラフを描いてみたら結果が異なる。

1以外の部分も異なる。
全体的にRでの計算方法が間違っているようだ。

(追記)
r-de-rさんから貴重なコメントを頂きました。どうもありがとうございます。
それについてメモする。

hist の戻り値の str を見るとよいでしょう。breaks=48 としたとき,実際の breaks は 1,2,3,... のようになり,また,right=TRUE になっているので,一番左の棒は,元のデータが1と2の場合の度数になってしまうのであんな風になるのです。
解決法は,あなたのような目的のためには hist ではなく barplot を使うべしと言うこと。
hist を使うならば breaks を1個の数で指定するのではなく,実際の breaks を指定すること。例えば breaks=0:45+0.5 のように。
なお,一般的に採用されている方法である「○○以上,□□未満」とするには,right=FALSE にしなければならない。

>hist の戻り値の str を見るとよいでしょう。
とりあえず見てみる。
こういうことだろうか。

> (hist(as.vector(random.matrix),breaks=48,xlim=c(0,50),ylim=c(0,400),col="#95ff71"))
$breaks
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

$counts
 [1] 230 110 119 117 130 114 128 102 130 118 132 126 124 124 126 118 126 119 127 117 123 133 110 120 116 133 126 112 117 126 112 118 120 124 121 134 130 129 118 119
[41] 115 115

$density
 [1] 0.04416283 0.02112135 0.02284946 0.02246544 0.02496160 0.02188940 0.02457757 0.01958525 0.02496160 0.02265745 0.02534562 0.02419355 0.02380952 0.02380952
[15] 0.02419355 0.02265745 0.02419355 0.02284946 0.02438556 0.02246544 0.02361751 0.02553763 0.02112135 0.02304147 0.02227343 0.02553763 0.02419355 0.02150538
[29] 0.02246544 0.02419355 0.02150538 0.02265745 0.02304147 0.02380952 0.02323349 0.02572965 0.02496160 0.02476959 0.02265745 0.02284946 0.02208141 0.02208141

$mids
 [1]  1.5  2.5  3.5  4.5  5.5  6.5  7.5  8.5  9.5 10.5 11.5 12.5 13.5 14.5 15.5 16.5 17.5 18.5 19.5 20.5 21.5 22.5 23.5 24.5 25.5 26.5 27.5 28.5 29.5 30.5 31.5 32.5
[33] 33.5 34.5 35.5 36.5 37.5 38.5 39.5 40.5 41.5 42.5

$xname
[1] "as.vector(random.matrix)"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

>breaks=48 としたとき,実際の breaks は 1,2,3,... のようになり,
たしかに、1,2,3,....のようになっている。

>right=TRUE になっているので,一番左の棒は,元のデータが1と2の場合の度数になってしまう
たしかに、ヒストグラムの左端が0からではなく、1から始まっている事が気になっていた(分からなかった)。。。
rightとは各級間の上限値を含める(TRUE)か、含めない(FALSE)かの指定で、breaks=1,2,3..であり、right=TRUEになっていたので「1以上2以下」の度数になっていたということか。

>hist を使うならば breaks を1個の数で指定するのではなく,実際の breaks を指定すること。例えば breaks=0:45+0.5 のように。
その通りにやってみた。ただし、y軸の上限はエクセルで作成した図と比較するために140とした。

> (hist(as.vector(random.matrix),breaks=0:45+0.5,xlim=c(0,50),ylim=c(0,140),col="#95ff71"))
$breaks
 [1]  0.5  1.5  2.5  3.5  4.5  5.5  6.5  7.5  8.5  9.5 10.5 11.5 12.5 13.5
[15] 14.5 15.5 16.5 17.5 18.5 19.5 20.5 21.5 22.5 23.5 24.5 25.5 26.5 27.5
[29] 28.5 29.5 30.5 31.5 32.5 33.5 34.5 35.5 36.5 37.5 38.5 39.5 40.5 41.5
[43] 42.5 43.5 44.5 45.5

$counts
 [1] 109 121 110 119 117 130 114 128 102 130 118 132 126 124 124 126 118 126
[19] 119 127 117 123 133 110 120 116 133 126 112 117 126 112 118 120 124 121
[37] 134 130 129 118 119 115 115   0   0

$density
 [1] 0.02092934 0.02323349 0.02112135 0.02284946 0.02246544 0.02496160
 [7] 0.02188940 0.02457757 0.01958525 0.02496160 0.02265745 0.02534562
[13] 0.02419355 0.02380952 0.02380952 0.02419355 0.02265745 0.02419355
[19] 0.02284946 0.02438556 0.02246544 0.02361751 0.02553763 0.02112135
[25] 0.02304147 0.02227343 0.02553763 0.02419355 0.02150538 0.02246544
[31] 0.02419355 0.02150538 0.02265745 0.02304147 0.02380952 0.02323349
[37] 0.02572965 0.02496160 0.02476959 0.02265745 0.02284946 0.02208141
[43] 0.02208141 0.00000000 0.00000000

$mids
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
[25] 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

$xname
[1] "as.vector(random.matrix)"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

おおお。期待した通りの結果だ。

>解決法は,あなたのような目的のためには hist ではなく barplot を使うべしと言うこと。
ありがとうございます。別途使ってみます。