web-dev-qa-db-ja.com

対数目盛とカスタムブレークを使用したヒストグラム

Yの対数目盛でRのヒストグラムを生成しようとしています。現在私は:

hist(mydata$V3, breaks=c(0,1,2,3,4,5,25))

これによりヒストグラムが得られますが、0から1の間の密度が非常に大きいため(約100万の値の差)、他のバーをほとんど見つけることができません。

それから私はやってみました:

mydata_hist <- hist(mydata$V3, breaks=c(0,1,2,3,4,5,25), plot=FALSE)
plot(rpd_hist$counts, log="xy", pch=20, col="blue")

それは私が欲しいものをかなり提供しますが、下には0、1、2、3、4、5、25ではなく1-6の値が表示されます。また、バーではなくポイントとしてデータを表示しています。 barplotは機能しますが、下の軸が表示されません。

72
Weegee

ヒストグラムは、貧乏人の密度推定です。デフォルト引数を使用したhist()の呼び出しでは、frequencies not probabilitiesを取得することに注意してください。確率が必要な場合は、_,prob=TRUE_を呼び出しに追加してください。

対数軸の問題に関しては、x軸を変換したくない場合は「x」を使用しないでください。

_plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)
_

対数スケールでバーを取得します。ルックアンドフィールはまだ少し異なりますが、おそらく微調整することができます。

最後に、hist(log(x), ...)を実行して、データのログのヒストグラムを取得することもできます。

60

別のオプションは、パッケージggplot2を使用することです。

ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log10()
46
Thierry

ログに記録されたx軸が必要か、ログに記録されたy軸が必要かは、質問から完全には明らかではありません。ログに記録されたy軸は、バーがゼロに固定されており、ログに記録されると負の無限大になるため、バーを使用する場合にはお勧めできません。周波数ポリゴンまたは密度プロットを使用して、この問題を回避できます。

10
hadley

ダークの答えは素晴らしいものです。 histが生成するような外観が必要な場合は、これを試すこともできます。

buckets <- c(0,1,2,3,4,5,25)
mydata_hist <- hist(mydata$V3, breaks=buckets, plot=FALSE)
bp <- barplot(mydata_hist$count, log="y", col="white", names.arg=buckets)
text(bp, mydata_hist$counts, labels=mydata_hist$counts, pos=1)

最後の行はオプションで、各バーのすぐ下に値ラベルを追加します。これは対数目盛グラフに役立ちますが、省略することもできます。

また、mainxlab、およびylabパラメーターを渡して、プロットタイトル、x軸ラベル、およびy軸ラベルを提供します。

10
Quinn Taylor

グラフを作成せずにhist()関数を実行し、カウントを対数変換して、図を描画します。

hist.data = hist(my.data, plot=F)
hist.data$counts = log(hist.data$counts, 2)
plot(hist.data)

通常のヒストグラムのように見えるはずですが、y軸はlog2の頻度になります。

7
user2596153

これはかなりのggplot2ソリューションです。

library(ggplot2)
library(scales)  # makes pretty labels on the x-axis

breaks=c(0,1,2,3,4,5,25)

ggplot(mydata,aes(x = V3)) + 
  geom_histogram(breaks = log10(breaks)) + 
  scale_x_log10(
    breaks = breaks,
    labels = scales::trans_format("log10", scales::math_format(10^.x))
  )

Geom_histogramにブレークを設定するには、scale_x_log10で機能するように変換する必要があることに注意してください。

3
Melissa Key

デフォルトのケースではhistと同じように動作するが、log引数を受け入れる関数をまとめました。他のポスターからいくつかのトリックを使用しますが、独自のいくつかを追加します。 hist(x)myhist(x)は同じように見えます。

元の問題は次の方法で解決されます。

myhist(mydata$V3, breaks=c(0,1,2,3,4,5,25), log="xy")

関数:

myhist <- function(x, ..., breaks="Sturges",
                   main = paste("Histogram of", xname),
                   xlab = xname,
                   ylab = "Frequency") {
  xname = paste(deparse(substitute(x), 500), collapse="\n")
  h = hist(x, breaks=breaks, plot=FALSE)
  plot(h$breaks, c(NA,h$counts), type='S', main=main,
       xlab=xlab, ylab=ylab, axes=FALSE, ...)
  axis(1)
  axis(2)
  lines(h$breaks, c(h$counts,NA), type='s')
  lines(h$breaks, c(NA,h$counts), type='h')
  lines(h$breaks, c(h$counts,NA), type='h')
  lines(h$breaks, rep(0,length(h$breaks)), type='S')
  invisible(h)
}

読者向けの演習:残念ながら、histで機能するすべてがmyhistで機能するわけではない。ただし、これはもう少し努力すれば修正できるはずです。

3
Alice Purcell