Plotly R:通过按钮筛选柱状图并隐藏无关EPISD类别
解决Plotly柱状图切换公司时x轴显示无关类别的问题
问题核心是:仅用restyle控制trace显示/隐藏时,x轴会保留所有trace中的EPISD值,导致无关类别残留。需要通过update方法同时更新trace可见性和x轴的类别范围。
修改后的代码
library(plotly) library(data.table) # 数据 dt <- data.table( EPISD = c("A", "A", "B", "B", "C", "D", "D"), ENTRP = c( "company 1", "company 2", "company 1", "company 2", "company 2", "company 1", "company 2" ), prct_na = c(100, 0, 100, 5.3, 100, 94, 100) ) # 预先提取各公司的EPISD类别 comp1_episd <- unique(dt[ENTRP == "company 1"]$EPISD) comp2_episd <- unique(dt[ENTRP == "company 2"]$EPISD) plot_ly() %>% add_trace( data = dt[ENTRP == "company 1"], x = ~EPISD, y = ~prct_na, name = 'company 1', type = 'bar', visible = TRUE ) %>% add_trace( data = dt[ENTRP == "company 2"], x = ~EPISD, y = ~prct_na, name = 'company 2', type = 'bar', visible = FALSE ) %>% layout( updatemenus = list( list( type = "buttons", direction = "down", buttons = list( list( method = "update", args = list( list(visible = c(TRUE, FALSE)), # 显示company1,隐藏company2 list(xaxis = list( categoryarray = comp1_episd, categoryorder = "array" )) ), label = "company 1" ), list( method = "update", args = list( list(visible = c(FALSE, TRUE)), # 显示company2,隐藏company1 list(xaxis = list( categoryarray = comp2_episd, categoryorder = "array" )) ), label = "company 2" ) ) ) ) )
关键改动说明
- 把按钮的
method从restyle改为update:update支持同时修改trace属性和布局属性(比如x轴),而restyle仅能修改trace属性。 - 预先提取各公司对应的EPISD唯一值:保证切换时x轴只显示当前公司存在的类别。
- 在按钮的
args中添加x轴更新参数:通过categoryarray指定x轴要展示的类别,categoryorder = "array"确保x轴按指定顺序排列类别。
这样切换按钮时,不仅会显示对应公司的柱状图,x轴也会自动过滤无关的EPISD类别,只保留当前公司的有效类别。
内容的提问来源于stack exchange,提问作者nimliug
相关产品推荐
相关产品推荐

