Hier ist ein Hack mit ggplot_build
. Die Idee ist, zuerst die alte/ursprüngliche Grundstück zu erhalten:
p <- ggplot(data = X, aes(x=C)) + geom_histogram()
in p
gespeichert. Verwenden Sie dann ggplot_build(p)$data[[1]]
die Daten zu extrahieren, insbesondere die Spalten xmin
und xmax
(um die gleichen Pausen/binwidths von Histogramm) und count
Spalte (zur Normalisierung der Prozentsatz von count
Hier ist der Code:.
# 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))
Wie jetzt Daten zu generieren, was ich aus Ihrer Post verstehen ist Nehmen sie zum Beispiel der ersten Bar in Ihrem Grundstück es eine Zählung von 2 hat und es erstreckt sich von xmin = 147
zu xmax = 156.8
Wenn wir X
für diese Werte überprüfen:?...
X[X$C >= 147 & X$C <= 156.8, ] # count = 2 as shown below
# C1 C2 C
# 19 91 63 154
# 75 86 70 156
Hier berechne ich (91+86)/(154+156)*(count=2) = 1.141935
und (63+70)/(154+156) * (count=2) = 0.8580645
als die beiden normalisierten Werte für jeden Balken, den wir generieren werden.
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)
Und das ist das ursprüngliche Grundstück:
Und das ist, was ich bekommen:
Edit: Wenn Sie auch das bekommen wollen Pausen richtig, dann können Sie die entsprechenden x
Koordinaten erhalten und das alte Grundstück es verwendet hier statt 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)
das ist gut, außer dass deine Legende verrückt ist. Beginnen Sie mit 'geom_histogram (aes (x = Mitte, y = total), fill =" blue ")' (d. H. Setzen Sie die 'fill'-Spezifikation außerhalb der Abbildung); Dann müssen Sie herausfinden, wie Sie die Anleitung (Legende) manuell hinzufügen können. –
@BenBolker Ja, es ist nur eine schnelle Lösung, um die Daten korrekt anzuzeigen. Jetzt muss das OP nur noch von hier anpassen. – Dinre