Ecco un trucco utilizzando ggplot_build
. L'idea è di ottenere prima il vostro vecchio trama originale /:
p <- ggplot(data = X, aes(x=C)) + geom_histogram()
memorizzato in p
. Quindi, utilizzare ggplot_build(p)$data[[1]]
per estrarre i dati, in particolare, le colonne xmin
e xmax
(per ottenere gli stessi pause/binwidths di istogramma) e count
colonna (per normalizzare la percentuale in count
Ecco il codice:.
# 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))
Come per generare dati ora Quello che ho capito dal tuo post è questo Prendiamo ad esempio il primo bar nel vostro diagramma ha un conteggio di 2 e si estende da xmin = 147
a xmax = 156.8
Quando controlliamo X
per questi valori:?...
X[X$C >= 147 & X$C <= 156.8, ] # count = 2 as shown below
# C1 C2 C
# 19 91 63 154
# 75 86 70 156
Qui computo (91+86)/(154+156)*(count=2) = 1.141935
e (63+70)/(154+156) * (count=2) = 0.8580645
come i due valori normalizzati per ogni barra che genereremo.
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)
E questa è la trama originale:
E questo è ciò che ottengo:
Edit: Se anche voi volete ottenere il interruzioni corrette, quindi, è possibile ottenere le corrispondenti coordinate x
da la trama vecchio e usarlo qui invece di 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)
questo è buono tranne che la tua leggenda è stravagante. Inizia con 'geom_histogram (aes (x = mid, y = total), fill =" blue ")' (ad esempio, inserisci la specifica 'fill' al di fuori della mappatura); quindi dovrai capire come aggiungere manualmente la guida (legenda). –
@BenBolker Sì, è solo una soluzione rapida per visualizzare i dati correttamente. Ora, l'OP deve solo personalizzare da qui. – Dinre