を使用したハックを次に示しggplot_build
ます。アイデアは、最初に古い/元のプロットを取得することです:
p <- ggplot(data = X, aes(x=C)) + geom_histogram()
に格納されp
ます。次に、ggplot_build(p)$data[[1]]
データを抽出するために使用します。具体的には、列xmin
とxmax
(ヒストグラムの同じブレーク/ビン幅を取得するため) およびcount
列 (パーセンテージを で正規化するため)count
です。コードは次のとおりです。
# get old plot
p <- ggplot(data = X, aes(x=C)) + geom_histogram()
# get data of old plot: cols = count, xmin and xmax
d <- ggplot_build(p)$data[[1]][c("count", "xmin", "xmax")]
# add a id colum for ddply
d$id <- seq(nrow(d))
今すぐデータを生成する方法は?あなたの投稿から私が理解していることはこれです。たとえば、プロットの最初のバーを考えてみましょう。カウントは 2 で、 から まで拡張さxmin = 147
れxmax = 156.8
ます。X
これらの値を確認すると、次のようになります。
X[X$C >= 147 & X$C <= 156.8, ] # count = 2 as shown below
# C1 C2 C
# 19 91 63 154
# 75 86 70 156
ここでは、生成する各バーの 2 つの正規化された値として(91+86)/(154+156)*(count=2) = 1.141935
とを計算し(63+70)/(154+156) * (count=2) = 0.8580645
ます。
require(plyr)
dd <- ddply(d, .(id), function(x) {
t <- X[X$C >= x$xmin & X$C <= x$xmax, ]
if(nrow(t) == 0) return(c(0,0))
p <- colSums(t)[1:2]/colSums(t)[3] * x$count
})
# then, it just normal plotting
require(reshape2)
dd <- melt(dd, id.var="id")
ggplot(data = dd, aes(x=id, y=value)) +
geom_bar(aes(fill=variable), stat="identity", group=1)
そして、これは元のプロットです:
そして、これは私が得るものです:
編集:適切なブレークも取得したい場合はx
、古いプロットから対応する座標を取得し、代わりにここで使用できますid
:
p <- ggplot(data = X, aes(x=C)) + geom_histogram()
d <- ggplot_build(p)$data[[1]][c("count", "x", "xmin", "xmax")]
d$id <- seq(nrow(d))
require(plyr)
dd <- ddply(d, .(id), function(x) {
t <- X[X$C >= x$xmin & X$C <= x$xmax, ]
if(nrow(t) == 0) return(c(x$x,0,0))
p <- c(x=x$x, colSums(t)[1:2]/colSums(t)[3] * x$count)
})
require(reshape2)
dd.m <- melt(dd, id.var="V1", measure.var=c("V2", "V3"))
ggplot(data = dd.m, aes(x=V1, y=value)) +
geom_bar(aes(fill=variable), stat="identity", group=1)