强制Plotly小提琴图不在零值处显示小提琴形状

5
我有来自几个组的测量数据,我想将它们绘制成小提琴图:
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)))

使用R语言的ggplot2:
library(ggplot2)
ggplot(data = df, aes(x = group, y = val, color = group)) + geom_violin()

我理解到您需要将以下文本从英语翻译成中文:

我得到:

enter image description here

但是当我尝试使用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)

我得到的翻译是:

我得到:

enter image description here

在这里,C组获得了一个充气/人造小提琴。

有没有想法如何处理这个问题,而不使用ggplotly


1
有趣的是,如果你只是在最初创建的图表上使用ggplotly,它就可以正常工作。不要将其发布为答案,因为一定有一种通过非ggplot渠道实现的方法。 - OganM
我在Python中遇到了与plotly相同的问题,并找到了这个问题。由于我不了解R,所以不知道这个方法是否适用于R,所以我无法给出答案,但也许以下内容仍然有所帮助:在Python的plotly中,有一个spanmode参数: fig = go.Figure() fig.add_trace(go.Violin(y=distances, name=name, spanmode="hard"))根据文档,我认为这个方法在R中也适用:https://plotly.com/r/reference/#violin-spanmode - undefined
1个回答

1
我找不到修复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)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接