R 使用ggplot2从已汇总计数中叠加直方图

R 使用ggplot2从已汇总计数中叠加直方图,r,graphics,ggplot2,histogram,R,Graphics,Ggplot2,Histogram,我想要一些帮助着色一个ggplot2直方图从已经总结的计数数据生成 这些数据类似于生活在不同地区的男性和女性的数量。绘制总计数(即男性+女性)的直方图非常简单: 然而,我想根据C1和C2的相对贡献给每个条形图上色,这样我得到的柱状图(即整体条形图高度)与上例中的柱状图相同,另外我还可以看到叠加条形图中“C1”和“C2”类型个体的比例 使用示例中的“X”等数据,为ggplot2提供干净的方法建议?如何: library("reshape2") mm <- melt(X[,1:2]) ggpl

我想要一些帮助着色一个ggplot2直方图从已经总结的计数数据生成

这些数据类似于生活在不同地区的男性和女性的数量。绘制总计数(即男性+女性)的直方图非常简单:

然而,我想根据C1和C2的相对贡献给每个条形图上色,这样我得到的柱状图(即整体条形图高度)与上例中的柱状图相同,另外我还可以看到叠加条形图中“C1”和“C2”类型个体的比例

使用示例中的“X”等数据,为ggplot2提供干净的方法建议?

如何:

library("reshape2")
mm <- melt(X[,1:2])
ggplot(mm,aes(x=value,fill=variable))+geom_histogram(position="stack")
库(“重塑2”)

mm非常快,您可以使用
stat=“identity”
选项和
plyr
包手动计算直方图,如下所示:

library(plyr)

X$mid <- floor(X$C/20)*20+10
X_plot <- ddply(X, .(mid), summarize, total=length(C), split=sum(C1)/sum(C)*length(C))

ggplot(data=X_plot) + geom_histogram(aes(x=mid, y=total), fill="blue", stat="identity") + geom_histogram(aes(x=mid, y=split), fill="deeppink", stat="identity")
库(plyr)

X$mid这里有一个使用
ggplot\u build
的黑客程序。想法是首先获得旧/原始情节:

p <- ggplot(data = X, aes(x=C)) + geom_histogram()
现在如何生成数据?我从你的帖子中了解到的是。以绘图中的第一个条形图为例。它的计数为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
这是原图:

p <- ggplot(data = X, aes(x=C)) + geom_histogram()

这就是我得到的:

编辑:如果您还希望获得正确的打断,则可以从旧绘图中获得相应的
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)

不幸的是,我认为这不管用。总体分布不同。我想保持计数,例如,100个箱子里有100个人,但在那个箱子里用颜色标出M和F的整体细分。@PaulJHurtado我想你误解了本的代码。每个箱子的总计数将完全相同,因为它们将被堆叠。“melt”函数只是压缩数据,然后直方图选项
position=“stack”
将变量置于彼此之上。总高度将相同。我会在Ben的回答中添加一些细节,希望能让它更清楚。谢谢@Dinre的努力。请务必运行我发布并比较的代码示例。本的例子给出了不同的总体分布。啊。。。找到了。这是一个缩放的问题,而不是值不同的问题。在最初的帖子中,你是通过使用总数来分散数据的,这很好,但一旦你分成小组,它就不准确了。将数据分成若干组,Ben的方法更准确,因为它分别显示两组的分布情况,然后叠加。有什么原因让你试图避免这样做吗?@PaulJHurtado如果你真的想保留原始堆栈,请大声说出来,我会为你编写一个不同的函数。我们必须自己计算堆栈,并使用
stat=“identity”
来做类似的事情。这很好,只是你的传说很古怪。从
geom_直方图开始(aes(x=mid,y=total),fill=“blue”)
(即将
fill
规范置于映射之外);然后,您需要弄清楚如何手动添加指南(图例)。@BenBolker是的,这只是一个快速解决方案,可以正确显示数据。现在,OP只需要从这里进行定制。您的解决方案是如何实现
所需的(重塑2);ggplot(melt(X,id.vars=“C”)、aes(X=C,fill=variable))+geom_histogram()
不起作用?因为现在很少有人使用
plyr
重塑2
,我在
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)
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)