web-dev-qa-db-ja.com

Rでggplot2を使用してヒストグラムをオーバーレイする

私はRが初めてであり、3つのヒストグラムを同じグラフにプロットしようとしています。すべてうまくいきましたが、私の問題は、2つのヒストグラムが重なる場所が見えないことです-むしろカットオフに見える: Histogram

密度プロットを作成すると、完璧に見えます。各曲線は黒い枠線で囲まれており、曲線が重なっている場所では色が異なって見えます。 密度プロット

最初の写真のヒストグラムで同様のことが達成できるかどうか、誰か教えてもらえますか?これは私が使用しているコードです:

lowf0 <-read.csv (....)
mediumf0 <-read.csv (....)
highf0 <-read.csv(....)
lowf0$utt<-'low f0'
mediumf0$utt<-'medium f0'
highf0$utt<-'high f0'
histogram<-rbind(lowf0,mediumf0,highf0)
ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)

役に立つヒントを事前に感謝します!

112
Bloomy

現在のコード:

ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)

ggplotf0のすべての値を使用してoneヒストグラムを構築し、変数uttに従ってこの単一のヒストグラムのバーに色を付けるように指示しています。

代わりに、3つの別個のヒストグラムを作成し、アルファブレンディングを使用して相互に見えるようにします。したがって、おそらくgeom_histogramの3つの個別の呼び出しを使用する必要があります。各呼び出しでは、独自のデータフレームと塗りつぶしを取得します。

ggplot(histogram, aes(f0)) + 
    geom_histogram(data = lowf0, fill = "red", alpha = 0.2) + 
    geom_histogram(data = mediumf0, fill = "blue", alpha = 0.2) +
    geom_histogram(data = highf0, fill = "green", alpha = 0.2) +

いくつかの出力を含む具体的な例を次に示します。

dat <- data.frame(xx = c(runif(100,20,50),runif(100,40,80),runif(100,0,30)),yy = rep(letters[1:3],each = 100))

ggplot(dat,aes(x=xx)) + 
    geom_histogram(data=subset(dat,yy == 'a'),fill = "red", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'b'),fill = "blue", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'c'),fill = "green", alpha = 0.2)

これは次のようなものを生成します:

enter image description here

タイプミスを修正するために編集。色ではなく塗りつぶしが必要でした。

109
joran

@joranのサンプルデータを使用して、

ggplot(dat, aes(x=xx, fill=yy)) + geom_histogram(alpha=0.2, position="identity")

geom_histogramのデフォルトの位置は「スタック」です。

このページの「位置調整」を参照してください。

docs.ggplot2.org/current/geom_histogram.html

214
kohske

Ggplot2で複数/重複するヒストグラムをプロットするのに数行しか必要ありませんが、結果は常に満足できるものではありません。目ができることを保証するために、境界線と色の適切な使用が必要ですヒストグラム間を区別する

次の関数は、境界線の色、不透明度、および重ね合わされた密度プロットのバランスをとり、視聴者が分布を区別できるようにします/

単一ヒストグラム

plot_histogram <- function(df, feature) {
    plt <- ggplot(df, aes(x=eval(parse(text=feature)))) +
    geom_histogram(aes(y = ..density..), alpha=0.7, fill="#33AADE", color="black") +
    geom_density(alpha=0.3, fill="red") +
    geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
    labs(x=feature, y = "Density")
    print(plt)
}

複数のヒストグラム

plot_multi_histogram <- function(df, feature, label_column) {
    plt <- ggplot(df, aes(x=eval(parse(text=feature)), fill=eval(parse(text=label_column)))) +
    geom_histogram(alpha=0.7, position="identity", aes(y = ..density..), color="black") +
    geom_density(alpha=0.7) +
    geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
    labs(x=feature, y = "Density")
    plt + guides(fill=guide_legend(title=label_column))
}

使用法

単純にデータフレームを上記の関数に渡すとともに、必要な引数を指定します。

plot_histogram(iris, 'Sepal.Width')

enter image description here

plot_multi_histogram(iris, 'Sepal.Width', 'Species')

enter image description here

Plot_multi_histogramのextra parameterは、カテゴリラベルを含む列の名前です。

さまざまな分散手段でデータフレームを作成することで、これをより劇的に見ることができます。

a <-data.frame(n=rnorm(1000, mean = 1), category=rep('A', 1000))
b <-data.frame(n=rnorm(1000, mean = 2), category=rep('B', 1000))
c <-data.frame(n=rnorm(1000, mean = 3), category=rep('C', 1000))
d <-data.frame(n=rnorm(1000, mean = 4), category=rep('D', 1000))
e <-data.frame(n=rnorm(1000, mean = 5), category=rep('E', 1000))
f <-data.frame(n=rnorm(1000, mean = 6), category=rep('F', 1000))
many_distros <- do.call('rbind', list(a,b,c,d,e,f))

以前と同様にデータフレームを渡します(オプションを使用してチャートを拡大します)。

options(repr.plot.width = 20, repr.plot.height = 8)
plot_multi_histogram(many_distros, 'n', 'category')

enter image description here

6
Cybernetic