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
は機能しますが、下の軸が表示されません。
ヒストグラムは、貧乏人の密度推定です。デフォルト引数を使用したhist()
の呼び出しでは、frequencies not probabilitiesを取得することに注意してください。確率が必要な場合は、_,prob=TRUE
_を呼び出しに追加してください。
対数軸の問題に関しては、x軸を変換したくない場合は「x」を使用しないでください。
_plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)
_
対数スケールでバーを取得します。ルックアンドフィールはまだ少し異なりますが、おそらく微調整することができます。
最後に、hist(log(x), ...)
を実行して、データのログのヒストグラムを取得することもできます。
別のオプションは、パッケージggplot2
を使用することです。
ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log10()
ログに記録されたx軸が必要か、ログに記録されたy軸が必要かは、質問から完全には明らかではありません。ログに記録されたy軸は、バーがゼロに固定されており、ログに記録されると負の無限大になるため、バーを使用する場合にはお勧めできません。周波数ポリゴンまたは密度プロットを使用して、この問題を回避できます。
ダークの答えは素晴らしいものです。 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
、xlab
、およびylab
パラメーターを渡して、プロットタイトル、x軸ラベル、およびy軸ラベルを提供します。
グラフを作成せずにhist()関数を実行し、カウントを対数変換して、図を描画します。
hist.data = hist(my.data, plot=F)
hist.data$counts = log(hist.data$counts, 2)
plot(hist.data)
通常のヒストグラムのように見えるはずですが、y軸はlog2の頻度になります。
これはかなりの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で機能するように変換する必要があることに注意してください。
デフォルトのケースでは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で機能するわけではない。ただし、これはもう少し努力すれば修正できるはずです。