首页 > 解决方案 > 直方图和密度图不匹配

问题描述

我正在创建替换直方图:随着时间的推移,第 1、第 2 或第 3 个子。因此,每个直方图显示给定子数在给定分钟内的子数。直方图对我来说很有意义,因为它们大部分都是平滑的(我使用了 1 分钟的 bin 宽度)。没有什么看起来太不寻常了。但是,当我覆盖密度图时,左侧的尾部会膨胀,我无法确定其中一张图的原因。

数据集是替换的,范围从 1 分钟到最大时间。然后,我将此数据集切成两半,仅查看第 45 分钟后制作子的时间。我没有将这些数据折叠回去,我试图创建一个可重现的示例,但无法给出数据。

用于在 R 中创建的代码

## Filter out subs that are not in the second half
df.half<-df[df$PeriodId>=2,]
p<-ggplot(data=df.half, aes(x=time)) + 
  geom_histogram(aes(y=..density..),position="identity", alpha=0.5,binwidth=1)+
  geom_vline(data=sumy.df.half,aes(xintercept=grp.mean),color="blue", linetype="dashed", size=1)+
  geom_density(alpha=.2)+
  facet_grid(SUB_NUMBER ~ .)+
  scale_y_continuous(limits = c(0,0.075),breaks = c(seq(0,0.075,0.025)),
                     minor_breaks = c(seq(0,0.075,0.025)),name='Count')
p

为什么,如果没有小于 45 的值,第一个子的密度图会在尾部膨胀?另外,为什么第二个潜艇尾部的密度图没有更加膨胀?

旁注:我确实在交叉验证时问过这个问题,但由于它涉及 R,所以被告知要在这里问。这里

在此处输入图像描述

因此,我能够更改代码并获得以下信息:

ggplot() + 
  geom_histogram(data=df.half, aes(x=time,y=..density..),position="identity", alpha=0.5,binwidth=1)+
  geom_density(data=df.half,aes(x=time,y=..density..))+
  geom_vline(data=sumy.df.half,aes(xintercept=grp.mean),color="blue", linetype="dashed", size=1)+
  facet_grid(SUB_NUMBER ~ .)

在此处输入图像描述

这看起来更正确,至少现在适合数据集。但是,我仍然对为什么首先会出现这些问题感到困惑。

标签: rhistogramkernel-density

解决方案


虽然没有数据样本来重现错误,但您可以geom_density尝试通过明确指定来确保所使用的环境是正确的。您也可以尝试将指定密度 ( geom_density)的代码行移到geom_histogram. 此外,y轴标签可能是错误的 - 它现在设置为counts,而值表明这实际上是density

我将如何明确指定密度?

您可以通过指定data,aesposition直接在geom_density函数调用中显式指定密度参数,因此它将使用这些声明而不是继承的参数:

ggplot() + 
  geom_histogram(data=df.half, aes(x=time,y=..density..),position="identity", alpha=0.5,binwidth=1)+
  geom_density(data=df.half,aes(x=time,y=..density..))+
  geom_vline(data=sumy.df.half,aes(xintercept=grp.mean),color="blue", linetype="dashed", size=1)+
  facet_grid(SUB_NUMBER ~ .)

我不明白它是如何发生的, 我认为在您的初始代码中geom_density,您只明确指定了alpha参数。因此,对于它需要的所有其余参数,(dataaesposition)它使用继承的参数/参数,显然它没有正确继承它们。可能它试图使用geom_vline函数 -中的数据参数sumy.df.half,或者被参数“..density..”中的语法混淆了


推荐阅读