如何正确从R库nflplotR获取并使用球队Logo数据?
解决nflplotR球队Logo在可视化图表中无法显示的问题
问题核心错误分析
- 误用
ggimage的geom_image,未使用nflplotR专为NFL球队设计的geom_nfl_logos,后者无需手动管理Logo资源 logo_placement_data中坐标列名为a和b,但代码中错误映射为x=x、y=y,导致坐标匹配失败- 多余的
inner_join(logos)操作,nflplotR内置所有NFL球队的Logo与缩写映射,无需手动导入外部Logo数据集 - 未定义的
grey变量,直接使用字符串"grey"即可避免报错
修正后的完整代码
library(nflfastR) library(nflplotR) library(tidyverse) library(gghighcontrast) library(scales) library(ggthemes) plot_for_data <- function(data, foreground_color, background_color) { single_game_id <- data[1, ]$game_id game_title_pieces <- strsplit(single_game_id, "_")[[1]] game_year <- game_title_pieces[1] game_week <- game_title_pieces[2] home_team_abbr <- data[1, ]$home_team away_team_abbr <- data[1, ]$away_team # 构建Logo位置数据,无需关联外部logos数据集 logo_placement_data <- data.frame( x = c(3600, 3600), y = c(0.875, 0.125), team_abbr = c(home_team_abbr, away_team_abbr), stringsAsFactors = FALSE ) plot <- ggplot(data, aes(x = game_seconds_remaining, y = home_wp_custom)) + # 50%参考线 geom_hline(yintercept = 0.5, color = "grey", size = 1) + # 各节参考线 geom_vline(xintercept = 15 * 60, color = "grey") + geom_vline(xintercept = 30 * 60, color = "grey") + geom_vline(xintercept = 45 * 60, color = "grey") + # 节次标注 annotate( "text", x = 58 * 60, y = 0.95, label = "Q1", family = "InputMono", color = "grey", size = 2 ) + annotate( "text", x = 43 * 60, y = 0.95, label = "Q2", family = "InputMono", color = "grey", size = 2 ) + annotate( "text", x = 28 * 60, y = 0.95, label = "Q3", family = "InputMono", color = "grey", size = 2 ) + annotate( "text", x = 13 * 60, y = 0.95, label = "Q4", family = "InputMono", color = "grey", size = 2 ) + # 获胜概率曲线 geom_line(aes(y = home_wp_post), color = "grey") + geom_line(size = 0.8) + # 得分事件标记 geom_rug( data = filter(data, away_scoring_play == 1), color = foreground_color, sides = "b", size = 1.5 ) + geom_rug( data = filter(data, home_scoring_play == 1), color = foreground_color, sides = "t", size = 1.5 ) + # 使用nflplotR专属函数绘制球队Logo geom_nfl_logos(data = logo_placement_data, aes(x = x, y = y, team_abbr = team_abbr), width = 0.08) + # 图表格式设置 scale_x_reverse() + scale_y_continuous(labels = percent, limits = c(0, 1)) + theme_high_contrast( base_family = "InputMono", background_color = background_color, foreground_color = foreground_color ) + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank()) + labs( title = str_interp( "${game_year} Week ${game_week}: ${away_team_abbr} at ${home_team_abbr}" ), subtitle = "Custom win probability model compared to nflfastR WP (grey)", caption = "Data from nflfastR", x = "Quarters", y = "Home Win Probability" ) } for (single_game_id in game_ids) { plot <- plot_for_data( filter(pbp_data, game_id == single_game_id), foreground_color, background_color ) ggsave( str_interp("wp-${single_game_id}.png"), plot = plot, width = 6, height = 4 ) }
关键修改说明
- 移除冗余参数:删除函数的
logos参数,无需手动传入Logo数据集 - 替换Logo绘制函数:用
geom_nfl_logos替代geom_image,直接通过球队缩写team_abbr自动匹配对应Logo - 修正坐标映射:将
logo_placement_data中的坐标列直接命名为x和y,避免映射错误 - 删除无效操作:去掉多余的
inner_join(logos),nflplotR会自动处理Logo资源 - 修复颜色变量:将未定义的
grey改为字符串"grey",避免变量未找到错误
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

