10

既に要約されたカウント データから生成された ggplot2 ヒストグラムを色付けする方法を教えてください。

データは、さまざまな地域に住む # 男性と # 女性の数のようなものです。合計数 (つまり、男性 + 女性) のヒストグラムをプロットするのは簡単です。

set.seed(1)
N=100;
X=data.frame(C1=rnbinom(N,15,0.1), C2=rnbinom(N,15,0.1),C=rep(0,N)); 
X$C=X$C1+X$C2;
ggplot(X,aes(x=C)) + geom_histogram()

ただし、C1 と C2 からの相対的な寄与度に応じて各バーに色を付けたいので、上記の例と同じヒストグラム (つまり、バー全体の高さ) が得られます。さらに、タイプ「C1」の割合と、積み上げ棒グラフのように「C2」の個人。

例の「X」のようなデータを使用して、ggplot2 でこれを行うクリーンな方法の提案はありますか?

4

3 に答える 3

14

stat="identity"非常に迅速に、次のようにオプションとplyrパッケージを使用して手動でヒストグラムを計算することで、OP が必要とすることを行うことができます。

library(plyr)

X$mid <- floor(X$C/20)*20+10
X_plot <- ddply(X, .(mid), summarize, total=length(C), split=sum(C1)/sum(C)*length(C))

ggplot(data=X_plot) + geom_histogram(aes(x=mid, y=total), fill="blue", stat="identity") + geom_histogram(aes(x=mid, y=split), fill="deeppink", stat="identity")

基本的には、列の位置を特定する方法について「mids」列を作成し、次に 2 つのプロットを作成します。1 つは合計のカウント (C) で、もう 1 つは列の 1 つのカウントに調整された列 (C1) です。ここからカスタマイズできるはずです。

ヒストグラムのデモ

更新 1 : 中音域の計算で小さな間違いを犯したことに気付きました。今修正しました。また、ミッドを計算するために「ddply」ステートメントを使用した理由もわかりません。それはばかげていた。新しいコードはより明確で簡潔です。

更新 2 : コメントを表示するために戻ったところ、少し恐ろしいことに気付きました。ヒストグラムの頻度として合計を使用していました。コードを少し整理し、色付け構文に関するコメントからの提案も追加しました。

于 2013-03-05T20:29:57.637 に答える
7

を使用したハックを次に示しggplot_buildます。アイデアは、最初に古い/元のプロットを取得することです:

p <- ggplot(data = X, aes(x=C)) + geom_histogram()

に格納されpます。次に、ggplot_build(p)$data[[1]]データを抽出するために使用します。具体的には、列xminxmax(ヒストグラムの同じブレーク/ビン幅を取得するため) および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 = 147xmax = 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)

そして、これは元のプロットです:

original_ggplot2_plot

そして、これは私が得るものです:

ggplot2_weird_histogram_plot

編集:適切なブレークも取得したい場合は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)

ここに画像の説明を入力

于 2013-03-05T21:20:35.980 に答える
2

どうですか:

library("reshape2")
mm <- melt(X[,1:2])
ggplot(mm,aes(x=value,fill=variable))+geom_histogram(position="stack")
于 2013-03-05T18:19:12.843 に答える