4

次のように、データフレームから一連の密度プロットを作成しgeom_density、 を使用して条件別に表示していますfacet_wrap

ggplot(iris) + geom_density(aes(x=Sepal.Width, colour=Species, y=..count../sum(..count..))) + facet_wrap(~Species)

これを行うと、y 軸の目盛はSpeciesパネル内のそれぞれのパーセントではなく、すべての種の全データポイントのパーセントを表しているように見えます。

..count..私の質問は次のとおりです:変数が各パネルのgeom_density各セットのアイテムの数を参照するようにするにはどうすればよいですか?Speciesvirginicavirginica

また、ggplot2 が使用する値を出力して、使用している数値を確認できるようにする方法はあり..count..ますsum(..count..)か?

編集geom_density:私はそれが単一のように見えると誤解しました、パーセンテージではありませんSpecies..count../sum(..count..)

ggplot(iris[iris$Species == 'virginica',]) + geom_density(aes(x=Sepal.Width, colour=Species, y=..count../sum(..count..))) + facet_wrap(~Species)

だから私の修正された質問:密度プロットを各ビンのデータの一部にする方法を教えてください。stat_densityこれに使用する必要がありgeom_histogramますか?Y軸をデータポイントのパーセンテージ/分数にしたいだけです

4

3 に答える 3

5

残念ながら、ggplot2 に求めているのは、ファセットごとに個別の y を定義することですが、これは構文的に知る限り実行できません。

したがって、コメント スレッドで「基本的にヒストグラムが必要なだけ」という言及に応えて、代わりにgeom_histogramor を使用することをお勧めしgeom_freqpolyます。

ggplot(iris, aes(Sepal.Width, ..count..)) + 
  geom_histogram(aes(colour=Species, fill=Species), binwidth=.2) +
  geom_freqpoly(colour="black", binwidth=.2) +
  facet_wrap(~Species)

ここに画像の説明を入力

**注: geom_freqpoly は、上記の例の geom_histogram の代わりに機能します。効率のために、両方を 1 つのプロットに追加しました。

お役に立てれば。

編集: わかりました、私はあなたが望むものを手に入れるための迅速かつ汚い方法をなんとか解決しました. をインストールしてロードする必要がありますplyr。あらかじめお詫び申し上げます。これは、RAM の使用に関して最も効率的な方法ではない可能性がありますが、機能します。

まず、虹彩を公開してみましょう (私は RStudio を使用しているので、ウィンドウ内のすべてのオブジェクトを表示することに慣れています)。

d <- iris

これで、x 軸となる各固有の測定値に属する個体の数をカウントするために使用できますddply(ここでは、Sepal.Width の代わりに Sepal.Length を使用しました。プロット時のグループ間の差)。

new <- ddply(d, c("Species", "Sepal.Length"), summarize, count=length(Sepal.Length))

ddply引用符で囲まれた変数に従って、出力 data.frameを自動的にソートすることに注意してください。

次に、data.frame をそれぞれの固有の条件に分割できます。アイリスの場合は、3 つの種のそれぞれです (もっとスムーズな方法があると確信しています。非常に大量のデータの場合、RAM を使い果たす可能性があるため、同じ data.frame のサブセットを作成し続けることはお勧めできません)...

set <- new[which(new$Species%in%"setosa"),]
ver <- new[which(new$Species%in%"versicolor"),]
vgn <- new[which(new$Species%in%"virginica"),]

...そしてddply再び使用して、各測定に該当する個体の割合を計算しますが、種ごとに個別に計算します。

prop <- rbind(ddply(set, c("Species"), summarize, prop=set$count/sum(set$count)),
              ddply(ver, c("Species"), summarize, prop=ver$count/sum(ver$count)),
              ddply(vgn, c("Species"), summarize, prop=vgn$count/sum(vgn$count)))

次に、必要なものをすべて 1 つのデータセットに入れ、ワークスペースから不要なものをすべて取り除きます。

new$prop <- prop$prop
rm(list=ls()[which(!ls()%in%c("new", "d"))])

そして、y 上のファセット固有のプロポーションで図を作成できます。data.frame を自動的に注文したgeom_lineので、現在使用していることに注意してください。ddply

ggplot(new, aes(Sepal.Length, prop)) + 
  geom_line(aes(colour=new$Species)) +
  facet_wrap(~Species)

ファセット固有のプロポーションを持つ facet_wrap

# let's check our work. each should equal 50
sum(new$count[which(new$Species%in%"setosa")]) 
sum(new$count[which(new$Species%in%"versicolor")]) 
sum(new$count[which(new$Species%in%"versicolor")])

#... and each of these should equal 1
sum(new$prop[which(new$Species%in%"setosa")]) 
sum(new$prop[which(new$Species%in%"versicolor")]) 
sum(new$prop[which(new$Species%in%"versicolor")])
于 2013-07-07T23:58:19.823 に答える
0

に引数scales='free_y'を渡すfacet_wrap()とうまくいくはずです。

于 2015-01-22T16:22:48.593 に答える
0

table() と barplot() を使用すると、必要なものを取得できる場合があります。これがあなたが求めているものかどうかはまだわかりません...

barplot(table(iris[iris$Species == 'virginica',1]))

ggplot2で

tb <- table(iris[iris$Species == 'virginica',1])
tb <- as.data.frame(tb)
ggplot(tb, aes(x=Var1, y=Freq)) + geom_bar()
于 2013-07-08T00:33:01.433 に答える