2017-10-09 178 views
1

我正尝试使用ggridges包(基于ggplot2)创建一个joyplot。一般的想法是,一张快乐图创建很好的缩放堆积密度图。但是,我似乎无法使用加权密度来生成其中的一个。是否有某种方法将抽样权重(用于加权密度)合并到创建Joyplot中的密度计算中?R:加权Joyplot/Ridgeplot /密度图?

下面是ggridges包的文档链接:https://cran.r-project.org/web/packages/ggridges/ggridges.pdf我知道很多基于ggplot的包可以接受额外的美学,但我不知道如何为这种类型的geom添加权重。

此外,这里是ggplot中未加权的joyplot的示例。我试图将其转换为加权图,密度按照权重进行加权。

# Load package, set seed 
library(ggplot) 
set.seed(1) 

# Create an example dataset 
dat <- data.frame(group = c(rep("A",100), rep("B",100)), 
        pweight = runif(200), 
        val = runif(200)) 

# Create an example of an unweighted joyplot 
ggplot(dat, aes(x = val, y = group)) + geom_density_ridges(scale= 0.95) 
+0

如果您提供样本输入数据的[可重现示例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),则更容易帮助您。 – MrFlick

+0

增加了一个可重现的例子,每@MrFlick – user3614648

回答

4

它看起来像要做到这一点的方法是使用stat_density而不是默认的stat_density_ridges。根据您链接到的文档:

请注意,默认stat_density_ridges会对所有数据集进行联合密度估计。这在使用分面图时可能不会生成所需的 结果。作为替代方案,您可以将 stat = "density"设置为使用stat_density。在这种情况下,需要 添加美学映射height = ..density..(请参阅示例)。

幸运的是,stat_density(不像stat_density_ridges)理解的美学weight,并将它传递给底层density电话。你最终的东西,如:

ggplot(dat, aes(x = val, y = group)) + 
    geom_density_ridges(aes(height=..density.., # Notice the additional 
          weight=pweight),  # aes mappings 
         scale= 0.95, 
         stat="density") # and use of stat_density 

..density..变量由stat_density自动生成。

注:看来,当您使用stat_density x轴范围的行为有点不同:它会修剪密度图的数据范围和下降好看的尾巴。您可以通过手动扩展x轴来轻松修正此问题,但我认为这值得一提。

+0

这非常有帮助,谢谢!你能够证明这个例子是如何工作的吗? – aeongrail