Plotly生成错误图表报非替换长度倍数警告 4年份正常5年份报错求助
问题原因
该问题属于plotly包转换ggplot sf对象动图的内置bug,根因是plotly内部处理frame参数对应的分组索引时,没有兼容frame唯一值数量与color分组水平数的乘积和内部临时向量长度不匹配的场景:你示例中cla因子共2个水平,当frame对应的年份唯一值为4时,24=8刚好匹配内部预设向量长度,因此运行正常;当年份唯一值变为5时,25=10与预设长度不匹配,就会抛出长度不匹配的警告、生成错误图表。
可行绕过方案
方案1:使用plotly原生接口绘制(最稳定)
完全跳过ggplot转plotly的环节,直接用plotly原生API生成sf动图,无兼容问题:
library(sf) library(plotly) library(dplyr) dat = data.frame(cla = factor(rep(LETTERS[1:2],10)), year = rep(c(2018:2022),4),x=runif(20, 1, 99),y = runif(20, 1, 99)) dat_sf = st_as_sf(dat, coords = c("x","y")) plot_ly(dat_sf, color = ~cla, frame = ~year, type = 'scatter', mode = 'markers', size = I(10))
方案2:显式指定ggplot分组参数
在ggplot的aes中新增group参数,强制对齐分组和frame的对应关系,修正plotly转换时的索引错误:
library(sf) library(plotly) library(ggplot2) library(dplyr) dat = data.frame(cla = factor(rep(LETTERS[1:2],10)), year = rep(c(2018:2022),4),x=runif(20, 1, 99),y = runif(20, 1, 99)) dat_sf = st_as_sf(dat, coords = c("x","y")) gg = dat_sf %>% ggplot(aes(color=cla, frame = year, group = interaction(cla, year))) + geom_sf(size=3) ggplotly(gg)
方案3:替换geom_sf为普通点图层
如果不需要用到sf的地理坐标系特性,提前提取坐标后用geom_point绘制,也可规避该bug:
library(plotly) library(ggplot2) library(dplyr) dat = data.frame(cla = factor(rep(LETTERS[1:2],10)), year = rep(c(2018:2022),4),x=runif(20, 1, 99),y = runif(20, 1, 99)) gg = dat %>% ggplot(aes(x=x,y=y,color=cla, frame = year)) + geom_point(size=3) ggplotly(gg)
内容的提问来源于stack exchange,提问作者sequoia
相关产品推荐
相关产品推荐

