强制 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)))
使用 R
的 ggplot2
:
library(ggplot2)
ggplot(data = df, aes(x = group, y = val, color = group)) + geom_violin()
我得到:
但是当我尝试使用 R
的 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)
我得到:
"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)
我有几个小组的测量结果,我想将其绘制为小提琴图:
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()
我得到:
但是当我尝试使用 R
的 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)
我得到:
"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)