79

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動作しますが、下軸が表示されません。

4

7 に答える 7

68

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

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

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

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

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

于 2009-08-07T15:14:13.183 に答える
53

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

ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log10()
于 2009-08-09T11:50:11.890 に答える
11

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

于 2009-08-10T23:55:52.537 に答える
10

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

最後の行はオプションで、各バーのすぐ下に値ラベルを追加します。これは対数スケールのグラフに役立ちますが、省略してもかまいません。

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

于 2011-04-10T04:56:47.000 に答える
9

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

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

通常のヒストグラムと同じように見えるはずですが、y軸はlog2Frequencyになります。

于 2013-07-18T15:11:33.467 に答える
3

デフォルトの場合は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で機能するわけではありません。ただし、もう少し努力すれば修正できるはずです。

于 2011-12-02T13:15:09.780 に答える
3

これがかなりの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で機能するようにブレークを変換する必要があることに注意してください。

于 2017-09-30T22:07:45.490 に答える