16

私はほとんどが狭い範囲(1-10)に集中しているデータを持っていますが、(10-1000)にあるかなりの数のポイント(たとえば10%)があります。(1-10)に焦点を当てるが、(10-1000)データも表示する、このデータのヒストグラムをプロットしたいと思います。ヒストグラムの対数スケールのようなもの。

はい、これはすべてのビンが同じサイズではないことを意味します

シンプルなhist(x)ギブ 代替テキスト ながらhist(x,breaks=c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,3,4,5,7.5,10,15,20,50,100,200,500,1000,10000)))ギブ 代替テキスト

どれも私が欲しいものではありません。

ここでの回答に従って更新 します。これで、ほぼ正確に必要なものが生成されます(棒ヒストグラムの代わりに連続プロットを使用しました)。

breaks <- c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,4,8)
ggplot(t,aes(x)) + geom_histogram(colour="darkblue", size=1, fill="blue") + scale_x_log10('true size/predicted size', breaks = breaks, labels = breaks)![alt text][3]

代替テキスト 唯一の問題は、スケールと実際にプロットされたバーを一致させたいということです。これを行うには2つのオプションがあります。1つはプロットされたバーの実際のマージンを使用し(どのように?)、1.1754、1.2985などの「醜い」x軸ラベルを取得することです。ビンのマージンは、ブレークと一致するように使用されます。

4

3 に答える 3

9

対数スケールのヒストグラムは、基本グラフィックスよりも ggplot の方が簡単です。次のようなものを試してください

library(ggplot2)
dfr <- data.frame(x = rlnorm(100, sdlog = 3))
ggplot(dfr, aes(x)) + geom_histogram() + scale_x_log10()

基本グラフィックがどうしても必要な場合は、軸なしで対数スケールのヒストグラムをプロットしてから、手動で軸を追加する必要があります。

h <- hist(log10(dfr$x), axes = FALSE) 
Axis(side = 2)
Axis(at = h$breaks, labels = 10^h$breaks, side = 1)

完全を期すために、格子解は次のようになります。

library(lattice)
histogram(~x, dfr, scales = list(x = list(log = TRUE)))

基本ケースで対数値が必要な理由の説明:

対数変換なしでデータをプロットすると、ほとんどのデータが左側のバーにまとめられます。

hist(dfr$x)

hist関数は引数を無視するlogため (ブレークの計算に干渉するため)、これは機能しません。

hist(dfr$x, log = "y")

これもそうではありません。

par(xlog = TRUE)
hist(dfr$x)

つまり、プロットを描画する前に、データを対数変換する必要があります。

    hist(log10(dfr$x))

残念ながら、これは軸を台無しにするため、上記の回避策につながります。

于 2010-10-05T10:35:17.980 に答える
7

ggplot2 を使用するのが最も簡単なオプションのようです。軸とブレークをさらに制御したい場合は、次のようなことができます。

編集:新しいコードが提供されました

x <- c(rexp(1000,0.5)+0.5,rexp(100,0.5)*100)

breaks<- c(0,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,10000)
major <- c(0.1,1,10,100,1000,10000)


H <- hist(log10(x),plot=F)


plot(H$mids,H$counts,type="n",
      xaxt="n",
      xlab="X",ylab="Counts",
      main="Histogram of X",
      bg="lightgrey"
)
abline(v=log10(breaks),col="lightgrey",lty=2)
abline(v=log10(major),col="lightgrey")
abline(h=pretty(H$counts),col="lightgrey")
plot(H,add=T,freq=T,col="blue")
#Position of ticks
at <- log10(breaks)

#Creation X axis
axis(1,at=at,labels=10^at)

これは、ggplot2 に到達できる限り近いです。背景を灰色にするのはそれほど簡単ではありませんが、プロット画面のサイズで長方形を定義し、背景を灰色にする場合は可能です。

私が使用したすべての機能を確認してください?par。独自のグラフを作成できるようになります。お役に立てれば。

代替テキスト

于 2010-10-05T11:09:28.360 に答える
1

このプロットでは、動的グラフも役立ちます。Rstudioの manage パッケージを使用して、ダイナミック レンジ ヒストグラムを実行します。

library(manipulate)
data_dist <- table(data)
manipulate(barplot(data_dist[x:y]), x = slider(1,length(data_dist)), y = slider(10, length(data_dist)))

次に、スライダーを使用して、次のように動的に選択された範囲で特定の分布を確認できます。 ここに画像の説明を入力

于 2014-09-21T05:16:51.553 に答える