You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Plotly R中仅显示小提琴图正侧(移除负尾)

移除Plotly小提琴图的负尾(保留正侧完整范围)

要实现只截断小提琴图的负尾、保留正侧完整范围,不能直接用spanmode="hard"(会同时截断正负),需要通过手动指定每个分组的小提琴范围来实现,步骤如下:

1. 预计算每个分组的自定义y轴范围

先按x轴分组,为每个组设置y轴下限(取0和组内y最小值的较大者,避免负尾),上限保留组内y的最大值(保证正侧完整):

library(dplyr)

# 按x轴分组计算每个组的y轴范围
y_ranges <- test_dt %>%
  group_by(!!sym(x_col())) %>%
  summarise(
    y_min = max(min(!!sym(y_col())), 0),  # 下限不低于0
    y_max = max(!!sym(y_col()))           # 上限保留原最大值
  ) %>%
  arrange(!!sym(x_col())) %>%
  select(y_min, y_max) %>%
  as.matrix() %>%
  split(., row(.)) %>%
  lapply(unname)

如果需要强制所有小提琴下限为0(不管组内是否有正值),直接把y_min = max(...)改成y_min = 0即可。

2. 修改Plotly代码,启用手动范围模式

在add_trace中设置spanmode="manual",并传入预计算的y_ranges:

fig <- plot_ly(data = test_dt, source = 'violin_plot')

fig <- fig %>% add_trace(
  x = test_dt[[x_col()]],
  y = test_dt[[y_col()]],
  width = .55,
  showlegend = TRUE,
  box = list(visible = TRUE),
  spanmode = "manual",  # 启用手动指定范围模式
  span = y_ranges,      # 传入每个分组的自定义范围
  meanline = list(visible = FALSE),
  color = test_dt[[x_col()]],
  colors = "Set3",
  type = "violin"
)

说明

这段代码会自动适配x轴的动态分组数量,不管有多少个小提琴图,每个图都会被限制在设定的范围内,既移除了负尾,又保留了正侧的完整数据分布。

内容的提问来源于stack exchange,提问作者Danish Zahid Malik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:52:33