ggplot2与plotly子图X轴同步缩放问题:shareX=True未生效如何解决?
可复现代码
请参考以下可复现示例:
# libraries library(ggplot2) library(plotly) # data set.seed(1) df <- data.frame(x = rnorm(100), y = rnorm(100)) # ggplots g1 <- g2 <- ggplotly(ggplot(df, aes(x, y)) + geom_point()) # set together subplot(g1, g2, shareX = TRUE, shareY = TRUE)
运行结果如下:
对其中一个图的Y轴进行缩放时,另一个图会同步更新;但对X轴缩放时,仅当前操作的图会发生变化。
问题详情
执行如下操作:
得到如下结果:
注意右侧图的X轴未发生变化。shareX = TRUE 未起到预期作用。
该如何解决此问题?
解决方法
这个问题源于ggplotly生成的对象默认保留独立X轴配置,subplot的shareX参数无法直接覆盖该设置,可通过以下两种方式解决:
方法1:统一plotly对象的X轴ID
先分别生成ggplot对象再转成plotly,手动修改第二个图的X轴ID使其与第一个一致,再组合子图:
library(ggplot2) library(plotly) set.seed(1) df <- data.frame(x = rnorm(100), y = rnorm(100)) # 分别创建独立的ggplot对象 p1 <- ggplot(df, aes(x, y)) + geom_point() p2 <- ggplot(df, aes(x, y)) + geom_point() # 转换为plotly对象并统一X轴ID g1 <- ggplotly(p1) g2 <- ggplotly(p2) g2$x$layout$xaxis$id <- g1$x$layout$xaxis$id # 组合子图并开启轴共享 subplot(g1, g2, shareX = TRUE, shareY = TRUE)
方法2:使用plotly原生API创建图形
绕过ggplotly的转换冲突,直接用plotly原生语法构建子图:
library(plotly) set.seed(1) df <- data.frame(x = rnorm(100), y = rnorm(100)) # 创建双轨迹图形,指定第二个轨迹的坐标轴 fig <- plot_ly(df, x = ~x, y = ~y, type = "scatter", mode = "markers", name = "图1") fig <- add_trace(fig, x = ~x, y = ~y, type = "scatter", mode = "markers", name = "图2", xaxis = "x2", yaxis = "y2") # 配置布局并开启轴共享 fig <- layout(fig, xaxis = list(domain = c(0, 0.45)), xaxis2 = list(domain = c(0.55, 1), anchor = "y2"), yaxis = list(domain = c(0, 1)), yaxis2 = list(domain = c(0, 1), anchor = "x2"), shareX = TRUE, shareY = TRUE ) fig
两种方法都能实现X轴缩放时两个图同步更新的效果。
内容的提问来源于stack exchange,提问作者Edo
相关产品推荐
相关产品推荐

