重量由另一个变量决定

时间:2020-01-20 21:41:04

标签: r ggplot2 tidyverse ggridges ridgeline-plot

我正在尝试使用山脊图可视化某些数据,但是我想知道是否有一种方法可以加权山脊的密度。

基本上我有以下内容:

set.seed(1)
example <- data.frame(matrix(nrow=100,ncol=3))
colnames(example) <- c("year","position","weight")
example$year <- as.character(rep(c(1,2,3,4,5),each=20) )
example$position <- runif(100,1,10)
example$weight <- sample(1:3,100,replace = T)

5个不同年份的职位样本。我想用山脊图绘制随时间变化的分布变化,但是在数据集中,还有一个“权重”列,这意味着某些样本比其他样本计数更多。有没有办法将其合并到我的山脊分布图中?还有一种方法可以使具有更多样本*权重的行比具有更少样本*权重的行更高?难道每年的身高都不能正常化吗?

ggplot(example,aes(x=position,y=year))+
  ggridges::geom_density_ridges()+
  theme_classic()

我当时想我可以尝试通过数据集重复行以获取行数,以获取它们具有的权重值,因此它们的计数将超过x次(或“权重”次数)并更改密度。虽然还不太清楚该怎么做。另外,在我的数据集中,权重不是整数,所以我希望有一个更好的解决方案。

或者,有没有其他软件包/技术可以实现这一目标?

1 个答案:

答案 0 :(得分:3)

对于此数据集,我们可以根据weight列重复行,然后绘制:

library(ggplot2)
library(ggridges)

example2 <- example[rep(seq_along(example$weight), example$weight), ]

ggplot(example2,aes(x=position,y=year))+
  ggridges::geom_density_ridges()+
  theme_classic()
#> Picking joint bandwidth of 1.02

但是,如果您的体重不是整数,那将不起作用。 this open issue on github可能需要您试一试。

另一个想法是将原始数据集中的权重取整为整数,然后将其舍入到特定数字,然后将其乘以10以达到所需精度的幂。然后,您可以将先前的解决方案用于您的实际数据集。