强制 plotly violin plot 不在零值上显示小提琴

Force plotly violin plot not to display a violin on zero values

我有几个小组的测量结果,我想将其绘制为小提琴图:

set.seed(1)
df <- data.frame(val = c(runif(100,1,5),runif(100,1,5),rep(0,100)),
                 group = c(rep("A",100),rep("B",100),rep("C",100)))

使用 Rggplot2:

library(ggplot2)
ggplot(data = df, aes(x = group, y = val, color = group)) + geom_violin()

我得到:

但是当我尝试使用 Rplotly 获得等效项时:

library(plotly)
plot_ly(x = df$group, y = df$val, split = df$group, type = 'violin', box = list(visible = F), points = F, showlegend = T, color = df$group)

我得到:

"C" 组得到一把 inflated/artificial 小提琴。

知道如何处理这个问题而不是使用 ggplotly 吗?

我没有找到修复 plotly 行为的方法(可能值得为此制作一个错误报告)。一种解决方法是过滤您的数据,仅在范围大于零的组上绘制小提琴图。如果您还需要显示其他组的位置,可以使用箱线图。

为了演示,我在过滤阶段使用 library(data.table)。如果您愿意,可以使用相同过程的 dplyr 或基本版本:

setDT(df)[, toplot := diff(range(val)) > 0, group]

现在我们可以使用不同的轨迹样式绘制组,具体取决于他们是否应该有小提琴

plot_ly() %>%
  add_trace(data = df[(toplot)], x = ~group, y = ~val, split = ~group, 
            type = 'violin', box = list(visible = F), points = F) %>% 
  add_boxplot(data = df[(!toplot)], x = ~group, y = ~val, split = ~group)