Вот взлом с использованием ggplot_build
. Идея заключается в том, чтобы сначала получить свой старый/оригинальный сюжет:
p <- ggplot(data = X, aes(x=C)) + geom_histogram()
хранящегося в p
. Затем используйте ggplot_build(p)$data[[1]]
для извлечения данных, в частности, столбцы xmin
и xmax
(чтобы получить тот же брейки/binwidths гистограммы) и count
столбца (нормализовать процентный count
Вот код:.
# 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))
Как для получения данных в настоящее время, что я понимаю из вашего поста это Возьмем, к примеру, первый бар в вашем участке имеет счетчик 2 и простирается от xmin = 147
до xmax = 156.8
Когда мы проверяем X
для этих значений:?...
X[X$C >= 147 & X$C <= 156.8, ] # count = 2 as shown below
# C1 C2 C
# 19 91 63 154
# 75 86 70 156
Здесь я вычисляю (91+86)/(154+156)*(count=2) = 1.141935
и (63+70)/(154+156) * (count=2) = 0.8580645
как два нормализованных значения для каждого бара, который мы будем генерировать.
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)
И это оригинальный сюжет:
И это то, что я получаю:
Edit: Если вы хотите получить ломается, тогда вы можете получить соответствующие координаты x
старый сюжет и использовать его здесь вместо 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)
это хорошо, за исключением того, что ваша легенда дурацкая. Начните с 'geom_histogram (aes (x = mid, y = total), fill =" blue ")' (т. Е. Поместите спецификацию 'fill' вне отображения); то вам нужно будет выяснить, как добавить руководство (легенда) вручную. –
@BenBolker Да, это просто быстрое решение для правильного отображения данных. Теперь OP просто нужно настроить отсюда. – Dinre