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

使用R的ggplot2绘制忽略密度为0的篮球投篮2D核密度图

解决投篮密度图忽略密度为0点的问题

看起来你在绘制NBA投篮密度图时遇到了小麻烦——没法过滤掉密度为0的点,导致图里出现不必要的干扰元素对吧?我来帮你梳理下怎么解决这个问题。

问题分析

你当前的代码应该是直接把所有数据(包括密度=0的观测)都传入绘图流程了,这些无意义的点会干扰球场可视化的效果。核心解决思路就是先过滤掉密度值为0的行,再进行绘图。

修改后的完整代码示例

# LIBRARIES
library(grid)
library(jpeg)
library(RCurl)
library(ggplot2)
library(gridExtra)
library(viridis)

# 获取并处理篮球场背景图
courtImg.URL = "https://thedatagame.files.wordpress.com/2016/03/nba_court.jpg"
court = rasterGrob(readJPEG(getURLContent(courtImg.URL)), 
                   width = unit(1, "npc"), 
                   height = unit(1, "npc"))

# 假设你的投篮数据框名为shot_data,包含x(横坐标)、y(纵坐标)、density(投篮密度)列
# 第一步:过滤掉密度为0的行
filtered_data <- shot_data[shot_data$density != 0, ]

# 绘制投篮密度图
ggplot(filtered_data, aes(x = x, y = y, color = density)) +
  annotation_custom(court, xmin = -250, xmax = 250, ymin = -50, ymax = 420) + # 匹配球场坐标范围,可根据你的数据调整
  geom_point(size = 3) + # 若用热力图可替换为geom_tile/stat_density_2d等图层
  scale_color_viridis(option = "plasma") +
  theme_void() + # 移除默认坐标轴、网格等冗余元素
  coord_fixed(ratio = 1) # 保持球场的正确比例

关键细节说明

  • 数据过滤:用shot_data[shot_data$density != 0, ]精准筛选出有投篮密度的观测,确保只有有效数据被绘制。如果习惯用dplyr语法,也可以这么写:
    library(dplyr)
    filtered_data <- shot_data %>% filter(density != 0)
    
  • 背景对齐:annotation_custom里的x/y范围要和你的数据坐标匹配,否则球场和投篮点会出现位置错位。
  • 密度图层优化:如果是用核密度估计生成热力图,也可以直接在统计函数里设置阈值排除极低密度(接近0)的区域,示例如下:
    ggplot(shot_data, aes(x = x, y = y)) +
      annotation_custom(court, xmin = -250, xmax = 250, ymin = -50, ymax = 420) +
      stat_density_2d(aes(fill = stat(density)), geom = "tile", contour = FALSE, 
                      na.rm = TRUE, threshold = 0.001) + # 设置阈值过滤接近0的低密度区域
      scale_fill_viridis(option = "plasma") +
      theme_void() +
      coord_fixed(ratio = 1)
    

这样调整后,就能得到只显示有效投篮密度区域的可视化结果啦~

内容的提问来源于stack exchange,提问作者klassic123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:38:20