ggplotly中facet_wrap的x轴droplines仅显示于首个分面,是Bug吗?
问题解析与解决方案
这其实不是操作有误,也不算严格意义上的bug,而是ggplotly分面后的轴命名规则导致的小细节坑!
当你用ggplot2的facet_wrap()创建多个分面后,ggplotly会为每个分面的坐标轴分配独立的标识ID:第一个分面的x轴是xaxis,第二个是xaxis2,第三个是xaxis3,以此类推。你之前只设置了xaxis的showspikes = T,自然只有第一个分面会显示垂直线啦。
针对固定分面数量的解决方案
如果你的分面数量是固定的(比如示例里的3个物种),可以直接在layout()里逐个指定每个x轴的参数:
library(plotly) library(ggplot2) gg <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, group = Petal.Width, text=sprintf("Petal Width %s<br>Sepal Length: %s", Petal.Width, Sepal.Length) )) + geom_point() + facet_wrap(~Species) ggplotly(gg, tooltip = "text") %>% layout( xaxis = list(showspikes = TRUE), xaxis2 = list(showspikes = TRUE), xaxis3 = list(showspikes = TRUE) )
针对动态分面数量的通用解决方案
如果分面数量是动态生成的(比如根据数据自动变化),可以用批量生成参数的方式来避免重复代码:
library(plotly) library(ggplot2) gg <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, group = Petal.Width, text=sprintf("Petal Width %s<br>Sepal Length: %s", Petal.Width, Sepal.Length) )) + geom_point() + facet_wrap(~Species) # 获取分面的总数量 facet_total <- length(unique(iris$Species)) # 批量生成所有x轴的设置 axis_list <- lapply(1:facet_total, function(idx) { axis_id <- ifelse(idx == 1, "xaxis", paste0("xaxis", idx)) list(showspikes = TRUE) }) names(axis_list) <- ifelse(1:facet_total == 1, "xaxis", paste0("xaxis", 2:facet_total)) # 用!!!符号批量传入layout参数 ggplotly(gg, tooltip = "text") %>% layout(!!!axis_list)
这样不管你的分面有几个,所有子图的x轴都会显示垂直线啦。
内容的提问来源于stack exchange,提问作者Gordon McDonald
相关产品推荐
相关产品推荐

