You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:15:39