R使用gganimate绘制动画报differing number of rows错误问询
问题原因
报错核心是不同frameId对应的观测行数不一致,gganimate的transition_states在做帧间过渡时,默认需要每个状态(也就是每个frameId)的待渲染对象数量匹配,否则就会抛出行数不匹配的错误。
你测试frameId≤30时无报错,说明前30帧的每个帧观测数是一致的,而frameId≥31的部分出现了观测数增减:比如某帧有球员离场/新增入场、球的记录缺失/重复,都会导致单帧行数变化。
另外你当前的ggplot代码没有显式指定group映射,gganimate无法识别哪些点属于同一个移动对象(比如同一个球员的不同帧),也会加剧匹配混乱,触发行数报错。
修复方案
第一步:先确认数据问题
运行下面的代码统计每个frameId的行数,确认是否存在行数不一致的情况:
# 查看每个frame对应的行数 tuckdf %>% count(frameId, name = "per_frame_rows") %>% distinct(per_frame_rows)
如果输出结果超过1个值,直接证明就是不同帧行数不一致导致的问题。
第二步:两种修复方案可选
方案1:补全所有帧的观测(推荐)
用tidyr::complete补全每个frameId下的所有对象,缺失的坐标等值设为NA即可,gganimate会自动跳过NA值的渲染,不会影响动画效果:
# 用队缩写+球衣号作为唯一球员标识补全所有帧 tuckdf_clean <- tuckdf %>% complete(frameId, nesting(t_abbr, jerseyNumber), fill = list(x = NA_real_, y = NA_real_, s = NA_real_, o = NA_real_))
之后把ggplot的输入数据换成tuckdf_clean即可。
方案2:显式指定group映射
如果不需要补全数据,可以在ggplot的全局aes里添加group参数,用唯一标识区分每个移动对象,让gganimate可以正确匹配不同帧的同一个对象:
# 修改ggplot的aes部分,增加group映射 animar <- ggplot(tuckdf, aes(x, y, colour=t_abbr, group = interaction(t_abbr, jerseyNumber))) + # 剩下的代码保持不变
可选优化
如果你的frameId是连续递增的整数,更推荐用transition_time(frameId)替代transition_states,更适配时序类动画的渲染逻辑,也能减少过渡匹配的错误。
内容的提问来源于stack exchange,提问作者lowlyprogrammer
相关产品推荐
相关产品推荐

