Заставить сюжет скрипки не отображать скрипту с нулевыми значениями - PullRequest
3 голосов
/ 06 марта 2019

У меня есть измерения из нескольких групп, которые я хотел бы построить как графики для скрипки:

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 s ggplot2:

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

Я получаю:enter image description here

Но когда я пытаюсь получить эквивалент с R s plotly, используя:

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 Ответ

1 голос
/ 06 марта 2019

Я не нашел способа исправить поведение сюжета (вероятно, стоит сделать отчет об ошибке для этого).Обходной путь может заключаться в том, чтобы отфильтровать ваши данные, чтобы рисовать графики скрипки только в тех группах, чей диапазон больше нуля.Если вам также нужно показать, где находятся другие группы, вы можете использовать для них блокпост.

Для демонстрации я использую 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

...