为什么我的一些小提琴图看起来 "wavy" 离散音阶?

Why do some of my violin plots look "wavy" for discrete scales?

我已经叠加了小提琴图,比较了调查的特定部分的 A 组和 B 组分数,按部分包裹。分数是离散的 1-7 值。在其中一些小提琴图中,平滑效果如预期。在其他情况下,一组或另一组在离散分数之间看起来非常 "wavy"(如下所示)。

我认为问题可能是组大小不同,但 "waviness" 肯定会出现在所有剖面图中。

此外,这并没有向我解释为什么图 "dip in" 尽管是离散的 1-7 值。

当我添加 adjust 参数时,它会过度平滑已经平滑的部分,所以它不是很理想。

我使用此代码创建绘图

create_violin_across_groups_by_section <- function(data, test_group="first") {
  g <- ggplot(data) + 
    aes(x=factor(nrow(data)),y=score,fill=group) +
    geom_violin(alpha=0.5,position="identity") +
    facet_wrap("section") +
    labs(
      title = paste("Comparison across groups for ", test_group)
    ) 
  return(g)
}

结果是这样的

在这种情况下,"openness," 是奇怪的波浪形,而其他的都正常平滑。

我想这可能与 x=factor(nrow(data)) 有关,但同样,波纹度肯定会出现在所有剖面图中。

我希望所有的图都是波浪形的(虽然我仍然不明白为什么)或者所有的图都具有相同的平滑度。

我怎样才能让所有的 facet-wrapped 图都具有相同的平滑度,为什么它们首先不同?

谢谢大家

小提琴图的形状是用核密度估计计算的。核密度估计是为连续数据设计的,而不是为离散数据设计的,比如你的分数。虽然您可以将离散数据提供给内核估计器,但结果可能并不总是很漂亮甚至有意义。您可以尝试在 geom_violin 中使用不同的 kernelbw 参数值,或者您可以考虑为离散数据设计的东西,例如 geom_dotplot.

+ geom_dotplot(binaxis = "y", stackdir = "center", position = "dodge")

查看 geom_dotplot https://ggplot2.tidyverse.org/reference/geom_dotplot.html 的相应示例以预览其外观。

查看 kernelbw 小提琴图的描述 https://ggplot2.tidyverse.org/reference/geom_violin.html that points to the density function https://www.rdocumentation.org/packages/stats/versions/3.6.1/topics/density 以获取有关如何计算核密度估计值的更多信息。