2009-08-07 8 views
64

Rのヒストグラムをyの対数スケールで生成しようとしています。現在、私は実行します。ログスケールとカスタムブレークのヒストグラム

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

これは私にヒストグラムを与えるが、0〜1の間の密度は、あなたがかろうじて他のバーのいずれかを作ることができること(百万程度の値差)とても素晴らしいです。

その後、私はやって試してみた:

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") 

、それは私が欲しいものみかん私を与えるが、底は私に値1-6ではなく0、1、2、3、4、5を示します25.データは棒ではなく点としても表示されます。 barplotが動作しますが、私は下軸を取得しません。

+0

で動作するように変換する必要がありましたRを使う(https://stackoverflow.com/questions/7828248/make-y-axis-logarithmic-in-histogram-using-r) – smci

答えて

52

ヒストグラムは、貧困層の密度推定値です。デフォルトの引数を使用してhist()に電話した場合、の周波数は確率ではありません。可能な場合は、,prob=TRUEをコールに追加してください。 - ルックを

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

ログ-yのスケールであなたのバーを取得します。あなたは、x軸が変換したくない場合は、ログの軸の問題については

は、「x」を使用していません感触はまだ少し異なりますが、恐らく調整することができます。

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

+0

優秀!しかし、どうやって底の軸を修正することができますか? 1、2、3、4、5、6を表示するのではなく、0 <= 1,1,1 = 2などを表示したい。 – Weegee

+3

plot()で軸を省略し、axis 「どこで」と「何が」あなたがそれをすることができます。 –

33

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

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

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

9

ダークの答えは素晴らしいです。あなたは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) 

、それだけで、各バーの上部の下に値ラベルを追加します。これは、ログスケールグラフに便利ですが、省略することもできます。

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

2

私は、デフォルトのケースではhistと同じように動作するが、log引数を受け入れる関数をまとめました。それは他のポスターからいくつかのトリックを使用しますが、独自のものをいくつか追加します。​​と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) 
} 

演習:それはスタンドとしてmyhistとHIST作品で働く残念ながら、すべてのもの。しかし、もう少し努力すれば解決できるはずです。

4

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

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

正規のヒストグラムのように表示されますが、y軸はlog2 Frequencyになります。ここで

+0

を避けるには、次のようにする必要があります。 'hist.data $ counts [hist.data $ counts> 0] < - log(hist.data $ counts [hist.data $ counts> 0]、 2) ' – kory

1

はかなりggplot2ソリューションです:[ヒストグラムにy軸の対数を行います。geom_histogramにブレークを設定する

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)) 
) 

注意、彼らは古い質問に関連scale_x_log10

関連する問題