Histogramları R'de ggplot2 ile kaplama


124

R'de yeniyim ve 3 histogramı aynı grafiğe çizmeye çalışıyorum. Her şey yolunda gitti, ancak benim sorunum 2 histogramın nerede örtüştüğünü görmüyorsunuz - oldukça kesik görünüyorlar.

Yoğunluk grafikleri yaptığımda mükemmel görünüyor: her eğri siyah bir çerçeve çizgisiyle çevrilidir ve eğrilerin çakıştığı yerde renkler farklı görünür.

Birinci resimdeki histogramlarla benzer bir şey elde edilip edilemeyeceğini biri bana söyleyebilir mi? Kullandığım kod bu:

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)

3
Histogramın ve yoğunluk grafiğinin köprüler kırıldı
Daghan -

Yanıtlar:


115

Mevcut kodunuz:

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

anlatıyor ggplotoluşturmak için bir tüm değerleri kullanılarak histogramı f0ve değişkenine göre bu tek histogramın çubukları renk utt.

Bunun yerine istediğiniz şey, alfa harmanlama ile birbirlerinden görünür olmaları için üç ayrı histogram oluşturmaktır. Muhtemelen geom_histogram, her birinin kendi veri çerçevesini aldığı ve doldurduğu üç ayrı çağrı kullanmak istersiniz :

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) +

İşte bazı çıktılarla somut bir örnek:

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)

böyle bir şey üreten:

görüntü açıklamasını buraya girin

Yazım hatalarını düzeltmek için düzenlendi; renk değil, dolgu istedin.


7
Bu, alt kümenin boyutu farklı olduğunda çalışmaz. Bunu nasıl ele aldığına dair bir fikriniz var mı? (Örneğin "a" üzerinde 100, "b" üzerinde 50 nokta olan verileri kullanın).
Jorge Leitao

3
Bu yaklaşımın bir dezavantajı, bir efsaneyi sergilemekte zorluk çekmemdi (bunun sebebi bilgisizliğim olabilir). Aşağıdaki @kohske tarafından verilen diğer cevap, varsayılan olarak, daha sonra değiştirilebilen (histogramda görüntülenen belirli renklerle birlikte) bir açıklama gösterecektir, örn scale_fill_manual().
Michael Ohlrogge

1
tam olarak, buna nasıl efsane ekleyebiliriz ??
shenglih

1
@shenglih Bir efsane için kohske'nin aşağıdaki cevabı daha iyidir. Cevabı da genel olarak daha iyidir.
joran

f0 nereden geliyor?
Alan

257

@ Joran'ın örnek verilerini kullanarak,

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

varsayılan konumunun geom_histogram"yığın" olduğunu unutmayın .

bu sayfanın "konum ayarlamasına" bakın:

docs.ggplot2.org/current/geom_histogram.html


30
Bence bu kodun tekrarlanmasını önlediği için en iyi cevap olmalı
kfor

6
position = 'identity'Böyle karışık aramaları gibi daha karmaşık araziler, daha güzel jelleri, sadece daha okunabilir cevap değildir aes()ve aes_string().
rensa

2
Bu cevap aynı zamanda otomatik olarak renklere bir açıklama gösterecek, oysa @joran'ın cevabı göstermeyecek. Gösterge daha sonra, örn scale_fill_manual(). Kullanılarak değiştirilebilir . Bu işlev, histogramlardaki renkleri değiştirmek için de kullanılabilir.
Michael Ohlrogge

4
Ayrıca, kullanılan değişkenin fillbir faktör olduğundan emin olun .
hhh

9
Kişisel olarak, stackoverflow'un ilk önce en çok oy alan cevabı listelemesi gerektiğini düşünüyorum. "Doğru cevap" yalnızca bir kişinin fikrini temsil eder.
daknowles

25

Ggplot2'de çoklu / örtüşen histogramları çizmek için yalnızca birkaç satır gerekli olsa da, sonuçlar her zaman tatmin edici değildir. Gözün histogramlar arasında ayrım yapabilmesini sağlamak için sınırların ve renklendirmenin uygun şekilde kullanılması gerekir .

Aşağıdaki işlevler , izleyicinin dağılımları ayırt etmesini sağlamak için kenarlık renklerini, opaklıkları ve üst üste binen yoğunluk çizimlerini dengeler .

Tek histogram :

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)
}

Çoklu histogram :

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))
}

Kullanım :

Veri çerçevenizi , istenen bağımsız değişkenlerle birlikte yukarıdaki işlevlere aktarmanız yeterlidir :

plot_histogram(iris, 'Sepal.Width')

görüntü açıklamasını buraya girin

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

görüntü açıklamasını buraya girin

İlave parametre plot_multi_histogram kategori etiketlerini içeren sütunun adıdır.

Bunu, birçok farklı dağıtım aracına sahip bir veri çerçevesi oluşturarak daha çarpıcı bir şekilde görebiliriz :

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))

Veri çerçevesini daha önce olduğu gibi aktarmak (ve seçenekleri kullanarak grafiği genişletmek):

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

görüntü açıklamasını buraya girin


1
Bu çok faydalı, umarım daha fazla dikkat çeker.
Edward Tyler

2
@EdwardTyler Çok doğru. Keşke bunu bir kereden fazla yükseltebilseydim!
ayePete
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.