R语言For Loop+GGplot仅返回第19个绘图,前18个为Null的问题求助
问题原因与解决办法
核心原因
你的循环是从 i in 19:nrow(battersdf) 开始执行的,这意味着只有当i等于19、20……时,才会给plots[[i]]赋值。而plots列表的1到18位置从未被写入过内容,所以这些位置自然都是Null,只有循环覆盖到的plots[19]及之后的位置才有有效绘图。
修复方案
根据你的需求,有两种调整方式:
1. 处理所有球员,将绘图按顺序存入plots[1]、plots[2]……
直接修改循环的起始范围为1即可:
batters <- unique(data_all$Batter) battersdf <- data.frame(batters) plots <- list() for (i in 1:nrow(battersdf)) { hit_data <- subset(data_all, Batter == battersdf[i,1]) plots[[i]] <- ggplot()+ geom_path(data = hp, aes(x=x, y=y))+ coord_equal()+ # 注意:aes内直接用列名,不要加hit_data$ geom_point(data=hit_data, aes(x=ContactPositionZ, y=ContactPositionX, size = .5, color = PlayResult))+ labs(color = "Play Result", # 替换未定义的name为当前球员姓名 title = battersdf[i,1], subtitle = "Point of Contact (Sep 16 - Oct 2, 2022)")+ xlab("In/Out")+ ylab("Late/Out Front") print(plots[[i]]) }
2. 仅处理第19个及以后的球员,但将结果存入plots[1]、plots[2]……
新增一个计数器来控制列表的存储位置:
batters <- unique(data_all$Batter) battersdf <- data.frame(batters) plots <- list() counter <- 1 for (i in 19:nrow(battersdf)) { hit_data <- subset(data_all, Batter == battersdf[i,1]) plots[[counter]] <- ggplot()+ geom_path(data = hp, aes(x=x, y=y))+ coord_equal()+ geom_point(data=hit_data, aes(x=ContactPositionZ, y=ContactPositionX, size = .5, color = PlayResult))+ labs(color = "Play Result", title = battersdf[i,1], subtitle = "Point of Contact (Sep 16 - Oct 2, 2022)")+ xlab("In/Out")+ ylab("Late/Out Front") print(plots[[counter]]) counter <- counter + 1 }
额外注意点
- 原代码中
title = name里的name变量未定义,需替换为当前循环的球员姓名battersdf[i,1] - ggplot的
aes()函数内,不要用hit_data$列名的写法,直接写列名即可(已在上述代码中修正),避免潜在的环境绑定问题
内容的提问来源于stack exchange,提问作者jackmonty64
相关产品推荐
相关产品推荐

