核心密度使用`facet_wrap`绘制ggplot2中的带宽

时间:2011-04-27 13:44:49

标签: r ggplot2

我想在stat_density()包中使用facet_wrap()ggplot2为不同的分组创建内核密度图,但我想确保每个使用相同的带宽情节。我能确定stat_density()为每个情节使用相同的带宽吗?

例如,使用diamonds

library(ggplot2)    
ggplot(diamonds, aes(x = carat)) + 
  stat_density() + 
  facet_wrap(~ cut) + 
  scale_x_log()

在文档中,它显示我可以使用adjust来调整自动带宽,但这只是应用了一个倍数并将我返回原始问题。 stat_density()也有...选项,但我无法通过density()选项bw,如下所示:

ggplot(diamonds, aes(x = carat)) + 
  stat_density(bw = 1) + 
  facet_wrap(~ cut) + 
  scale_x_log()

因此,如果stat_density()没有在所有方面使用相同的带宽,有没有办法可以强制执行此操作?我尝试使用ddply()transform()的{​​{1}}解决方案,但这失败了,因为density()不一定会返回与输入相同数量的x和y值。有任何想法吗?谢谢!

修改 看起来density()为每个方面分配了最佳带宽(看起来像@Ramnath和Dianardo,Fortin和Lemieux Econometrica 1996同意这一点),而不是我所寻求的恒定带宽。但是,如果我确实需要跨越所有方面的恒定带宽,我的尝试将失败。

ggplot2

1 个答案:

答案 0 :(得分:2)

警告是由caratmy.density的负值引起的。稍微修改一下你的代码就可以了:

  ggplot(temp, aes(x = carat, y = density)) + 
    geom_line(subset = .(carat > 0)) +
   facet_wrap(~ cut) + scale_x_log() 

希望这很有用