如何在R语言中基于分区百分比向量制作自定义棒球落点分布图
基于区域百分比的R语言自定义棒球落点分布图函数
以下是一个无需(x,y)坐标、仅使用区域百分比数据生成棒球落点分布图的R函数。函数会将你的百分比数据映射到预定义的棒球场地区域,并根据数值大小填充对应颜色:<5%为白色,5%-19%为浅绿色,≥20%为深绿色。
create_spray_chart <- function(percentages) { # 检查并加载ggplot2包 if (!requireNamespace("ggplot2", quietly = TRUE)) { stop("需要安装ggplot2包,请运行 install.packages('ggplot2')") } library(ggplot2) # 定义棒球场地各区域的多边形坐标(可根据需求调整坐标优化布局) field_regions <- data.frame( region = rep(c("P", "C", "3B", "SS", "2B", "1B", "LF", "LFTCENTER", "CF", "UPTHEMIDDLE", "RGHTCENTER", "RF"), each = 4), x = c( -1, -1, 1, 1, # 投手区(P) -2, -2, 2, 2, # 捕手区(C) -10, -5, -3, -8, # 三垒区(3B) -5, -1, 1, -3, # 游击区(SS) 1, 5, 8, 3, # 二垒区(2B) 5, 10, 8, 3, # 一垒区(1B) -20, -12, -7, -15, # 左外野(LF) -12, -7, 0, -5, # 左中外野(LFTCENTER) -7, 0, 7, -5, # 中外野(CF) 0, 7, 7, 0, # 中野中路(UPTHEMIDDLE) 7, 12, 15, 7, # 右中外野(RGHTCENTER) 12, 20, 15, 7 # 右外野(RF) ), y = c( 9, 11, 11, 9, # 投手区(P) -1, 1, 1, -1, # 捕手区(C) 4, 7, 5, 2, # 三垒区(3B) 7, 9, 7, 5, # 游击区(SS) 9, 7, 5, 7, # 二垒区(2B) 7, 4, 2, 5, # 一垒区(1B) 10, 15, 20, 15, # 左外野(LF) 15, 20, 15, 10, # 左中外野(LFTCENTER) 20, 25, 20, 15, # 中外野(CF) 20, 15, 10, 15, # 中野中路(UPTHEMIDDLE) 15, 10, 15, 20, # 右中外野(RGHTCENTER) 10, 10, 15, 15 # 右外野(RF) ) ) # 将输入的百分比向量转换为数据框 data_df <- data.frame( region = names(percentages), percentage = as.numeric(percentages) ) # 合并区域坐标与百分比数据 plot_data <- merge(field_regions, data_df, by = "region") # 计算每个区域的中心点坐标(用于显示百分比标签) centroids <- plot_data %>% group_by(region) %>% summarize( centroid_x = mean(x), centroid_y = mean(y), percentage = first(percentage) ) # 生成可视化图表 p <- ggplot(plot_data, aes(x = x, y = y, group = region)) + geom_polygon(aes(fill = percentage), color = "black", linewidth = 0.5) + scale_fill_gradient2( low = "white", mid = "lightgreen", high = "darkgreen", midpoint = 10, limits = c(0, 20), breaks = c(0, 5, 10, 15, 20), labels = c("0%", "5%", "10%", "15%", "20%"), guide = guide_colorbar(title = "百分比") ) + geom_text(data = centroids, aes(x = centroid_x, y = centroid_y, label = paste0(percentage, "%")), size = 4, fontface = "bold") + coord_equal() + theme_void() + labs(title = "棒球落点分布图:各区域击球百分比") return(p) }
使用示例
将你的示例数据传入函数即可生成图表:
# 示例百分比数据 example_data <- c( RF = 9, CF = 6, LF =9, 3B=9, SS=6, 2B=19, 1B=3, C=3, P=9, LFTCENTER=9, UPTHEMIDDLE=3, RGHTCENTER=12 ) # 生成并显示图表 spray_chart <- create_spray_chart(example_data) print(spray_chart)
自定义说明
- 调整场地布局:可以修改
field_regions中的x和y坐标,让各区域的形状和位置更符合你需要的样式。 - 修改颜色规则:调整
scale_fill_gradient2中的low、mid、high参数,或改用scale_fill_steps实现离散颜色分档(比如严格按<5%、5%-10%、≥10%划分)。 - 调整标签样式:修改
geom_text中的size、fontface等参数,优化百分比标签的显示效果。
内容的提问来源于stack exchange,提问作者zieiz
相关产品推荐
相关产品推荐

