如何在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
相关产品推荐
相关产品推荐

