多种颜色的小提琴情节

Violin plot with multiple colors

我想生成一个小提琴图,其中不同的区域用不同的颜色填充。 例如:

df <- data.frame("data" = runif(1000))
ggplot(df, aes(x ="DATA", y = data)) + geom_violin(aes(fill = if_else(data > 0.5, "green","red")))

上面的命令生成了下图所示的小提琴图。小提琴情节由 2 个独立的部分组成。我期待一个完整的形状(即没有物理分离),其中上部(数据 >0.5)为绿色,下部为红色。

我知道有一个着色问题。但是,我想问的是:

我发现以下解决方案具有多色小提琴图,但在我的情况下不起作用:

谢谢。

链接的答案显示了一种通过构建绘图和调整底层 grob 来实现此目的的巧妙方法,但如果您想在没有 grob-hacking 的情况下执行此操作,则需要获得自己的密度曲线并绘制它们带有多边形:

df <- data.frame("data" = runif(1000))

dens <- density(df$data)
new_df1 <- data.frame(y = c(dens$x[dens$x < 0.5], rev(dens$x[dens$x < 0.5])),
                      x = c(-dens$y[dens$x < 0.5], rev(dens$y[dens$x < 0.5])),
                      z = 'red2')
new_df2 <- data.frame(y = c(dens$x[dens$x >= 0.5], rev(dens$x[dens$x >= 0.5])),
                      x = c(-dens$y[dens$x >= 0.5], rev(dens$y[dens$x >= 0.5])),
                      z = 'green3')

ggplot(rbind(new_df1, new_df2), aes(x, y, fill = z)) + 
  geom_polygon() +
  scale_fill_identity() +
  scale_x_continuous(breaks = 0, expand = c(1, 1), labels = 'DATA', name = '')