叠加密度图排除直方图值

5
我想在我构建的频率直方图上叠加一个密度曲线。对于频率直方图,我使用了aes(y=..counts../40),因为40是我的样本总数。我使用了aes(y=..density..*0.1)来强制密度在0和1之间,因为我的binwidth为0.1。然而,密度曲线并不适合我的数据,并且它排除了等于1.0的值(请注意,直方图显示了bin=(1.0,1.1)的累积值,但是密度曲线在1.0处结束)。
这是我的数据。
data<-structure(list(variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("E1", "test"
), class = "factor"), value = c(0.288888888888889, 0.0817901234567901, 
0.219026548672566, 0.584795321637427, 0.927554980595084, 0.44661095636026, 
1, 0.653780942692438, 1, 0.806451612903226, 1, 0.276794335371741, 
1, 0.930109557990178, 0.776864728192162, 0.824909747292419, 1, 
1, 1, 1, 1, 0.0875912408759124, 0.308065494238933, 1, 0.0258064516129032, 
0.0167322834645669, 1, 1, 0.355605889014723, 0.310344827586207, 
0.106598984771574, 0.364447494852436, 0.174724342663274, 0.77491961414791, 
1, 0.856026785714286, 0.680759275237274, 0.850657108721625, 1, 
1, 0, 0.851851851851852, 1, 0, 0.294954721862872, 0.819870009285051, 
0, 0.734147168531706, 0.0135424091233072, 0.0189098998887653, 
0.0101010101010101, 0, 0.296905222437137, 0.706837929731772, 
0.269279393173198, 0.135379061371841, 0.158969804618117, 0.0902981940361193, 
0.00423131170662906, 0, 0.374880611270296, 0.0425790754257908, 
0.145542753183748, 0, 0.129032258064516, 0.260334645669291, 0, 
0, 1, 0.175505350772889, 0.08248730964467, 0, 0.317217981340119, 
0.614147909967846, 0, 0.264508928571429, 0.883520276100086, 0.0657108721624851, 
0, 0.560229445506692)), row.names = c(NA, -80L), .Names = c("variable", 
"value"), class = "data.frame")

情节
q<-ggplot(data, aes(value, fill = variable)) 
        q + geom_density(alpha = 0.6,aes(y=..density..*0.1),binwidth=0.1) 
    + theme_minimal()+scale_fill_manual(values =c("#D7191C","#2B83BA")) 
    + theme(legend.position="bottom")+ guides(fill=guide_legend(nrow=1)) 
    + labs(title="Density Plot GrupoB",x="Respuesta",y="Density")
    +scale_x_continuous(breaks=seq(from=0,to=1.2,by=0.1))
    +geom_histogram(alpha = 0.6,aes(y=..count../40),binwidth=0.1,position="dodge")

我得到的输出是这个 在此输入图片描述
1个回答

6

您的绘图正如所预期展现了数据:

  • 您绘制了data$value,其中包含0到1之间的数字值,因此您应该期望密度曲线也从0到1运行。
  • 您使用0.1的binwidth绘制了直方图。 bin在下端关闭,在上端打开。因此,在您的情况下,您得到的分组是[0,0.1),[0.1,0.2),...,[0.9,1.0),[1.0,1.1)。您的数据中有17个值为1,因此进入最后一个bin,该bin从1绘制到1.1。

我认为以这种方式绘制直方图是不好的想法。原因是对于直方图,x轴是连续的,这意味着覆盖x轴范围从0.1到0.2的条形代表包括0.1和0.2(不包括后者)之间的值的计数。在这种情况下使用dodge会导致扭曲的图片,因为条形现在不再覆盖正确的x轴范围。两个条形共享应完全覆盖它们两个的范围。这种扭曲是密度曲线似乎与直方图不匹配的原因之一。

那么,您能做些什么呢?我可以给您提供一些建议,但也许其他人有更好的想法...

  • 不要使用position="dodge"将直方图并排绘制,而是可以使用分面绘图,即将直方图(和相应的密度曲线)绘制到单独的图中。这可以通过在绘图时添加+ facet_grid(variable~.)来实现。

  • 您可以稍微“作弊”一下,使最后一个区间包括1(即使其变为[0.9,1.0])。只需将数据中的1替换为0.999,如下所示:data$value[data$value==1]<-0.999。重要的是,您只需要在绘图时进行此操作,因为它只是略微重新定义了分组方式。对于所有数值计算,您不应该进行此替换!(例如,它会改变data$value的平均值。)

  • 关于密度曲线和直方图的归一化:密度曲线不需要介于0和1之间。限制是密度曲线上的积分应为1。因此,为了使密度曲线和直方图可以比较,直方图的积分也应为1,这可以通过将y值除以bindwidth来实现。因此,您应该使用geom_density(alpha = 0.6,aes(y=..density..))(我还删除了bindwith=0.1,因为它对geom_density没有影响),以及geom_histogram(alpha = 0.6,aes(y=..count../40/.1),binwidth=0.1)(使用分面时不需要position="dodge")。当然,这导致了与您之前相同的相对归一化,但是更有意义,因为密度曲线和直方图的积分都是1。

  • 密度曲线仍然不能完全匹配直方图,这与密度估计器的计算方式有关。我不太清楚细节,因此无法进一步解释。但是,您可以通过调整geom_density中的参数adjust来更好地理解它的工作原理。对于较小的数字,它会使曲线变得不那么平滑,曲线将更接近于直方图。

为了将所有内容整合在一起,我已将所有建议整合到您的代码中,并在geom_density中使用了adjust=0.2,并绘制了结果:

data$value[data$value==1]<-0.999
q<-ggplot(data, aes(value, fill = variable)) 
q + geom_density(alpha = 0.6,aes(y=..density..),adjust=0.2)  +
   theme_minimal()+scale_fill_manual(values =c("#D7191C","#2B83BA")) +
   theme(legend.position="bottom")+ guides(fill=guide_legend(nrow=1)) +
   labs(title="Density Plot GrupoB",x="Respuesta",y="Density")+
   scale_x_continuous(breaks=seq(from=0,to=1.2,by=0.1))+
   geom_histogram(alpha = 0.6,aes(y=..count../40/.1),binwidth=0.1) +
   facet_grid(variable~.)

enter image description here

很抱歉我无法给你一个更完整的答案,但我希望这些想法能为你提供一个良好的起点。

该段文字涉及IT技术相关内容,暂时没有更详细的答案。

我知道不应该用这个来表示感谢,但是你的个人资料中没有提供任何沟通方式。你的回答非常完美。我曾经尝试使用position="dodge",但是在堆叠版本中我甚至无法看到数据。facet方法即使在研讨会演示中也非常美观。 - Matias Andina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接