2015-03-26 8 views
5

Ich habe festgestellt, es gab mehrere Beiträge für Leute fragen, wie man zwei Histogramme nebeneinander (wie in einem Diagramm mit den Balken nebeneinander) und in R und auch überlagert wie man Daten normalisiert. Nach dem Rat, den ich gefunden habe, kann ich das eine oder andere tun, aber nicht beide Operationen.R Normalisieren Sie dann zwei Histogramme zusammen in R

Hier ist das Setup. Ich habe zwei Datenrahmen unterschiedlicher Länge und möchte das Volumen der Objekte in jedem df als Histogramm darstellen. ZB wie viele in Datenrahmen 1 sind zwischen .1-.2 um^3 und vergleichen Sie mit wie viele in Datenrahmen 2 sind zwischen .1 und .2 um^3 und so weiter. Overlaid oder Side by Side wäre großartig, dies zu tun.

Da es mehr Messungen in einem Datenrahmen als die anderen sind, natürlich muss ich normalisieren, so verwende ich:

read.csv(ctl) 
read.csv(exp) 
h1=hist(ctl$Volume....) 
h2=hist(exp$Volume.... 

#to normalize# 

h1$density=h1$counts/sum(h1$counts)*100 
plot(h1,freq=FALSE....) 
h2$density=h2$counts/sum(h2$counts)*100 
plot(h2,freq=FALSE....) 

Jetzt habe ich schon erfolgreich die nicht-normalisierten Daten mit dieser Methode überlagert: http://www.r-bloggers.com/overlapping-histogram-in-r/ und auch mit dieser Methode: plotting two histograms together

aber ich bin fest, wenn es darum geht, wie normalisierten Daten sein

+1

Was meinst du mit "side by side"? Zwei verschiedene Parzellen nebeneinander (par (mfrow = c (1,2)) oder ein Grundstück mit 2 verschiedenen Bars nebeneinander – James

+0

Ein Grundstück mit zwei verschiedenen Bars, sorry für Unklarheiten –

+0

Ich weiß nicht, was $ Volumen ist und ich nehme an, dass der Vektor ist, den Sie normalisieren möchten.Dies ist sehr janky, aber machen Sie einen neuen Vektor in Ihrem Datenrahmen wo ctl $ dichte <- ctl $ Volumen/max (ctl $ Volumen). Jetzt machen Sie ein Histogramm von dass h1 <- hist (ctl $ dichte. Tun Sie das gleiche für den anderen Datensatz und folgen Sie den Anweisungen auf der Website, die Sie gepostet – James

Antwort

12

ggplot2 es relativ einfach macht normalisiert zu überlagern plotten Gruppen von Gruppen mit ungleicher Größe. Hier ist ein Beispiel mit gefälschten Daten:

library(ggplot2) 

# Fake data (two normal distributions) 
set.seed(20) 
dat1 = data.frame(x=rnorm(1000, 100, 10), group="A") 
dat2 = data.frame(x=rnorm(2000, 120, 20), group="B") 
dat = rbind(dat1, dat2) 

ggplot(dat, aes(x, fill=group, colour=group)) + 
    geom_histogram(breaks=seq(0,200,5), alpha=0.6, 
       position="identity", lwd=0.2) + 
    ggtitle("Unormalized") 

ggplot(dat, aes(x, fill=group, colour=group)) + 
    geom_histogram(aes(y=..density..), breaks=seq(0,200,5), alpha=0.6, 
       position="identity", lwd=0.2) + 
    ggtitle("Normalized") 

enter image description here

Wenn Sie überlagerten Dichte Plots machen möchten, können Sie das auch. adjust steuert die Bandbreite. Dies ist standardmäßig bereits normalisiert.

ggplot(dat, aes(x, fill=group, colour=group)) + 
    geom_density(alpha=0.4, lwd=0.8, adjust=0.5) 

enter image description here

UPDATE: In Antwort auf Ihren Kommentar, der folgende Code sollte es tun. (..density..)/sum(..density..) ergibt die Gesamtdichte über die zwei Histogramme, die zu eins addiert werden, und die Gesamtdichte jeder einzelnen Gruppe addiert sich zu 0,5. Sie müssen also mit 2 multiplizieren, damit die Gesamtdichte jeder Gruppe individuell auf 1 normiert wird. Im Allgemeinen müssen Sie mit n multiplizieren, wobei n die Anzahl der Gruppen ist. Dies scheint irgendwie kludgy zu sein und es könnte eine elegantere Herangehensweise geben.

library(scales) # For percent_format() 

ggplot(dat, aes(x, fill=group, colour=group)) + 
    geom_histogram(aes(y=2*(..density..)/sum(..density..)), breaks=seq(0,200,5), alpha=0.6, 
       position="identity", lwd=0.2) + 
    scale_y_continuous(labels=percent_format()) 

enter image description here

+0

funktionierte ausgezeichnet, vielen Dank. Die einzige zusätzliche Frage, die ich habe, ist, wenn die möglich wäre Y-Achse des normalisierten GGplot stellen einen Prozentsatz eher als Wahrscheinlichkeitsdichte dar? –

+0

ehrfürchtig, danke für das Update –