如何动态将Plotly所有层级子图的X轴标题统一设置为空
解决方案
你可以通过tidyverse的动态参数注入能力直接批量设置所有x轴属性,不需要用parse+eval的易出错写法,同时可以顺便解决重复图例的问题。
核心思路
- plotly的
subplot支持shareLegend = TRUE参数,直接合并相同分组的重复图例 - 利用rlang的
!!!操作符可以动态向layout传入批量生成的x轴配置,不需要逐个手写xaxis、xaxis2等参数
完整可运行代码
library(tidyverse) library(plotly) plot_function <- function(grouping_vars) { # 计算分组均值 plot_data <- mtcars %>% group_by(!!sym(grouping_vars[1]), !!sym(grouping_vars[2])) %>% summarise(mpg = mean(mpg), .groups = "drop") # 生成子图列表 plot_list <- plot_data %>% group_by(!!sym(grouping_vars[1])) %>% do( plot = plot_ly( data = ., x = ~!!sym(grouping_vars[1]), y = ~mpg ) %>% add_bars( name = ~!!sym(grouping_vars[2]), legendgroup = ~!!sym(grouping_vars[2]) ) ) %>% pull(plot) # 合并子图,同时合并重复图例 base_plot <- subplot( plot_list, nrows = 1, shareY = TRUE, shareX = TRUE, shareLegend = TRUE ) # 批量生成所有x轴的配置(统一清空标题) xaxis_cnt <- length(plot_list) xaxis_config <- set_names( rep(list(list(title = "")), xaxis_cnt), paste0("xaxis", ifelse(1:xaxis_cnt == 1, "", 1:xaxis_cnt)) ) # 注入配置生成最终图 base_plot %>% layout( title = "Facetted Plot", !!!xaxis_config ) } # 测试调用 plot_function(c("gear", "am"))
如果你不想用动态注入的方式,也可以直接操作plotly对象的底层列表结构批量修改属性,写法更简洁:
# 生成base_plot后直接批量修改所有x轴标题 xaxis_names <- names(base_plot$x$layout) %>% str_subset("^xaxis") for (xax in xaxis_names) { base_plot$x$layout[[xax]]$title <- "" }
内容的提问来源于stack exchange,提问作者user16282253
相关产品推荐
相关产品推荐

